1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2026-01-08 11:33:42 +00:00

Added helpers, and updated HECI cleanup

This commit is contained in:
Bryan Roe
2020-05-24 00:10:48 -07:00
parent 74d4ae2c1e
commit 7c3236ba8d
3 changed files with 37 additions and 2 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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]