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;
}
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:
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;
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));