From f8f657d730397f78de98ea2af9834d2b8159e828 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Thu, 18 Feb 2021 11:24:10 -0800 Subject: [PATCH] Fixed enumerability of Array polyfill methods --- microscript/ILibDuktape_Helpers.c | 22 ---------------------- microscript/ILibDuktape_Helpers.h | 6 ++++-- microscript/ILibDuktape_Polyfills.c | 19 ++++++++++++++++--- 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/microscript/ILibDuktape_Helpers.c b/microscript/ILibDuktape_Helpers.c index a603b5e..5b8e459 100644 --- a/microscript/ILibDuktape_Helpers.c +++ b/microscript/ILibDuktape_Helpers.c @@ -887,28 +887,6 @@ void ILibDuktape_CreateFinalizerEx(duk_context *ctx, duk_c_function func, int si if (singleton != 0) { ILibDuktape_EventEmitter_RemoveAllListeners(e, "~"); } ILibDuktape_EventEmitter_PrependOnce(ctx, -1, "~", func); } -duk_ret_t ILibDuktape_CreateProperty_InstanceMethod_Sink(duk_context *ctx) -{ - duk_push_current_function(ctx); // [func] - duk_get_prop_string(ctx, -1, "actualFunc"); // [func][actualFunc] - return 1; -} -void ILibDuktape_CreateProperty_InstanceMethodEx(duk_context *ctx, char *methodName, void *funcHeapPtr) -{ - duk_push_string(ctx, methodName); // [obj][prop] - duk_push_c_function(ctx, ILibDuktape_CreateProperty_InstanceMethod_Sink, 1); // [obj][prop][getFunc] - duk_push_heapptr(ctx, funcHeapPtr); // [obj][prop][getFunc][func] - duk_put_prop_string(ctx, -2, "actualFunc"); // [obj][prop][getFunc] - duk_def_prop(ctx, -3, DUK_DEFPROP_FORCE | DUK_DEFPROP_HAVE_GETTER); // [obj] -} -void ILibDuktape_CreateProperty_InstanceMethod(duk_context *ctx, char *methodName, duk_c_function impl, duk_idx_t argCount) -{ - duk_push_string(ctx, methodName); // [obj][prop] - duk_push_c_function(ctx, ILibDuktape_CreateProperty_InstanceMethod_Sink, 1); // [obj][prop][getFunc] - duk_push_c_function(ctx, impl, argCount); // [obj][prop][getFunc][func] - duk_put_prop_string(ctx, -2, "actualFunc"); // [obj][prop][getFunc] - duk_def_prop(ctx, -3, DUK_DEFPROP_SET_ENUMERABLE | DUK_DEFPROP_FORCE | DUK_DEFPROP_HAVE_GETTER); // [obj] -} duk_ret_t ILibDuktape_ReadonlyProperty_Get(duk_context *ctx) { diff --git a/microscript/ILibDuktape_Helpers.h b/microscript/ILibDuktape_Helpers.h index 49b99e5..b53d5c6 100644 --- a/microscript/ILibDuktape_Helpers.h +++ b/microscript/ILibDuktape_Helpers.h @@ -201,8 +201,10 @@ void ILibDuktape_CreateEventWithGetterAndSetterWithMetaData(duk_context *ctx, ch void ILibDuktape_CreateInstanceMethodWithProperties(duk_context *ctx, char *funcName, duk_c_function funcImpl, duk_idx_t numArgs, unsigned int propertyCount, ...); duk_idx_t duk_push_int_ex(duk_context *ctx, duk_int_t val); -void ILibDuktape_CreateProperty_InstanceMethod(duk_context *ctx, char *methodName, duk_c_function impl, duk_idx_t argCount); -void ILibDuktape_CreateProperty_InstanceMethodEx(duk_context *ctx, char *methodName, void *funcHeapPtr); +#define ILibDuktape_CreateProperty_InstanceMethod_SetEnumerable(ctx, methodName, impl, argCount, enumerable) duk_push_c_function(ctx, impl, argCount);ILibDuktape_CreateReadonlyProperty_SetEnumerable(ctx,methodName,enumerable) +#define ILibDuktape_CreateProperty_InstanceMethod(ctx, methodName, impl, argCount) duk_push_c_function(ctx, impl, argCount);ILibDuktape_CreateReadonlyProperty_SetEnumerable(ctx,methodName,1) +#define ILibDuktape_CreateProperty_InstanceMethodEx(ctx, methodName, funcHeapPtr) duk_push_heapptr(ctx, funcHeapPtr);ILibDuktape_CreateReadonlyProperty_SetEnumerable(ctx,methodName,0) + #define ILibDuktape_DeleteReadOnlyProperty(ctx, i, propName) duk_dup(ctx,i);duk_push_string(ctx,propName);duk_def_prop(ctx,-2,DUK_DEFPROP_FORCE|DUK_DEFPROP_SET_CONFIGURABLE);duk_pop(ctx);duk_del_prop_string(ctx,i,propName); #define ILibDuktape_CreateReadonlyProperty(ctx, propName) ILibDuktape_CreateReadonlyProperty_SetEnumerable(ctx, propName, 0) void ILibDuktape_CreateReadonlyProperty_SetEnumerable(duk_context *ctx, char *propName, int enumerable); diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index d74a552..73a7b10 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -482,6 +482,16 @@ duk_ret_t ILibDuktape_Polyfills_Array_partialIncludes(duk_context *ctx) duk_push_int(ctx, -1); return(1); } +duk_ret_t ILibDuktape_Polyfills_Array_find(duk_context *ctx) +{ + duk_push_this(ctx); // [array] + duk_prepare_method_call(ctx, -1, "findIndex"); // [array][findIndex][this] + duk_dup(ctx, 0); // [array][findIndex][this][func] + duk_call_method(ctx, 1); // [array][result] + if (duk_get_int(ctx, -1) == -1) { duk_push_undefined(ctx); return(1); } + duk_get_prop(ctx, -2); // [element] + return(1); +} duk_ret_t ILibDuktape_Polyfills_Array_findIndex(duk_context *ctx) { duk_idx_t nargs = duk_get_top(ctx); @@ -521,13 +531,16 @@ void ILibDuktape_Polyfills_Array(duk_context *ctx) duk_get_prop_string(ctx, -1, "prototype"); // [Array][proto] // Polyfill 'Array.includes' - ILibDuktape_CreateProperty_InstanceMethod(ctx, "includes", ILibDuktape_Polyfills_Array_includes, 1); + ILibDuktape_CreateProperty_InstanceMethod_SetEnumerable(ctx, "includes", ILibDuktape_Polyfills_Array_includes, 1, 0); // Polyfill 'Array.partialIncludes' - ILibDuktape_CreateProperty_InstanceMethod(ctx, "partialIncludes", ILibDuktape_Polyfills_Array_partialIncludes, 1); + ILibDuktape_CreateProperty_InstanceMethod_SetEnumerable(ctx, "partialIncludes", ILibDuktape_Polyfills_Array_partialIncludes, 1, 0); + + // Polyfill 'Array.find' + ILibDuktape_CreateProperty_InstanceMethod_SetEnumerable(ctx, "find", ILibDuktape_Polyfills_Array_find, 1, 0); // Polyfill 'Array.findIndex' - ILibDuktape_CreateProperty_InstanceMethod(ctx, "findIndex", ILibDuktape_Polyfills_Array_findIndex, DUK_VARARGS); + ILibDuktape_CreateProperty_InstanceMethod_SetEnumerable(ctx, "findIndex", ILibDuktape_Polyfills_Array_findIndex, DUK_VARARGS, 0); duk_pop_2(ctx); // ... } void ILibDuktape_Polyfills_String(duk_context *ctx)