1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-23 11:43:26 +00:00

Added native Timeout helper

This commit is contained in:
Bryan Roe
2019-01-18 22:45:11 -08:00
parent 2d0e8d227f
commit f36bd6f8e0
2 changed files with 51 additions and 0 deletions

View File

@@ -645,7 +645,56 @@ void *ILibDuktape_Memory_AllocEx(duk_context *ctx, duk_idx_t index, duk_size_t s
duk_pop_2(ctx); // ... duk_pop_2(ctx); // ...
return(retVal); return(retVal);
} }
duk_ret_t ILibDuktape_Timeout_Sink(duk_context *ctx)
{
ILibDuktape_TimeoutHandler userCallback = (ILibDuktape_TimeoutHandler)duk_get_pointer(ctx, 0);
void **args = NULL;
int argsLen, i;
duk_push_this(ctx); // [timeout]
duk_dup(ctx, 1); // [timeout][array]
if ((argsLen = (int)duk_get_length(ctx, -1)) > 0)
{
args = ILibMemory_AllocateA(sizeof(void*)*argsLen);
for (i = 0; i < argsLen; ++i)
{
duk_get_prop_index(ctx, -1, i); // [timeout][array][arg]
args[i] = duk_get_pointer(ctx, -1);
duk_pop(ctx); // [timeout][array]
}
}
if (userCallback != NULL) { userCallback(ctx, args, argsLen); }
return(0);
}
void* ILibDuktape_Timeout(duk_context *ctx, void **args, int argsLen, int delay, ILibDuktape_TimeoutHandler callback)
{
void *retval = NULL;
int i = 0;
duk_push_global_object(ctx); // [g]
duk_get_prop_string(ctx, -1, "setTimeout"); // [g][setTimeout]
duk_swap_top(ctx, -2); // [setTimeout][this]
duk_push_c_function(ctx, ILibDuktape_Timeout_Sink, DUK_VARARGS); // [setTimeout][this][func]
duk_push_int(ctx, delay); // [setTimeout][this][func][delay]
duk_push_pointer(ctx, callback); // [setTimeout][this][func][delay][userFunc]
duk_push_array(ctx); // [setTimeout][this][func][delay][userFunc][array]
while (args[i] != NULL && i < argsLen)
{
duk_get_prop_string(ctx, -1, "push"); // [setInterval][this][func][delay][userFunc][array][push]
duk_dup(ctx, -2); // [setInterval][this][func][delay][userFunc][array][push][this]
duk_push_pointer(ctx, args[i]); // [setInterval][this][func][delay][userFunc][array][push][this][val]
if (duk_pcall_method(ctx, 1) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "ILibDuktape_Timeout => Array.push(): "); }
duk_pop(ctx); // [setInterval][this][func][delay][userFunc][array]
++i;
}
if (duk_pcall_method(ctx, 4) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "ILibDuktape_Timeout => timeout(): "); duk_pop(ctx); return(NULL); }
retval = duk_get_heapptr(ctx, -1); // [timeout]
return(retval);
}
duk_ret_t ILibDuktape_Immediate_Sink(duk_context *ctx) duk_ret_t ILibDuktape_Immediate_Sink(duk_context *ctx)
{ {
ILibDuktape_ImmediateHandler userCallback = (ILibDuktape_ImmediateHandler)duk_get_pointer(ctx, 0); ILibDuktape_ImmediateHandler userCallback = (ILibDuktape_ImmediateHandler)duk_get_pointer(ctx, 0);

View File

@@ -114,9 +114,11 @@ void ILibDuktape_Push_ObjectStash(duk_context *ctx);
typedef void(*ILibDuktape_ImmediateHandler)(duk_context *ctx, void ** args, int argsLen); typedef void(*ILibDuktape_ImmediateHandler)(duk_context *ctx, void ** args, int argsLen);
typedef ILibDuktape_ImmediateHandler ILibDuktape_IntervalHandler; typedef ILibDuktape_ImmediateHandler ILibDuktape_IntervalHandler;
typedef ILibDuktape_ImmediateHandler ILibDuktape_TimeoutHandler;
void* ILibDuktape_Immediate(duk_context *ctx, void ** args, int argsLen, ILibDuktape_ImmediateHandler callback); void* ILibDuktape_Immediate(duk_context *ctx, void ** args, int argsLen, ILibDuktape_ImmediateHandler callback);
void* ILibDuktape_Interval(duk_context *ctx, void **args, int argsLen, int delay, ILibDuktape_IntervalHandler callback); void* ILibDuktape_Interval(duk_context *ctx, void **args, int argsLen, int delay, ILibDuktape_IntervalHandler callback);
void* ILibDuktape_Timeout(duk_context *ctx, void **args, int argsLen, int delay, ILibDuktape_TimeoutHandler callback);
int ILibDuktape_GetReferenceCount(duk_context *ctx, duk_idx_t i); int ILibDuktape_GetReferenceCount(duk_context *ctx, duk_idx_t i);
#define ILibDuktape_WriteID(ctx, id) duk_push_string(ctx, id);duk_put_prop_string(ctx, -2, ILibDuktape_OBJID) #define ILibDuktape_WriteID(ctx, id) duk_push_string(ctx, id);duk_put_prop_string(ctx, -2, ILibDuktape_OBJID)