void DLLCALL js_EvalOnExit(JSContext *cx, JSObject *obj, js_callback_t* cb) { char* p; jsval rval; JSObject* script; BOOL auto_terminate=cb->auto_terminate; JSObject *glob=JS_GetGlobalObject(cx); global_private_t *pt; str_list_t list; if(glob==obj) { pt=(global_private_t *)JS_GetPrivate(cx,JS_GetGlobalObject(cx)); list=pt->exit_func; } else list=JS_GetPrivate(cx,obj); cb->auto_terminate=FALSE; while((p=strListPop(&list))!=NULL) { if((script=JS_CompileScript(cx, obj, p, strlen(p), NULL, 0))!=NULL) { JS_ExecuteScript(cx, obj, script, &rval); } free(p); } strListFree(&list); if(glob != obj) JS_SetPrivate(cx,obj,NULL); else pt->exit_func=NULL; if(auto_terminate) cb->auto_terminate = TRUE; }
void DLLCALL js_EvalOnExit(JSContext *cx, JSObject *obj, js_branch_t* branch) { char* p; jsval rval; JSScript* script; while((p=strListPop(&branch->exit_func))!=NULL) { if((script=JS_CompileScript(cx, obj, p, strlen(p), NULL, 0))!=NULL) { JS_ExecuteScript(cx, obj, script, &rval); JS_DestroyScript(cx, script); } } strListFree(&branch->exit_func); }