diff --git a/microscript/ILibDuktape_ChildProcess.c b/microscript/ILibDuktape_ChildProcess.c index e43efe3..d4113dd 100644 --- a/microscript/ILibDuktape_ChildProcess.c +++ b/microscript/ILibDuktape_ChildProcess.c @@ -387,6 +387,36 @@ duk_ret_t ILibDuktape_SpawnedProcess_SIGCHLD_sink(duk_context *ctx) return(0); } #endif + +void ILibDuktape_SpawnedProcess_exitHandler_immediateSink(duk_context *ctx, void ** args, int argsLen) +{ + duk_push_this(ctx); // [immediate] + duk_get_prop_string(ctx, -1, "process"); // [immediate][spawnedProcess] + duk_del_prop_string(ctx, -2, "process"); + if (duk_has_prop_string(ctx, -1, "stdout")) + { + duk_get_prop_string(ctx, -1, "stdout"); // [immediate][spawnedProcess][stdout] + duk_prepare_method_call(ctx, -1, "removeAllListeners"); // [immediate][spawnedProcess][stdout][removeAll][this] + duk_pcall_method(ctx, 0); duk_pop_2(ctx); // [immediate][spawnedProcess] + } + if (duk_has_prop_string(ctx, -1, "stderr")) + { + duk_get_prop_string(ctx, -1, "stderr"); // [immediate][spawnedProcess][stderr] + duk_prepare_method_call(ctx, -1, "removeAllListeners"); // [immediate][spawnedProcess][stderr][removeAll][this] + duk_pcall_method(ctx, 0); duk_pop_2(ctx); // [immediate][spawnedProcess] + } + duk_prepare_method_call(ctx, -1, "removeAllListeners"); // [immediate][spawnedProcess][removeAll][this] + duk_pcall_method(ctx, 0); duk_pop_3(ctx); // ... +} +duk_ret_t ILibDuktape_SpawnedProcess_exitHandler(duk_context *ctx) +{ + void *i = ILibDuktape_Immediate(ctx, (void*[]) { ctx }, 1, ILibDuktape_SpawnedProcess_exitHandler_immediateSink); + duk_push_heapptr(ctx, i); // [immediate] + duk_push_this(ctx); // [immediate][spawnedProcess] + duk_put_prop_string(ctx, -2, "process"); // [immediate] + duk_pop(ctx); // ... + return(0); +} ILibDuktape_ChildProcess_SubProcess* ILibDuktape_ChildProcess_SpawnedProcess_PUSH(duk_context *ctx, ILibProcessPipe_Process mProcess, void *callback) { duk_push_object(ctx); // [ChildProcess] @@ -449,11 +479,6 @@ ILibDuktape_ChildProcess_SubProcess* ILibDuktape_ChildProcess_SpawnedProcess_PUS ILibDuktape_ChildProcess_SubProcess_StdErrHandler, ILibDuktape_ChildProcess_SubProcess_SendOK, retVal); } - else - { - if (callback != NULL) { ILibDuktape_EventEmitter_AddOnce(emitter, "exit", callback); } - } - #if defined(_POSIX) ILibDuktape_EventEmitter_SetupOn(ctx, ILibDuktape_GetProcessObject(ctx), "SIGCHLD"); // [child][on][process][SIGCHLD] @@ -466,6 +491,9 @@ ILibDuktape_ChildProcess_SubProcess* ILibDuktape_ChildProcess_SpawnedProcess_PUS #endif ILibDuktape_CreateEventWithSetterEx(ctx, "descriptorMetadata", ILibDuktape_SpawnedProcess_descriptorSetter); + if (callback != NULL) { ILibDuktape_EventEmitter_AddOnce(emitter, "exit", callback); } + + ILibDuktape_EventEmitter_AddOnceEx3(ctx, -1, "exit", ILibDuktape_SpawnedProcess_exitHandler); return(retVal); } diff --git a/microscript/ILibDuktape_GenericMarshal.c b/microscript/ILibDuktape_GenericMarshal.c index 48937c2..5b1399f 100644 --- a/microscript/ILibDuktape_GenericMarshal.c +++ b/microscript/ILibDuktape_GenericMarshal.c @@ -436,6 +436,19 @@ duk_ret_t ILibDuktape_GenericMarshal_Variable_bignum_SET(duk_context *ctx) return(0); } #endif +duk_ret_t ILibDuktape_GenericMarshal_Variable_metadata_get(duk_context *ctx) +{ + duk_push_this(ctx); + duk_get_prop_string(ctx, -1, ILibDuktape_EventEmitter_FinalizerDebugMessage); + return(1); +} +duk_ret_t ILibDuktape_GenericMarshal_Variable_metadata_set(duk_context *ctx) +{ + duk_push_this(ctx); // [var] + duk_dup(ctx, 0); // [var][value] + duk_put_prop_string(ctx, -2, ILibDuktape_EventEmitter_FinalizerDebugMessage); + return(0); +} void ILibDuktape_GenericMarshal_Variable_PUSH(duk_context *ctx, void *ptr, int size) { duk_push_object(ctx); // [var] @@ -463,6 +476,10 @@ void ILibDuktape_GenericMarshal_Variable_PUSH(duk_context *ctx, void *ptr, int s ILibDuktape_CreateInstanceMethod(ctx, "autoFree", ILibDuktape_GenericMarshal_Variable_autoFree, DUK_VARARGS); ILibDuktape_CreateInstanceMethod(ctx, "pointerBuffer", ILibDuktape_GenericMarshal_Variable_pointerBuffer, 0); ILibDuktape_CreateInstanceMethod(ctx, "getPointerPointer", ILibDuktape_GenericMarshal_Variable_pointerpointer, 0); + ILibDuktape_CreateEventWithGetterAndSetterEx(ctx, "descriptorMetadata", ILibDuktape_GenericMarshal_Variable_metadata_get, ILibDuktape_GenericMarshal_Variable_metadata_set); + + duk_push_sprintf(ctx, "Size: %d", size); + duk_put_prop_string(ctx, -2, ILibDuktape_EventEmitter_FinalizerDebugMessage); ILibDuktape_CreateFinalizer(ctx, ILibDuktape_GenericMarshal_Variable_Finalizer); } @@ -889,6 +906,7 @@ void ILibDuktape_GenericMarshal_MethodInvokeAsync_ChainDispatch(void *chain, voi duk_context *ctx = data->ctx; duk_push_heapptr(data->ctx, data->promise); // [promise] + duk_del_prop_string(data->ctx, -1, "_varArray"); duk_get_prop_string(data->ctx, -1, "_RES"); // [promise][resolver] duk_swap_top(data->ctx, -2); // [resolver][this] ILibDuktape_GenericMarshal_Variable_PUSH(data->ctx, (void*)(PTRSIZE)data->vars, (int)sizeof(void*)); // [resolver][this][var] @@ -1048,6 +1066,7 @@ void ILibDuktape_GenericMarshal_MethodInvokeAsync_Done_chain(void *chain, void* } duk_push_heapptr(data->ctx, data->promise); // [promise] + duk_del_prop_string(data->ctx, -1, "_varArray"); duk_get_prop_string(data->ctx, -1, "_RES"); // [promise][resolver] duk_swap_top(data->ctx, -2); // [resolver][this] ILibDuktape_GenericMarshal_Variable_PUSH(data->ctx, (void*)data->workAvailable, (int)sizeof(void*)); // [resolver][this][var] @@ -1090,6 +1109,12 @@ duk_ret_t ILibDuktape_GenericMarshal_MethodInvokeAsync_promfin(duk_context *ctx) } return(0); } +duk_ret_t ILibDuktape_GenericMarshal_MethodInvokeAsync_PromiseSettled(duk_context *ctx) +{ + duk_push_this(ctx); // [promise] + duk_del_prop_string(ctx, -1, "nativeProxy"); + return(0); +} duk_ret_t ILibDuktape_GenericMarshal_MethodInvokeAsync(duk_context *ctx) { void *redirectionPtr = NULL, *redirectionPtrName = NULL; @@ -1136,6 +1161,9 @@ duk_ret_t ILibDuktape_GenericMarshal_MethodInvokeAsync(duk_context *ctx) data->chain = duk_ctx_chain(ctx); duk_push_current_function(ctx); // [promise][func] + duk_push_sprintf(ctx, "%s_Async", Duktape_GetStringPropertyValue(ctx, -1, "_funcName", "??")); + duk_put_prop_string(ctx, -3, ILibDuktape_EventEmitter_FinalizerDebugMessage); + data->fptr = Duktape_GetPointerProperty(ctx, -1, "_address"); data->methodName = Duktape_GetStringPropertyValue(ctx, -1, "_funcName", NULL); data->waitingForResult = WAITING_FOR_RESULT__DISPATCHER; @@ -1143,6 +1171,7 @@ duk_ret_t ILibDuktape_GenericMarshal_MethodInvokeAsync(duk_context *ctx) data->workStarted = ggd->dispatch->WorkerThreadHandle; data->vars = (PTRSIZE*)ILibMemory_SmartAllocate(sizeof(PTRSIZE)*parms); data->fptr_redirection = NULL; + duk_pop(ctx); // [promise] } else { @@ -1185,6 +1214,10 @@ duk_ret_t ILibDuktape_GenericMarshal_MethodInvokeAsync(duk_context *ctx) duk_eval_string(ctx, "require('promise');"); // [func][promise] duk_push_c_function(ctx, ILibDuktape_GenericMarshal_MethodInvokeAsync_promise, 2); duk_new(ctx, 1); + duk_get_prop_string(ctx, -1, "_internal"); + duk_push_sprintf(ctx, "%s_Async", Duktape_GetStringPropertyValue(ctx, -3, "_funcName", "??")); + duk_put_prop_string(ctx, -2, ILibDuktape_EventEmitter_FinalizerDebugMessage); + duk_pop(ctx); ILibDuktape_CreateFinalizer(ctx, ILibDuktape_GenericMarshal_MethodInvokeAsync_promfin); duk_push_pointer(ctx, data); duk_put_prop_string(ctx, -2, "_data"); data->promise = duk_get_heapptr(ctx, -1); @@ -1209,8 +1242,7 @@ duk_ret_t ILibDuktape_GenericMarshal_MethodInvokeAsync(duk_context *ctx) { if (duk_is_object(ctx, i)) { - duk_get_prop_string(ctx, i, "_ptr"); - data->vars[i] = (PTRSIZE)duk_to_pointer(ctx, -1); + data->vars[i] = (PTRSIZE)Duktape_GetPointerProperty(ctx, i, "_ptr"); } else if (duk_is_number(ctx, i)) { @@ -1240,13 +1272,15 @@ duk_ret_t ILibDuktape_GenericMarshal_MethodInvokeAsync(duk_context *ctx) } #endif - duk_push_heapptr(ctx, data->promise); // [promise] duk_push_current_function(ctx); // [promise][func] - duk_get_prop_string(ctx, -1, "_obj"); // [promise][func][obj] - duk_remove(ctx, -2); // [promise][obj] + void *hptr = Duktape_GetPointerProperty(ctx, -1, "_obj"); + duk_pop(ctx); // [promise] + duk_push_heapptr(ctx, hptr); // [promise][obj] duk_put_prop_string(ctx, -2, "nativeProxy");// [promise] - + duk_get_prop_string(ctx, -1, "_internal"); + ILibDuktape_EventEmitter_AddOn_Infrastructure(ctx, -1, "settled", ILibDuktape_GenericMarshal_MethodInvokeAsync_PromiseSettled); + duk_pop(ctx); return(1); } duk_ret_t ILibDuktape_GenericMarshal_MethodInvokeAsync_wait(duk_context *ctx) @@ -1458,7 +1492,8 @@ duk_ret_t ILibDuktape_GenericMarshal_CreateMethod(duk_context *ctx) duk_push_string(ctx, funcName); duk_put_prop_string(ctx, -2, "_funcName"); duk_push_c_function(ctx, ILibDuktape_GenericMarshal_MethodInvokeAsync_abort, 0); // [obj][func][func][func] duk_put_prop_string(ctx, -2, "abort"); // [obj][func][func] - duk_push_this(ctx); duk_put_prop_string(ctx, -2, "_obj"); + + duk_push_pointer(ctx, duk_get_heapptr(ctx, -3)); duk_put_prop_string(ctx, -2, "_obj"); duk_push_c_function(ctx, ILibDuktape_GenericMarshal_MethodInvokeAsync_thread, 0); duk_put_prop_string(ctx, -2, "thread"); duk_push_c_function(ctx, ILibDuktape_GenericMarshal_MethodInvokeAsync_wait, DUK_VARARGS); duk_put_prop_string(ctx, -2, "wait"); duk_push_c_function(ctx, ILibDuktape_GenericMarshal_MethodInvokeAsync_thread_id, 0); duk_put_prop_string(ctx, -2, "threadId"); diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 5f187f5..0def222 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -49,6 +49,8 @@ limitations under the License. #define ILibDuktape_AddCompressedModule(ctx, name, b64str) duk_push_global_object(ctx);duk_get_prop_string(ctx, -1, "addCompressedModule");duk_swap_top(ctx, -2);duk_push_string(ctx, name);duk_push_global_object(ctx);duk_get_prop_string(ctx, -1, "Buffer"); duk_remove(ctx, -2);duk_get_prop_string(ctx, -1, "from");duk_swap_top(ctx, -2);duk_push_string(ctx, b64str);duk_push_string(ctx, "base64");duk_pcall_method(ctx, 2);duk_pcall_method(ctx, 2);duk_pop(ctx); +extern void* _duk_get_first_object(void *ctx); +extern void* _duk_get_next_object(void *ctx, void *heapptr); typedef enum ILibDuktape_Console_DestinationFlags @@ -2286,7 +2288,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('clipboard', Buffer.from('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', 'base64'));"); // Promise: This is very important, as it is used everywhere. Refer to /modules/promise.js to see a human readable version of promise.js - duk_peval_string_noresult(ctx, "addCompressedModule('promise', Buffer.from('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', 'base64'));"); + duk_peval_string_noresult(ctx, "addCompressedModule('promise', Buffer.from('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', 'base64'));"); // util-agentlog, used to parse agent error logs. Refer to modules/util-agentlog.js duk_peval_string_noresult(ctx, "addCompressedModule('util-agentlog', Buffer.from('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', 'base64'));"); @@ -2310,7 +2312,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('PE_Parser', Buffer.from('eJytV0tz2kgQvlPFf+j1RSjL8rJCEVM+EOxUqPWCC4FTOQ7SCKYsZrSjkTGbyn/fHkkIiad2KzogNNPzdffXL6n5oVoZimAr2XKloNNq92DEFfVhKGQgJFFM8GqlWnliDuUhdSHiLpWgVhQGAXHwlu7U4YXKEKWh02hBTQvcpFs3Zr9a2YoI1mQLXCiIQooILASP+RTou0MDBYyDI9aBzwh3KGyYWsVaUoxGtfI9RRALRVCYoHiAT15eDIjS1gJeK6WCu2Zzs9k0SGxpQ8hl00/kwubTaPg4th//QGv1iTn3aRiCpH9HTKKbiy2QAI1xyAJN9MkGhASylBT3lNDGbiRTjC/rEApPbYik1YrLQiXZIlIFnnamob95AWSKcLgZ2DCyb+DzwB7Z9Wrl22j2dTKfwbfBdDoYz0aPNkymMJyMH0az0WSMT19gMP4Of47GD3WgyBJqoe+B1NajiUwzSF2ky6a0oN4TiTlhQB3mMQed4suILCksxRuVHH2BgMo1C3UUQzTOrVZ8tmYqToLw2CNU8qGpyWs2YUpVJDnygmrW8QEgCxGpJM70nTqR0lRWK17EnXg/IDKkNdx6JmplVis/kri9EYlhUC/Eh3v48bO/X/VCXEkjVDO80DDzmy5uemFDBJTbW+7sgOtgyEVBcrFVNJxS4ubWXBF+xRX07x4+R55HZYP4vnBqXSt/lKvTUp2ClAhSsf4uF2OCiBuT9zCxYRVvJ3uZOYn9Ev/F9ntufW9WHVp16Fp42yliHtSy7fjUHAu33X16rLXMhhI2Jhpf1tpd/TAPMLJDgnSb8Ns9GB8H1oNhJkAp7fpSKyk2UDMiLqkjlpz9oyuBcSK3kMQ1I/LnKdfGs9Ke7ZiMHds9NHzKlzpkx47ddtCxbsvMu58dC3VV1xDIynlurOi7kbrbsj628Lrgsm5LBJ4f45aU91LfQuxGziqnsEC3VaT7WIeDxIPRthzjTtN120FO1X5bX0nCNxKSkS7jvdc1+kWZBWp97R/C9rpdK8HtWmVwUfoKrks9EvkqxpzzVy42/DKobgwe49S9AJzlS3oYawR7APETQm3MNAQ6zW8ny/mzZweuGzfA+wuZA7/jeDtZkTu8QvJmRXxY62eN3Fl5Ke0z1Djvs6cSia/NL/aiaD19GRzQX+BpuKLOqx2tn8V1Ziz86VpFnjWzE28oXB2bva2F45Z56syI42wkvu4fD0SR88d7J4/PeWmAdsfM3N6V6bHo9bZ4tmpbn/NVm3bDYp5nkThj46eO2T9ZQUMqlR7FRNGZHo77ND7rba8kVFpR53Buy5qkccrmD6KeBpVvxFZEqrJlqsE+dUu1v84uPkn3+1/xabfKsno9QJb1awJk/ZdAlw6Q1ft1AWq3D6N9bpAUpXYTNx0tgPoj/XaKbSx+R53suvFfZMmcOzBQ15mea12s6MvTqOj9ENXrUZakStZR9FvG5VQ47hv5yUIi/OWKObqHOnsEbP3cx28Xnqxiy9KP+oTHZKgAz8itucfU/X7lHo2iQo4cjhqUj4cM3rPxcsWXHFoqmbP5ULnGLeRGy7xkzjFgbN3xckljMSv2nl21/ISa/YviAvMFX4sugzxsnmJVCHbC82Jeoe+OL0KaOp+bcfobKc0ovRq/Fa2FG/m0gR9xQipde/GHUZyD1cq/OIedMw==', 'base64'));"); // Windows Message Pump, refer to modules/win-message-pump.js - duk_peval_string_noresult(ctx, "addCompressedModule('win-message-pump', Buffer.from('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', 'base64'));"); + duk_peval_string_noresult(ctx, "addCompressedModule('win-message-pump', Buffer.from('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', 'base64'));"); duk_peval_string_noresult(ctx, "addCompressedModule('win-console', Buffer.from('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', 'base64'));"); // Windows Cert Store, refer to modules/win-certstore.js @@ -3174,7 +3176,75 @@ duk_ret_t ILibDuktape_Polyfills_NativeAllocSize(duk_context *ctx) return(1); } #endif +duk_ret_t ILibDuktape_Polyfills_WeakReference_isAlive(duk_context *ctx) +{ + duk_push_this(ctx); // [weak] + void **p = Duktape_GetPointerProperty(ctx, -1, "\xFF_heapptr"); + duk_push_boolean(ctx, ILibMemory_CanaryOK(p)); + return(1); +} +duk_ret_t ILibDuktape_Polyfills_WeakReference_object(duk_context *ctx) +{ + duk_push_this(ctx); // [weak] + void **p = Duktape_GetPointerProperty(ctx, -1, "\xFF_heapptr"); + if (ILibMemory_CanaryOK(p)) + { + duk_push_heapptr(ctx, p[0]); + } + else + { + duk_push_null(ctx); + } + return(1); +} +duk_ret_t ILibDuktape_Polyfills_WeakReference(duk_context *ctx) +{ + duk_push_object(ctx); // [weak] + ILibDuktape_WriteID(ctx, "WeakReference"); + duk_dup(ctx, 0); // [weak][obj] + void *j = duk_get_heapptr(ctx, -1); + void **p = (void**)Duktape_PushBuffer(ctx, sizeof(void*)); // [weak][obj][buffer] + p[0] = j; + duk_put_prop_string(ctx, -2, Duktape_GetStashKey(duk_get_heapptr(ctx, -1)));// [weak][obj] + duk_pop(ctx); // [weak] + duk_push_pointer(ctx, p); duk_put_prop_string(ctx, -2, "\xFF_heapptr"); // [weak] + ILibDuktape_CreateInstanceMethod(ctx, "isAlive", ILibDuktape_Polyfills_WeakReference_isAlive, 0); + ILibDuktape_CreateEventWithGetter_SetEnumerable(ctx, "object", ILibDuktape_Polyfills_WeakReference_object, 1); + return(1); +} +duk_ret_t ILibDuktape_Polyfills_rootObject(duk_context *ctx) +{ + void *h = _duk_get_first_object(ctx); + duk_push_heapptr(ctx, h); + return(1); +} +duk_ret_t ILibDuktape_Polyfills_nextObject(duk_context *ctx) +{ + void *h = duk_require_heapptr(ctx, 0); + void *next = _duk_get_next_object(ctx, h); + if (next != NULL) + { + duk_push_heapptr(ctx, next); + } + else + { + duk_push_null(ctx); + } + return(1); +} +duk_ret_t ILibDuktape_Polyfills_countObject(duk_context *ctx) +{ + void *h = _duk_get_first_object(ctx); + duk_int_t i = 1; + + while (h != NULL) + { + if ((h = _duk_get_next_object(ctx, h)) != NULL) { ++i; } + } + duk_push_int(ctx, i); + return(1); +} void ILibDuktape_Polyfills_Init(duk_context *ctx) { ILibDuktape_ModSearch_AddHandler(ctx, "queue", ILibDuktape_Queue_Push); @@ -3222,6 +3292,11 @@ void ILibDuktape_Polyfills_Init(duk_context *ctx) ILibDuktape_CreateInstanceMethod(ctx, "_ipv4From", ILibDuktape_Polyfills_ipv4From, 1); ILibDuktape_CreateInstanceMethod(ctx, "_isBuffer", ILibDuktape_Polyfills_isBuffer, 1); ILibDuktape_CreateInstanceMethod(ctx, "_MSH", ILibDuktape_Polyfills_MSH, 0); + ILibDuktape_CreateInstanceMethod(ctx, "WeakReference", ILibDuktape_Polyfills_WeakReference, 1); + ILibDuktape_CreateInstanceMethod(ctx, "_rootObject", ILibDuktape_Polyfills_rootObject, 0); + ILibDuktape_CreateInstanceMethod(ctx, "_nextObject", ILibDuktape_Polyfills_nextObject, 1); + ILibDuktape_CreateInstanceMethod(ctx, "_countObjects", ILibDuktape_Polyfills_countObject, 0); + #if defined(ILIBMEMTRACK) && !defined(ILIBCHAIN_GLOBAL_LOCK) ILibDuktape_CreateInstanceMethod(ctx, "_NativeAllocSize", ILibDuktape_Polyfills_NativeAllocSize, 0); #endif diff --git a/microscript/ILibduktape_EventEmitter.c b/microscript/ILibduktape_EventEmitter.c index f4abb51..59c1263 100644 --- a/microscript/ILibduktape_EventEmitter.c +++ b/microscript/ILibduktape_EventEmitter.c @@ -38,6 +38,7 @@ limitations under the License. #define ILibDuktape_EventEmitter_EventTable "\xFF_EventEmitter_EventTable" #define ILibDuktape_EventEmitter_CountTable "\xFF_EventEmitter_CountTable" #define ILibDuktape_EventEmitter_References "\xFF_EventReferences" +extern void ILibDuktape_GenericMarshal_Variable_PUSH(duk_context *ctx, void *ptr, int size); #ifdef ILIBEVENTEMITTER_REFHOLD int gEventEmitterReferenceHold = ILIBEVENTEMITTER_REFHOLD; @@ -1213,7 +1214,7 @@ duk_ret_t ILibDuktape_EventEmitter_allProperties(duk_context *ctx) const char *tmp; duk_push_array(ctx); // [arr] duk_dup(ctx, 0); // [arr][obj] - duk_enum(ctx, -1, (all == 0 ? 0 : DUK_ENUM_INCLUDE_NONENUMERABLE) | DUK_ENUM_INCLUDE_HIDDEN | DUK_ENUM_INCLUDE_SYMBOLS);; + duk_enum(ctx, -1, (all == 0 ? 0 : DUK_ENUM_INCLUDE_NONENUMERABLE) | (all == 2 ? DUK_ENUM_OWN_PROPERTIES_ONLY : 0) | DUK_ENUM_INCLUDE_HIDDEN | DUK_ENUM_INCLUDE_SYMBOLS);; while (duk_next(ctx, -1, 0)) // [arr][obj][enum][key] { tmp = NULL; @@ -1342,13 +1343,56 @@ duk_ret_t ILibDuktape_EventEmitter_setFinalizerMetadata(duk_context *ctx) duk_put_prop_string(ctx, -2, ILibDuktape_EventEmitter_FinalizerDebugMessage); return(0); } -duk_ret_t ILibDuktape_RefCountPointer(duk_context *ctx) +duk_ret_t ILibDuktape_RefCountPointer_eval(duk_context *ctx) { duk_push_this(ctx); - duk_int_t *t = _get_refcount_ptr(ctx, -1); - duk_push_pointer(ctx, t); + duk_int_t *t = (duk_int_t*)Duktape_GetPointerProperty(ctx, -1, "_ptr"); + if (t == NULL) { return(ILibDuktape_Error(ctx, "ERROR")); } + duk_push_int(ctx, *t); return(1); } +duk_ret_t ILibDuktape_RefCountPointer_set(duk_context *ctx) +{ + duk_push_this(ctx); + duk_int_t *t = (duk_int_t*)Duktape_GetPointerProperty(ctx, -1, "_ptr"); + if (t == NULL) { return(ILibDuktape_Error(ctx, "ERROR")); } + *t = duk_require_int(ctx, 0); + return(0); +} +duk_ret_t ILibDuktape_RefCountPointer(duk_context *ctx) +{ + int nargs = duk_get_top(ctx); + duk_push_this(ctx); + char *tmp = Duktape_GetStringPropertyValue(ctx, -1, ILibDuktape_OBJID, ""); + if (nargs == 1) { duk_dup(ctx, 0); } + duk_int_t *t = _get_refcount_ptr(ctx, -1); + if (nargs == 1) { duk_pop(ctx); } + ILibDuktape_GenericMarshal_Variable_PUSH(ctx, t, sizeof(void*)); + duk_push_sprintf(ctx, "_get_refcount_ptr(%s)", tmp); duk_put_prop_string(ctx, -2, ILibDuktape_EventEmitter_FinalizerDebugMessage); + ILibDuktape_CreateInstanceMethod(ctx, "eval", ILibDuktape_RefCountPointer_eval, 0); + ILibDuktape_CreateInstanceMethod(ctx, "set", ILibDuktape_RefCountPointer_set, 1); + return(1); +} +duk_ret_t ILibDuktape_EventEmitter_getProperty(duk_context *ctx) +{ + duk_push_this(ctx); // [obj] + char *tmp = (char*)duk_push_sprintf(ctx, "%s", duk_get_string(ctx, 0));// [obj][string] + if (tmp[0] == '?') { tmp[0] = '\xFF'; } + duk_get_prop_string(ctx, -2, tmp); + tmp = (char*)duk_get_string(ctx, -1); + return(1); +} +duk_ret_t ILibDuktape_EventEmitter_setProperty(duk_context *ctx) +{ + char *s = (char*)duk_get_string(ctx, 0); + char *s2 = (char*)duk_get_string(ctx, 1); + duk_push_this(ctx); // [obj] + char *tmp = (char*)duk_push_sprintf(ctx, "%s", duk_get_string(ctx, 0));// [obj][string] + duk_dup(ctx, 1); // [obj][string][val] + if (tmp[0] == '?') { tmp[0] = '\xFF'; } + duk_put_prop_string(ctx, -3, tmp); + return(0); +} void ILibDuktape_EventEmitter_PUSH(duk_context *ctx, void *chain) { duk_push_object(ctx); // [emitter] @@ -1357,11 +1401,14 @@ void ILibDuktape_EventEmitter_PUSH(duk_context *ctx, void *chain) ILibDuktape_CreateInstanceMethod(ctx, "moderated", ILibDuktape_EventEmitter_moderated, DUK_VARARGS); ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "all", 1, "allProperties", ILibDuktape_EventEmitter_allProperties, 1); ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "all", 0, "hiddenProperties", ILibDuktape_EventEmitter_allProperties, 1); + ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "all", 2, "allOwnProperties", ILibDuktape_EventEmitter_allProperties, 1); ILibDuktape_CreateInstanceMethod(ctx, "showReferences", ILibDuktape_EventEmitter_showReferences, DUK_VARARGS); ILibDuktape_CreateInstanceMethod(ctx, "addHiddenReference", ILibDuktape_EventEmitter_addHidden, 2); ILibDuktape_CreateInstanceMethod(ctx, "deleteProperty", ILibDuktape_EventEmitter_deleteProperty, 2); ILibDuktape_CreateInstanceMethod(ctx, "setFinalizerMetadata", ILibDuktape_EventEmitter_setFinalizerMetadata, 1); - ILibDuktape_CreateInstanceMethod(ctx, "_refCountPointer", ILibDuktape_RefCountPointer, 0); + ILibDuktape_CreateInstanceMethod(ctx, "_refCountPointer", ILibDuktape_RefCountPointer, DUK_VARARGS); + ILibDuktape_CreateInstanceMethod(ctx, "getProperty", ILibDuktape_EventEmitter_getProperty, 1); + ILibDuktape_CreateInstanceMethod(ctx, "setProperty", ILibDuktape_EventEmitter_setProperty, 2); } void ILibDuktape_EventEmitter_Init(duk_context *ctx) { diff --git a/microscript/duktape.c b/microscript/duktape.c index d54472d..3e8e050 100644 --- a/microscript/duktape.c +++ b/microscript/duktape.c @@ -99915,3 +99915,14 @@ duk_int_t* _get_refcount_ptr(void *thr, duk_idx_t idx) duk_heaphdr *h = (DUK_TVAL_IS_HEAP_ALLOCATED(tv) ? DUK_TVAL_GET_HEAPHDR(tv) : NULL); return(&(DUK_HEAPHDR_GET_REFCOUNT(h))); } + +void* _duk_get_first_object(void *ctx) +{ + duk_hthread *thr = (duk_hthread*)ctx; + return(thr->heap->heap_allocated); +} +void* _duk_get_next_object(void *ctx, void *heapptr) +{ + duk_hthread *thr = (duk_hthread*)ctx; + return(DUK_HEAPHDR_GET_NEXT(thr->heap, ((duk_heaphdr*)heapptr))); +} diff --git a/modules/promise.js b/modules/promise.js index 5579558..30a3358 100644 --- a/modules/promise.js +++ b/modules/promise.js @@ -16,6 +16,12 @@ limitations under the License. var refTable = {}; +function promiseInitializer(r,j) +{ + this._res = r; + this._rej = j; +} + function getRootPromise(obj) { while(obj.parentPromise) @@ -35,6 +41,20 @@ function event_forwarder(sourceObj, sourceName, targetObj, targetName) sourceObj.on(sourceName, targetObj.emit.bind(targetObj)); } + +function return_resolved() +{ + var parms = ['resolved']; + for (var ai in arguments) + { + parms.push(arguments[ai]); + } + this._XSLF.emit.apply(this._XSLF, parms); +} +function return_rejected() +{ + this._XSLF.promise.__childPromise._rej(e); +} function Promise(promiseFunc) { this._ObjectID = 'promise'; @@ -58,7 +78,21 @@ function Promise(promiseFunc) this._up = value; } }); - + Object.defineProperty(this, "descriptorMetadata", + { + get: function () + { + return (require('events').getProperty.call(this._internal, '?_FinalizerDebugMessage')); + }, + set: function (value) + { + require('events').setProperty.call(this._internal, '?_FinalizerDebugMessage', value); + } + }); + this._internal.on('~', function () + { + this.completedArgs = []; + }); this._internal.on('newListener', (function (eventName, eventCallback) { //console.log('newListener', eventName, 'errors/' + this.errors + ' completed/' + this.completed); @@ -98,7 +132,6 @@ function Promise(promiseFunc) eventCallback.apply(this, []); } }).internal); - this._internal.resolver = (function _resolver() { if (_resolver._self.completed) { return; } @@ -123,19 +156,7 @@ function Promise(promiseFunc) { var pr = getRootPromise(_resolver._self.promise); args[1]._XSLF = _resolver._self; - args[1].then(function _returnResolved() - { - var parms = ['resolved']; - for (var ai in arguments) - { - parms.push(arguments[ai]); - } - this._XSLF.emit.apply(this._XSLF, parms); - }, - function _returnRejected(e) - { - this._XSLF.promise.__childPromise._rej(e); - }); + args[1].then(return_resolved, return_rejected); } else { @@ -181,13 +202,16 @@ function Promise(promiseFunc) }; this.then = function (resolved, rejected) { - if (resolved) { this._internal.once('resolved', event_switcher(this, resolved).func.internal); } + if (resolved) + { + this._internal.once('resolved', event_switcher(this, resolved).func.internal); + } if (rejected) { this._internal.once('rejected', event_switcher(this, rejected).func.internal); } - - var retVal = new Promise(function (r, j) { this._rej = j; }); + + var retVal = new Promise(promiseInitializer); retVal.parentPromise = this; if (this._internal.completed) @@ -218,9 +242,9 @@ function Promise(promiseFunc) this._internal.once('resolved', retVal._internal.resolver); this._internal.once('rejected', retVal._internal.rejector); } - this.__childPromise = retVal; - return (retVal); + this.__childPromise = retVal; + return(retVal); }; this._internal.resolver._self = this._internal; @@ -266,6 +290,8 @@ function Promise(promiseFunc) delete this._up; delete this.__childPromise; delete this.promise; + this.removeAllListeners('resolved'); + this.removeAllListeners('rejected'); }).internal); } diff --git a/modules/win-message-pump.js b/modules/win-message-pump.js index 2f69682..a1a2354 100644 --- a/modules/win-message-pump.js +++ b/modules/win-message-pump.js @@ -30,11 +30,16 @@ function WindowsMessagePump(options) emitterUtils.createEvent('exit'); this._msg = GM.CreateVariable(GM.PointerSize == 4 ? 28 : 48); + this._msg.descriptorMetadata = 'MESSAGE'; this._kernel32 = GM.CreateNativeProxy('Kernel32.dll'); + this._kernel32.mp = this; + this._kernel32.CreateMethod('GetLastError'); + this._kernel32.CreateMethod('GetModuleHandleA'); + this._user32 = GM.CreateNativeProxy('User32.dll'); this._user32.mp = this; this._user32.CreateMethod('CreateWindowExW'); @@ -48,13 +53,14 @@ function WindowsMessagePump(options) this._user32.CreateMethod('ShowWindow'); this._user32.CreateMethod('TranslateMessage'); - this.wndclass = GM.CreateVariable(GM.PointerSize == 4 ? 48 : 80); + this.wndclass.descriptorMetadata = 'wndclass'; this.wndclass.mp = this; this.wndclass.hinstance = this._kernel32.GetModuleHandleA(0); //this.wndclass.cname = GM.CreateVariable('MainWWWClass'); this.wndclass.cnamew = GM.CreateVariable('MainWWWClass', { wide: true }); this.wndclass.wndproc = GM.GetGenericGlobalCallback(4); + this.wndclass.wndproc.descriptorMetadata = 'wndproc'; this.wndclass.wndproc.mp = this; this.wndclass.toBuffer().writeUInt32LE(this.wndclass._size); this.wndclass.cnamew.pointerBuffer().copy(this.wndclass.Deref(GM.PointerSize == 4 ? 40 : 64, GM.PointerSize).toBuffer()); @@ -63,6 +69,11 @@ function WindowsMessagePump(options) this.wndclass.wndproc.on('GlobalCallback', function onWndProc(xhwnd, xmsg, wparam, lparam) { var processed = false; + xhwnd.descriptorMetadata = 'win-message-pump: xhwnd'; + xmsg.descriptorMetadata = 'win-message-pump: xmsg'; + wparam.descriptorMetadata = 'win-message-pump: wparam'; + lparam.descriptorMetadata = 'win-message-pump: lparam'; + if (this.mp._hwnd != null && this.mp._hwnd.Val == xhwnd.Val) { // This is for us @@ -75,11 +86,15 @@ function WindowsMessagePump(options) { // We need to call DefWindowProcA, becuase this message was not handled var p = this.mp._user32.DefWindowProcW.async(d, xhwnd, xmsg, wparam, lparam); + p.descriptorMetadata = 'win-message-pump: DefWindowProcW(1)'; p.dispatcher = this; - p.then(function (ret) + var xk = p.then(function (ret) { this.dispatcher.EndDispatcher(ret); }); + xk.descriptorMetadata = 'DefWindowProcW_Result' + xk = null; + p = null; } else { @@ -92,21 +107,22 @@ function WindowsMessagePump(options) { // This message was generated from our CreateWindowExA method processed = true; - var d = this.StartDispatcher(); this.mp.emit('message', { message: xmsg.Val, wparam: wparam.Val, lparam: lparam.Val, lparam_hex: lparam.pointerBuffer().toString('hex'), hwnd: xhwnd, dispatcher: d }); var msgRet = this.mp.emit_returnValue('message'); if (msgRet == null) -{ + { // We need to call DefWindowProcA, becuase this message was not handled var p = this.mp._user32.DefWindowProcW.async(d, xhwnd, xmsg, wparam, lparam); + p.descriptorMetadata = 'win-message-pump: DefWindowProcW(2)'; p.dispatcher = this; p.then(function (ret) { this.dispatcher.EndDispatcher(ret); }); + p = null; } else { @@ -116,11 +132,15 @@ function WindowsMessagePump(options) } } - if (processed) { _debugGC(); } + xhwnd = null; + xmsg = null; + wparam = null; + lparam = null; }); this._user32.RegisterClassExW.async(this.wndclass).then(function () { + this.descriptorMetadata = 'RegisterClassExW'; if (!this.nativeProxy.mp._options) { this.nativeProxy.mp._options = {}; } if (!this.nativeProxy.mp._options.window) { this.nativeProxy.mp._options.window = {}; } if (this.nativeProxy.mp._options.window.exstyles == null) { this.nativeProxy.mp._options.window.exstyles = 0x00000088; } // TopMost Tool Window @@ -133,8 +153,9 @@ function WindowsMessagePump(options) this.nativeProxy.CreateWindowExW.async(this.nativeProxy.RegisterClassExW.async, this.nativeProxy.mp._options.window.exstyles, this.nativeProxy.mp.wndclass.cnamew, this.nativeProxy.mp._options.window.title == null ? 0 : GM.CreateVariable(this.nativeProxy.mp._options.window.title, { wide: true }), this.nativeProxy.mp._options.window.winstyles, this.nativeProxy.mp._options.window.x, this.nativeProxy.mp._options.window.y, this.nativeProxy.mp._options.window.width, this.nativeProxy.mp._options.window.height, 0, 0, 0, 0) - .then(function(h) + .then(function (h) { + this.descriptorMetadata = 'CreateWindowExW'; if (h.Val == 0) { // Error creating hidden window @@ -150,34 +171,43 @@ function WindowsMessagePump(options) }); this._startPump = function _startPump() { - this._user32.GetMessageW.async(this._user32.RegisterClassExW.async, this._msg, this._hwnd, 0, 0).then(function (r) - { - if(r.Val > 0) + this._user32.GetMessageW.async(this._user32.RegisterClassExW.async, this._msg, this._hwnd, 0, 0) + .then(function (r) { - this.nativeProxy.TranslateMessage.async(this.nativeProxy.RegisterClassExW.async, this.nativeProxy.mp._msg).then(function () + var val = r.Val; + r.descriptorMetadata = 'RegisterClassExW_result'; + r = null; + if (val > 0) { - this.nativeProxy.DispatchMessageW.async(this.nativeProxy.RegisterClassExW.async, this.nativeProxy.mp._msg).then(function () + this.nativeProxy.TranslateMessage.async(this.nativeProxy.RegisterClassExW.async, this.nativeProxy.mp._msg).then(function () { - this.nativeProxy.mp._startPump(); + this.descriptorMetadata = 'TranslateMessage'; + this.nativeProxy.DispatchMessageW.async(this.nativeProxy.RegisterClassExW.async, this.nativeProxy.mp._msg).then(function () + { + this.descriptorMetadata = 'DispatchMessageW'; + this.nativeProxy.mp._startPump(); + }); }); - }); - } - else - { - // We got a 'QUIT' message - this.nativeProxy.DestroyWindow.async(this.nativeProxy.RegisterClassExW.async, this.nativeProxy.mp._hwnd).then(function () + } + else { - this.nativeProxy.RegisterClassExW.async.abort(); - delete this.nativeProxy.mp._hwnd; - this.nativeProxy.mp.emit('exit', 0); - - this.nativeProxy.mp.wndclass.wndproc.removeAllListeners('GlobalCallback'); - this.nativeProxy.mp.wndclass.wndproc = null; - }); - } - }, function (err) { this.nativeProxy.mp.stop(); }); + // We got a 'QUIT' message + this.nativeProxy.DestroyWindow.async(this.nativeProxy.RegisterClassExW.async, this.nativeProxy.mp._hwnd).then(function () + { + this.descriptorMetadata = 'DestroyWindow'; + this.nativeProxy.RegisterClassExW.async.abort(); + delete this.nativeProxy.mp._hwnd; + this.nativeProxy.mp.wndclass.wndproc.removeAllListeners('GlobalCallback'); + this.nativeProxy.mp.wndclass.wndproc.mp = null; + this.nativeProxy.mp.wndclass.wndproc = null; + this.nativeProxy.mp.emit('exit', 0); + }); + } + }, function (err) + { + this.nativeProxy.mp.stop(); + }); } - this.stop = function stop() { if (this._hwnd) @@ -196,10 +226,23 @@ function WindowsMessagePump(options) }; this.once('~', function () { + this._msg = null; this.stop(); }); + this.once('exit', (function () + { + setImmediate(function (j) + { + j._kernel32.mp = null; + j._user32.mp = null; + if (j.wndclass) { j.wndclass.mp = null; } + if (j.wndclass.wndproc) { j.wndclass.wndproc.mp = null; } + j.removeAllListeners(); + }, this); + }).internal); } + module.exports = WindowsMessagePump; module.exports.WindowStyles = { @@ -218,3 +261,5 @@ module.exports.WindowStylesEx = WS_EX_NOREDIRECTIONBITMAP: 0x00200000, WS_EX_RIGHT: 0x00001000, WS_EX_RIGHTSCROLLBAR: 0x00000000, WS_EX_RTLREADING: 0x00002000, WS_EX_STATICEDGE: 0x00020000, WS_EX_TOOLWINDOW: 0x00000080, WS_EX_TOPMOST: 0x00000008, WS_EX_TRANSPARENT: 0x00000020, WS_EX_WINDOWEDGE: 0x00000100 }; + +