diff --git a/microscript/ILibDuktape_Helpers.c b/microscript/ILibDuktape_Helpers.c index d676f8a..b8e584a 100644 --- a/microscript/ILibDuktape_Helpers.c +++ b/microscript/ILibDuktape_Helpers.c @@ -709,9 +709,21 @@ ILibDuktape_ContextData* ILibDuktape_GetContextData(duk_context *ctx) void Duktape_SafeDestroyHeap(duk_context *ctx) { + void *process = ILibDuktape_GetProcessObject(ctx); ILibDuktape_ContextData *ctxd = duk_ctx_context_data(ctx); - ctxd->flags |= duk_destroy_heap_in_progress; + + if (process != NULL) + { + duk_idx_t top = duk_get_top(ctx); + duk_push_heapptr(ctx, process); // [process] + int exitCode = Duktape_GetIntPropertyValue(ctx, -1, ILibDuktape_Process_ExitCode, 0); + ILibDuktape_EventEmitter_SetupEmit(ctx, duk_get_heapptr(ctx, -1), "exit"); // [emit][this]['exit'] + duk_push_int(ctx, exitCode); // [emit][this]['exit'][exitCode] + duk_pcall_method(ctx, 2); + duk_set_top(ctx, top); + } + duk_destroy_heap(ctx); if (ILibLinkedList_GetCount(ctxd->threads) > 0) diff --git a/microscript/ILibDuktape_ScriptContainer.c b/microscript/ILibDuktape_ScriptContainer.c index e43e4e1..ede58ab 100644 --- a/microscript/ILibDuktape_ScriptContainer.c +++ b/microscript/ILibDuktape_ScriptContainer.c @@ -599,20 +599,9 @@ duk_ret_t ILibDuktape_ScriptContainer_Process_env(duk_context *ctx) duk_ret_t ILibDuktape_ScriptContainer_Process_Finalizer(duk_context *ctx) { // We need to dispatch the 'exit' event - int exitCode = 0; duk_push_this(ctx); // [process] ILibChain_Link *link = (ILibChain_Link*)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ScriptContainer_Signal_ListenerPtr); - if (duk_has_prop_string(ctx, -1, "\xFF_ExitCode")) - { - duk_get_prop_string(ctx, -1, "\xFF_ExitCode"); // [process][exitCode] - exitCode = duk_get_int(ctx, -1); - duk_pop(ctx); // [process] - } - ILibDuktape_EventEmitter_SetupEmit(ctx, duk_get_heapptr(ctx, -1), "exit"); // [emit][this]['exit'] - duk_push_int(ctx, exitCode); // [emit][this]['exit'][exitCode] - duk_call_method(ctx, 2); - #ifdef _POSIX struct sigaction action; @@ -1165,6 +1154,12 @@ duk_ret_t ILibDuktape_ScriptContainer_removeListenerSink(duk_context *ctx) return(0); } +duk_ret_t ILibDuktape_Process_Exitting(duk_context *ctx) +{ + duk_push_boolean(ctx, (duk_bool_t)duk_ctx_shutting_down(ctx)); + return(1); +} + void ILibDuktape_ScriptContainer_Process_Init(duk_context *ctx, char **argList) { int i = 0; @@ -1338,6 +1333,7 @@ void ILibDuktape_ScriptContainer_Process_Init(duk_context *ctx, char **argList) ILibDuktape_EventEmitter_AddHook(emitter, "SIGTERM", ILibDuktape_ScriptContainer_Process_SIGTERM_Hook); ILibDuktape_EventEmitter_AddHook(emitter, "SIGCHLD", ILibDuktape_ScriptContainer_Process_SIGCHLD_Hook); ILibDuktape_EventEmitter_AddOnEx(ctx, -1, "removeListener", ILibDuktape_ScriptContainer_removeListenerSink); + ILibDuktape_CreateEventWithGetter(ctx, "exitting", ILibDuktape_Process_Exitting); ILibDuktape_CreateEventWithGetter(ctx, "argv0", ILibDuktape_ScriptContainer_Process_Argv0); duk_push_int(ctx, 1);