From 65fcf3d2e44a00b9c191c10437686bdb125f3e3c Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Thu, 25 Feb 2021 18:19:11 -0800 Subject: [PATCH] Updated Event Proxy, so proxyFunc is deleted when event is deleted --- microscript/ILibDuktape_Helpers.h | 2 ++ microscript/ILibDuktape_ReadableStream.c | 7 +++++-- microscript/ILibduktape_EventEmitter.c | 2 ++ microscript/duktape.c | 12 ++++++++++++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/microscript/ILibDuktape_Helpers.h b/microscript/ILibDuktape_Helpers.h index c6ba26d..ca7d70d 100644 --- a/microscript/ILibDuktape_Helpers.h +++ b/microscript/ILibDuktape_Helpers.h @@ -83,6 +83,8 @@ typedef struct ILibDuktape_ContextData typedef void(*Duktape_EventLoopDispatch)(void *chain, void *user); void Duktape_RunOnEventLoop(void *chain, uintptr_t nonce, duk_context *ctx, Duktape_EventLoopDispatch handler, Duktape_EventLoopDispatch abortHandler, void *user); #define Duktape_RunOnEventLoopEx(chain, nonce, ctx, handler, user, freeOnShutdown) Duktape_RunOnEventLoop(chain, nonce, ctx, handler, (freeOnShutdown==0?NULL:(Duktape_EventLoopDispatch)(uintptr_t)0x01), user) +extern void *_duk_get_tval(void *thr, duk_idx_t idx); +extern duk_int_t* _get_refcount_ptr(void *thr, duk_idx_t idx); void ILibDuktape_ExecutorTimeout_Start(duk_context *ctx); void ILibDuktape_ExecutorTimeout_Stop(duk_context *ctx); diff --git a/microscript/ILibDuktape_ReadableStream.c b/microscript/ILibDuktape_ReadableStream.c index 7ce0466..32d6b6a 100644 --- a/microscript/ILibDuktape_ReadableStream.c +++ b/microscript/ILibDuktape_ReadableStream.c @@ -850,6 +850,7 @@ duk_ret_t ILibDuktape_readableStream_unpipe(duk_context *ctx) duk_get_prop_string(ctx, -1, ILibDuktape_readableStream_RSPTRS); // [readable][ptrs] data = (ILibDuktape_readableStream*)Duktape_GetBuffer(ctx, -1, NULL); duk_pop(ctx); // [readable] + duk_pop(ctx); // ... if (data->emitter->ctx == NULL) { return(0); } @@ -868,7 +869,7 @@ duk_ret_t ILibDuktape_readableStream_unpipe(duk_context *ctx) if (onlyItem) { break; } } if (onlyItem && wcount > 1) { onlyItem = 0; } - duk_pop_2(ctx); // [readable] + duk_pop_3(ctx); // ... } ILibSpinLock_UnLock(&(data->pipeLock)); @@ -881,16 +882,18 @@ duk_ret_t ILibDuktape_readableStream_unpipe(duk_context *ctx) duk_get_prop_string(ctx, -1, "pause"); // [readable][pause] duk_dup(ctx, -2); // [readable][pause][this] duk_call_method(ctx, 0); duk_pop(ctx); // [readable] + duk_pop(ctx); // ... } //ILibDuktape_readableStream_unpipe_later(ctx, (void*[]) { data->object, nargs == 0 ? NULL : duk_get_heapptr(ctx, 0) }, nargs == 0 ? 1 : 2); // We must yield, and do this on the next event loop, because we can't unpipe if we're called from a pipe'ed call + duk_push_this(ctx); // [readable] void *imm = ILibDuktape_Immediate(ctx, (void*[]) { duk_get_heapptr(ctx, -1), nargs == 1 ? duk_get_heapptr(ctx, 0) : NULL }, nargs + 1, ILibDuktape_readableStream_unpipe_later); duk_push_heapptr(ctx, imm); // [immediate] duk_push_this(ctx); // [immediate][this] duk_put_prop_string(ctx, -2, "\xFF_Self"); // [immediate] if (nargs == 1) { duk_dup(ctx, 0); duk_put_prop_string(ctx, -2, "\xFF_w"); } - duk_pop(ctx); // ... + duk_pop_2(ctx); // ... } return 0; } diff --git a/microscript/ILibduktape_EventEmitter.c b/microscript/ILibduktape_EventEmitter.c index e92941f..a62c885 100644 --- a/microscript/ILibduktape_EventEmitter.c +++ b/microscript/ILibduktape_EventEmitter.c @@ -1617,6 +1617,8 @@ duk_ret_t ILibDuktape_EventEmitter_ForwardEx_target_removeListenerSink(duk_conte duk_dup(ctx, 0); // [source][removeListener][this][name] duk_get_prop_string(ctx, 1, "proxyFunc"); // [source][removeListener][this][name][func] duk_call_method(ctx, 2); // [source][ret] + + duk_del_prop_string(ctx, 1, "proxyFunc"); return(0); } int ILibDuktape_EventEmitter_ForwardEventEx(duk_context *ctx, duk_idx_t sourceIdx, duk_idx_t targetIdx, char *eventName) diff --git a/microscript/duktape.c b/microscript/duktape.c index cd2f791..d54472d 100644 --- a/microscript/duktape.c +++ b/microscript/duktape.c @@ -99903,3 +99903,15 @@ DUK_INTERNAL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr) { #undef DUK__RANDOM_XOROSHIRO128PLUS #undef DUK__RND_BIT #undef DUK__UPDATE_RND + +void *_duk_get_tval(void *thr, duk_idx_t idx) +{ + return(duk_get_tval(thr, idx)); +} + +duk_int_t* _get_refcount_ptr(void *thr, duk_idx_t idx) +{ + duk_tval *tv = duk_get_tval_or_unused(thr, idx); + duk_heaphdr *h = (DUK_TVAL_IS_HEAP_ALLOCATED(tv) ? DUK_TVAL_GET_HEAPHDR(tv) : NULL); + return(&(DUK_HEAPHDR_GET_REFCOUNT(h))); +}