X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fnasal%2Fcode.c;h=2bf46451d8501223ed99e2ea97aa1ceb4786b09c;hb=f41b18f0649a50e179ba41383f4061e1878c4d4c;hp=d1da92a3ef62f4ebb8c51b3f13044b38a5ac1676;hpb=8ca8052a8d7653f28ac376b4d7dce5f85b903be4;p=simgear.git diff --git a/simgear/nasal/code.c b/simgear/nasal/code.c index d1da92a3..2bf46451 100644 --- a/simgear/nasal/code.c +++ b/simgear/nasal/code.c @@ -71,7 +71,9 @@ static double numify(naContext ctx, naRef o) else if(IS_NIL(o)) ERR(ctx, "nil used in numeric context"); else if(!IS_STR(o)) ERR(ctx, "non-scalar in numeric context"); else if(naStr_tonum(o, &n)) return n; - else ERR(ctx, "non-numeric string in numeric context"); + else naRuntimeError( ctx, + "non-numeric string in numeric context: '%s'", + naStr_data(o) ); return 0; } @@ -592,6 +594,9 @@ static naRef run(naContext ctx) case OP_LTE: BINOP(l <= r ? 1 : 0); break; case OP_GT: BINOP(l > r ? 1 : 0); break; case OP_GTE: BINOP(l >= r ? 1 : 0); break; + case OP_BIT_AND: BINOP((int)l & (int)r); break; + case OP_BIT_OR: BINOP((int)l | (int)r); break; + case OP_BIT_XOR: BINOP((int)l ^ (int)r); break; #undef BINOP case OP_EQ: case OP_NEQ: @@ -605,6 +610,9 @@ static naRef run(naContext ctx) case OP_NEG: STK(1) = naNum(-numify(ctx, STK(1))); break; + case OP_BIT_NEG: + STK(1) = naNum(~(int)numify(ctx, STK(1))); + break; case OP_NOT: STK(1) = naNum(boolify(ctx, STK(1)) ? 0 : 1); break; @@ -941,12 +949,13 @@ naRef naContinue(naContext ctx) static void logError(naContext ctx) { - int i; - printf("logError\n"); + int i, stack_depth = naStackDepth(ctx); printf("Nasal runtime error: %s\n", naGetError(ctx)); + if( stack_depth < 1 ) + return; printf(" at %s\n", naStr_data(naGetSourceFile(ctx, 0))); printf(", line %d\n", naGetLine(ctx, 0)); - for(i = 1; i < naStackDepth(ctx); ++i ) + for(i = 1; i < stack_depth; ++i ) printf( " called from: %s, line %d", naStr_data(naGetSourceFile(ctx, i)), naGetLine(ctx, i));