diff --git a/src/sbbs3/js_internal.c b/src/sbbs3/js_internal.c index 6dc45673037a72d4bbf18b30c01b07f96d0042b4..33528697a4f4e259ecb90d6a6c1056c40662dd95 100644 --- a/src/sbbs3/js_internal.c +++ b/src/sbbs3/js_internal.c @@ -372,17 +372,17 @@ js_report_error(JSContext *cx, uintN argc, jsval *arglist) static JSBool js_on_exit(JSContext *cx, uintN argc, jsval *arglist) { - JSObject *thisobj=JS_THIS_OBJECT(cx, arglist); - JSObject *parent=JS_GetParent(cx,thisobj); + JSObject *scope=JS_GetScopeChain(cx); JSObject *glob=JS_GetGlobalObject(cx); jsval *argv=JS_ARGV(cx, arglist); global_private_t* pd; str_list_t list; + str_list_t oldlist; char *p; JS_SET_RVAL(cx, arglist, JSVAL_VOID); - if(glob==parent) { + if(glob==scope) { if((pd=(global_private_t*)JS_GetPrivate(cx,glob))==NULL) return(JS_FALSE); if(pd->exit_func==NULL) @@ -390,15 +390,19 @@ js_on_exit(JSContext *cx, uintN argc, jsval *arglist) list=pd->exit_func; } else { - list=(str_list_t)JS_GetPrivate(cx,parent); + list=(str_list_t)JS_GetPrivate(cx,scope); if(list==NULL) { list=strListInit(); - JS_SetPrivate(cx,parent,list); + JS_SetPrivate(cx,scope,list); } } JSVALUE_TO_STRING(cx, argv[0], p, NULL); strListPush(&list,p); + if(glob==scope) + pd->exit_func=list; + else + JS_SetPrivate(cx,scope,list); return(JS_TRUE); } @@ -506,6 +510,10 @@ void DLLCALL js_EvalOnExit(JSContext *cx, JSObject *obj, js_callback_t* cb) } strListFree(&list); + if(glob != obj) + JS_SetPrivate(cx,obj,NULL); + else + pt->exit_func=NULL; if(auto_terminate) cb->auto_terminate = TRUE;