bug detectado, cambios en el svn.
- fix crash with use of ternary operator in some conditions.
- add NOP mnemonic
el bug afecta a todos los productos derivados (incluso fenix) (no podemos ser menos que Intel, asi que teniamos que detectar un bug viejo)
el tema esta cuando se tiene una expresion con una suma o resta y luego un operador ternario, aca pongo unos ejemplos, y una nota cuales crashean.
res = ( var2 != 3 ) ? 5 : 2 ;
res = var1 + ( ( 1 != 3 ) ? 5 : 2 );
res = var1 * ( ( var2 != 3 ) ? 5 : 2 );
res = ( ( var2 != 3 ) ? 5 : 2 ) + var1;
res = var1 + ( ( var2 != 3 ) ? 5 : 2 ); // crash
res = var1 + ( ( var2 != 3 ) ? var4 : var3 );
res = var1 + ( ( var2 != 3 ) ? 1 : var3 );
res = var1 + ( ( var2 != 3 ) ? var3 : 1 ); // crash
res = var1 + ( ( var2 != 3 ) ? 1 : ( ( var2 != 3 ) ? 1 : var3 ) );
la condicion del error es cuando se cumple la condicion y el elemento else es un valor constante.
el compilador estaba haciendo una optimizacion que no correspondia.
ejemplo de test completo
PROGRAM crash;
#if __BGD__ == 2
import "mod_misc";
#else
import "mod_say";
#endif
PRIVATE
int var1 = 100;
int var2 = 1;
int var3 = 99;
int var4 = 66;
int res;
BEGIN
// res = ( var2 != 3 ) ? 5 : 2 ;
// res = var1 + ( ( 1 != 3 ) ? 5 : 2 );
// res = var1 * ( ( var2 != 3 ) ? 5 : 2 );
// res = ( ( var2 != 3 ) ? 5 : 2 ) + var1;
res = var1 + ( ( var2 != 3 ) ? 5 : 2 ); // crash
// res = var1 + ( ( var2 != 3 ) ? var4 : var3 );
// res = var1 + ( ( var2 != 3 ) ? 1 : var3 );
res = var1 + ( ( var2 != 3 ) ? var3 : 1 ); // crash
// res = var1 + ( ( var2 != 3 ) ? 1 : ( ( var2 != 3 ) ? 1 : var3 ) );
say(res);
end