X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fnasal%2Fcode.c;h=5f94217f45d403c769a5f898294994587f3fc99b;hb=ac2e80dc07a122923e52e4a0a05369e326847bb7;hp=bac8b92bd900c9ea7fcd4da99d3f9b0351416601;hpb=bb82b9d168239dd4dc0ab93b338143a25ed5ef51;p=simgear.git diff --git a/simgear/nasal/code.c b/simgear/nasal/code.c index bac8b92b..5f94217f 100644 --- a/simgear/nasal/code.c +++ b/simgear/nasal/code.c @@ -874,8 +874,10 @@ naRef naCall(naContext ctx, naRef func, int argc, naRef* args, } if(IS_CCODE(PTR(func).func->code)) { - naCFunction fp = PTR(PTR(func).func->code).ccode->fptr; - result = (*fp)(ctx, obj, argc, args); + struct naCCode *ccode = PTR(PTR(func).func->code).ccode; + result = ccode->fptru + ? (*ccode->fptru)(ctx, obj, argc, args, ccode->user_data) + : (*ccode->fptr) (ctx, obj, argc, args); if(!ctx->callParent) naModUnlock(); return result; } @@ -936,3 +938,52 @@ naRef naContinue(naContext ctx) if(!ctx->callParent) naModUnlock(); return result; } + +static void logError(naContext ctx) +{ + 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 < stack_depth; ++i ) + printf( " called from: %s, line %d", + naStr_data(naGetSourceFile(ctx, i)), + naGetLine(ctx, i)); +} + +static naErrorHandler error_handler = &logError; +naErrorHandler naSetErrorHandler(naErrorHandler cb) +{ + naErrorHandler old_handler = error_handler; + error_handler = cb; + return old_handler; +} + +static int call_count = 0; +naRef naCallMethodCtx( naContext ctx, + naRef code, + naRef self, + int argc, + naRef* args, + naRef locals ) +{ + naRef result; + if(call_count) naModUnlock(); + call_count++; + result = naCall(ctx, code, argc, args, self, locals); + if(naGetError(ctx) && error_handler) + error_handler(ctx); + call_count--; + if(call_count) naModLock(); + return result; +} + +naRef naCallMethod(naRef code, naRef self, int argc, naRef* args, naRef locals) +{ + naContext ctx = naNewContext(); + naRef result = naCallMethodCtx(ctx, code, self, argc, args, locals); + naFreeContext(ctx); + return result; +}