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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user