JSValue
qjs_call_exit_hook(JSContext *ctx)
{
- JSValue global, obj, ret;
+ JSValue global, obj, hook, ret;
qjs_njs_t *njs;
global = JS_GetGlobalObject(ctx);
njs = JS_GetOpaque(obj, QJS_CORE_CLASS_ID_NJS);
if (njs != NULL && JS_IsFunction(ctx, njs->hooks[QJS_NJS_HOOK_EXIT])) {
- ret = JS_Call(ctx, njs->hooks[QJS_NJS_HOOK_EXIT], JS_UNDEFINED,
- 0, NULL);
-
- JS_FreeValue(ctx, njs->hooks[QJS_NJS_HOOK_EXIT]);
+ hook = njs->hooks[QJS_NJS_HOOK_EXIT];
njs->hooks[QJS_NJS_HOOK_EXIT] = JS_UNDEFINED;
+ ret = JS_Call(ctx, hook, JS_UNDEFINED, 0, NULL);
+
+ JS_FreeValue(ctx, hook);
+
if (JS_IsException(ret)) {
JS_FreeValue(ctx, obj);
JS_FreeValue(ctx, global);
--- /dev/null
+/*---
+includes: []
+flags: []
+---*/
+
+if (typeof njs == 'object' && typeof njs.on == 'function') {
+ (function() {
+ let o = {v: 'x'};
+
+ njs.on('exit', function() {
+ njs.on('exit', null);
+
+ let a = [];
+
+ for (let i = 0; i < 100; i++) {
+ a.push({i});
+ }
+
+ if (o.v !== 'x') {
+ throw Error('closure is lost');
+ }
+ });
+ })();
+}