1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-22 03:03:18 +00:00

Fixed enumerability of Array polyfill methods

This commit is contained in:
Bryan Roe
2021-02-18 11:24:10 -08:00
parent da756d6b7f
commit f8f657d730
3 changed files with 20 additions and 27 deletions

View File

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

View File

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

View File

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