From 7c3236ba8d7f3f5f3201b578ca135f9ea79e69e4 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Sun, 24 May 2020 00:10:48 -0700 Subject: [PATCH] Added helpers, and updated HECI cleanup --- microscript/ILibDuktape_HECI.c | 18 ++++++++++++++++-- microscript/ILibDuktape_Helpers.h | 7 +++++++ microscript/ILibDuktape_Polyfills.c | 14 ++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/microscript/ILibDuktape_HECI.c b/microscript/ILibDuktape_HECI.c index d74421d..c205bc3 100644 --- a/microscript/ILibDuktape_HECI.c +++ b/microscript/ILibDuktape_HECI.c @@ -675,6 +675,7 @@ duk_ret_t ILibDuktape_HECI_create_OnClientConnect(duk_context *ctx) #ifdef WIN32 duk_push_this(ctx); // [HECI] session->descriptor = (HANDLE)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_HECI_Descriptor); + duk_del_prop_string(ctx, -1, ILibDuktape_HECI_Descriptor); duk_get_prop_string(ctx, -1, ILibDuktape_HECI_ChildProcess); // [HECI][childProcess] duk_get_prop_string(ctx, -1, ILibDuktape_ChildProcess_Manager); // [HECI][childProcess][manager] session->mgr = (ILibProcessPipe_Manager)duk_get_pointer(ctx, -1); @@ -928,6 +929,7 @@ void ILibDuktape_HECI_NextIoctl(duk_context *ctx, void *heci) HANDLE descriptor = (HANDLE)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_HECI_Descriptor); OVERLAPPED *p = (OVERLAPPED*)Duktape_GetBufferProperty(ctx, -1, ILibDuktape_HECI_OVERLAPPED); void **ptrs = (void**)Duktape_GetBufferProperty(ctx, -1, ILibDuktape_HECI_CTX_PTRS); + duk_get_prop_string(ctx, -1, ILibDuktape_HECI_Q); // [HECI][QUEUE] duk_queue_peek(ctx, -1); // [HECI][QUEUE][OBJ] @@ -981,6 +983,9 @@ duk_ret_t ILibDuktape_HECI_doIoctl(duk_context *ctx) duk_require_function(ctx, cbx); // Make sure a callback function was specified duk_push_this(ctx); // [HECI] +#ifdef WIN32 + if (!duk_has_prop_string(ctx, -1, ILibDuktape_HECI_Descriptor)) { return(ILibDuktape_Error(ctx, "Invalid Operation. Call Reset()")); } +#endif duk_get_prop_string(ctx, -1, ILibDuktape_HECI_Q); // [HECI][QUEUE] duk_push_object(ctx); // [HECI][QUEUE][OBJ] @@ -1110,8 +1115,14 @@ duk_ret_t ILibDuktape_HECI_Finalizer(duk_context *ctx) { if (ILibDuktape_HECI_Debug) { printf("ILibDuktape_HECI_Finalizer()\n"); } #ifdef WIN32 - HANDLE h = Duktape_GetPointerProperty(ctx, 0, ILibDuktape_HECI_IoctlWaitHandle); + HANDLE h = Duktape_GetPointerProperty(ctx, 0, ILibDuktape_HECI_Descriptor); if (h != NULL) { CloseHandle(h); } + OVERLAPPED *p = (OVERLAPPED*)Duktape_GetBufferProperty(ctx, 0, ILibDuktape_HECI_OVERLAPPED); + if (p->hEvent != NULL) + { + ILibChain_RemoveWaitHandle(duk_ctx_chain(ctx), p->hEvent); + CloseHandle(p->hEvent); + } #endif @@ -1213,7 +1224,10 @@ duk_ret_t ILibDuktape_HECI_reset(duk_context *ctx) if (ILibDuktape_HECI_Debug) { printf("ILibDuktape_HECI_reset()\n"); } HANDLE h = (HANDLE)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_HECI_Descriptor); - CloseHandle(h); + if (h != NULL) + { + CloseHandle(h); + } h = ILibDuktape_HECI_windowsInit(); duk_push_pointer(ctx, h); duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Descriptor); diff --git a/microscript/ILibDuktape_Helpers.h b/microscript/ILibDuktape_Helpers.h index f9d00a2..78dbebb 100644 --- a/microscript/ILibDuktape_Helpers.h +++ b/microscript/ILibDuktape_Helpers.h @@ -106,6 +106,13 @@ char *Duktape_Duplicate_GetStringEx(duk_context *ctx, duk_idx_t i, duk_size_t *l #define duk_queue_peek(ctx, i) duk_get_prop_index(ctx, i, 0) #define duk_queue_isEmpty(ctx, i) (duk_get_length(ctx, i)==0) +#define duk_table_put(ctx, i, key) duk_put_prop_string(ctx, i, key) +#define duk_table_get(ctx, i, key) duk_get_prop_string(ctx, i, key) +#define duk_table_get_buffer(ctx, i, key) Duktape_GetBufferProperty(ctx, i, key) +#define duk_table_keys(ctx, i) duk_dup(ctx, i);duk_get_prop_string(ctx, -1, "keys");duk_swap_top(ctx, -2);if(duk_pcall_method(ctx, 0)!=0){duk_pop(ctx);duk_push_null(ctx);} +#define duk_table_hasKey(ctx, i, key) duk_has_prop_string(ctx, i, key) +#define duk_table_delKey(ctx, i, key) duk_del_prop_string(ctx, i, key) + #define duk_buffer_slice(ctx, i, start, len) duk_dup(ctx, i);duk_get_prop_string(ctx, -1, "slice");duk_swap_top(ctx, -2);duk_push_int(ctx, start);duk_push_int(ctx, len);duk_pcall_method(ctx, 2);duk_remove(ctx, -2); #define duk_string_concat(ctx, i) duk_dup(ctx, i);duk_get_prop_string(ctx, -1, "concat");duk_swap_top(ctx, -2);duk_dup(ctx, -3);duk_pcall_method(ctx, 1);duk_remove(ctx, -2); diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index e308282..c7b29c7 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -1813,6 +1813,18 @@ duk_ret_t ILibDuktape_Polyfills_Array_peek(duk_context *ctx) duk_get_prop_index(ctx, -1, (duk_uarridx_t)duk_get_length(ctx, -1) - 1); return(1); } +duk_ret_t ILibDuktape_Polyfills_Object_keys(duk_context *ctx) +{ + duk_push_this(ctx); // [obj] + duk_push_array(ctx); // [obj][keys] + duk_enum(ctx, -2, DUK_ENUM_OWN_PROPERTIES_ONLY); // [obj][keys][enum] + while (duk_next(ctx, -1, 0)) // [obj][keys][enum][key] + { + duk_array_push(ctx, -3); // [obj][keys][enum] + } + duk_pop(ctx); // [obj][keys] + return(1); +} void ILibDuktape_Polyfills_object(duk_context *ctx) { // Polyfill Object._hashCode() @@ -1820,6 +1832,8 @@ void ILibDuktape_Polyfills_object(duk_context *ctx) duk_get_prop_string(ctx, -1, "prototype"); // [g][Object][prototype] duk_push_c_function(ctx, ILibDuktape_Polyfills_Object_hashCode, 0); // [g][Object][prototype][func] ILibDuktape_CreateReadonlyProperty(ctx, "_hashCode"); // [g][Object][prototype] + duk_push_c_function(ctx, ILibDuktape_Polyfills_Object_keys, 0); // [g][Object][prototype][func] + ILibDuktape_CreateReadonlyProperty(ctx, "keys"); // [g][Object][prototype] duk_pop_2(ctx); // [g] duk_get_prop_string(ctx, -1, "Array"); // [g][Array]