Ensure lazy evaluation of DRC rules works on all compilers.

This commit is contained in:
Jeff Young 2023-08-21 13:05:16 +01:00
parent 2d8b707a3a
commit 3a40b59cd3
1 changed files with 15 additions and 15 deletions

View File

@ -1126,12 +1126,12 @@ void UOP::Exec( CONTEXT* ctx )
break; break;
} }
#define AS_DOUBLE( arg ) ( arg ? arg->AsDouble() : 0.0 )
if( m_op & TR_OP_BINARY_MASK ) if( m_op & TR_OP_BINARY_MASK )
{ {
LIBEVAL::VALUE* arg2 = ctx->Pop(); LIBEVAL::VALUE* arg2 = ctx->Pop();
LIBEVAL::VALUE* arg1 = ctx->Pop(); LIBEVAL::VALUE* arg1 = ctx->Pop();
double arg2Value = arg2 ? arg2->AsDouble() : 0.0;
double arg1Value = arg1 ? arg1->AsDouble() : 0.0;
double result; double result;
if( ctx->HasErrorCallback() ) if( ctx->HasErrorCallback() )
@ -1153,28 +1153,28 @@ void UOP::Exec( CONTEXT* ctx )
switch( m_op ) switch( m_op )
{ {
case TR_OP_ADD: case TR_OP_ADD:
result = arg1Value + arg2Value; result = AS_DOUBLE( arg1 ) + AS_DOUBLE( arg2 );
break; break;
case TR_OP_SUB: case TR_OP_SUB:
result = arg1Value - arg2Value; result = AS_DOUBLE( arg1 ) - AS_DOUBLE( arg2 );
break; break;
case TR_OP_MUL: case TR_OP_MUL:
result = arg1Value * arg2Value; result = AS_DOUBLE( arg1 ) * AS_DOUBLE( arg2 );
break; break;
case TR_OP_DIV: case TR_OP_DIV:
result = arg1Value / arg2Value; result = AS_DOUBLE( arg1 ) / AS_DOUBLE( arg2 );
break; break;
case TR_OP_LESS_EQUAL: case TR_OP_LESS_EQUAL:
result = arg1Value <= arg2Value ? 1 : 0; result = AS_DOUBLE( arg1 ) <= AS_DOUBLE( arg2 ) ? 1 : 0;
break; break;
case TR_OP_GREATER_EQUAL: case TR_OP_GREATER_EQUAL:
result = arg1Value >= arg2Value ? 1 : 0; result = AS_DOUBLE( arg1 ) >= AS_DOUBLE( arg2 ) ? 1 : 0;
break; break;
case TR_OP_LESS: case TR_OP_LESS:
result = arg1Value < arg2Value ? 1 : 0; result = AS_DOUBLE( arg1 ) < AS_DOUBLE( arg2 ) ? 1 : 0;
break; break;
case TR_OP_GREATER: case TR_OP_GREATER:
result = arg1Value > arg2Value ? 1 : 0; result = AS_DOUBLE( arg1 ) > AS_DOUBLE( arg2 ) ? 1 : 0;
break; break;
case TR_OP_EQUAL: case TR_OP_EQUAL:
if( !arg1 || !arg2 ) if( !arg1 || !arg2 )
@ -1193,10 +1193,10 @@ void UOP::Exec( CONTEXT* ctx )
result = arg1->NotEqualTo( ctx, arg2 ) ? 1 : 0; result = arg1->NotEqualTo( ctx, arg2 ) ? 1 : 0;
break; break;
case TR_OP_BOOL_AND: case TR_OP_BOOL_AND:
result = arg1Value != 0.0 && arg2Value != 0.0 ? 1 : 0; result = AS_DOUBLE( arg1 ) != 0.0 && AS_DOUBLE( arg2 ) != 0.0 ? 1 : 0;
break; break;
case TR_OP_BOOL_OR: case TR_OP_BOOL_OR:
result = arg1Value != 0.0 || arg2Value != 0.0 ? 1 : 0; result = AS_DOUBLE( arg1 ) != 0.0 || AS_DOUBLE( arg2 ) != 0.0 ? 1 : 0;
break; break;
default: default:
result = 0.0; result = 0.0;
@ -1211,16 +1211,16 @@ void UOP::Exec( CONTEXT* ctx )
else if( m_op & TR_OP_UNARY_MASK ) else if( m_op & TR_OP_UNARY_MASK )
{ {
LIBEVAL::VALUE* arg1 = ctx->Pop(); LIBEVAL::VALUE* arg1 = ctx->Pop();
double arg1Value = arg1 ? arg1->AsDouble() : 0.0; double ARG1VALUE = arg1 ? arg1->AsDouble() : 0.0;
double result; double result;
switch( m_op ) switch( m_op )
{ {
case TR_OP_BOOL_NOT: case TR_OP_BOOL_NOT:
result = arg1Value != 0.0 ? 0 : 1; result = ARG1VALUE != 0.0 ? 0 : 1;
break; break;
default: default:
result = arg1Value != 0.0 ? 1 : 0; result = ARG1VALUE != 0.0 ? 1 : 0;
break; break;
} }