From 717f9736615685ee7269206711569fb66571e0ec Mon Sep 17 00:00:00 2001 From: roytam1 Date: Fri, 11 Mar 2022 15:50:15 +0800 Subject: [PATCH] import from UXP: JS - support for Array.prototype.values() (f8591643) --- dom/workers/RuntimeService.cpp | 4 +++- js/src/jsapi.h | 8 ++++++++ js/src/jsarray.cpp | 2 -- js/src/jsobj.cpp | 5 +++++ js/src/shell/js.cpp | 9 +++++++-- js/xpconnect/src/XPCJSContext.cpp | 5 ++++- js/xpconnect/tests/chrome/test_xrayToJS.xul | 4 ++-- modules/libpref/init/all.js | 2 ++ 8 files changed, 31 insertions(+), 8 deletions(-) diff --git a/dom/workers/RuntimeService.cpp b/dom/workers/RuntimeService.cpp index 3f3fd5172..9c4d001ed 100644 --- a/dom/workers/RuntimeService.cpp +++ b/dom/workers/RuntimeService.cpp @@ -301,7 +301,9 @@ LoadContextOptions(const char* aPrefName, void* /* aClosure */) .setNativeRegExp(GetWorkerPref(NS_LITERAL_CSTRING("native_regexp"))) .setAsyncStack(GetWorkerPref(NS_LITERAL_CSTRING("asyncstack"))) .setWerror(GetWorkerPref(NS_LITERAL_CSTRING("werror"))) - .setExtraWarnings(GetWorkerPref(NS_LITERAL_CSTRING("strict"))); + .setExtraWarnings(GetWorkerPref(NS_LITERAL_CSTRING("strict"))) + .setArrayProtoValues(GetWorkerPref( + NS_LITERAL_CSTRING("array_prototype_values"))); RuntimeService::SetDefaultContextOptions(contextOptions); diff --git a/js/src/jsapi.h b/js/src/jsapi.h index e1a8ac514..d382303b0 100644 --- a/js/src/jsapi.h +++ b/js/src/jsapi.h @@ -1113,6 +1113,7 @@ class JS_PUBLIC_API(ContextOptions) { werror_(false), strictMode_(false), extraWarnings_(false), + arrayProtoValues_(true), #ifdef NIGHTLY_BUILD forEachStatement_(false) #else @@ -1252,6 +1253,12 @@ class JS_PUBLIC_API(ContextOptions) { return *this; } + bool arrayProtoValues() const { return arrayProtoValues_; } + ContextOptions& setArrayProtoValues(bool flag) { + arrayProtoValues_ = flag; + return *this; + } + private: bool baseline_ : 1; bool ion_ : 1; @@ -1268,6 +1275,7 @@ class JS_PUBLIC_API(ContextOptions) { bool werror_ : 1; bool strictMode_ : 1; bool extraWarnings_ : 1; + bool arrayProtoValues_ : 1; bool forEachStatement_: 1; }; diff --git a/js/src/jsarray.cpp b/js/src/jsarray.cpp index b9fe3a3d8..9aae01ad7 100644 --- a/js/src/jsarray.cpp +++ b/js/src/jsarray.cpp @@ -3147,9 +3147,7 @@ static const JSFunctionSpec array_methods[] = { JS_SELF_HOSTED_SYM_FN(iterator, "ArrayValues", 0,0), JS_SELF_HOSTED_FN("entries", "ArrayEntries", 0,0), JS_SELF_HOSTED_FN("keys", "ArrayKeys", 0,0), -#ifdef NIGHTLY_BUILD JS_SELF_HOSTED_FN("values", "ArrayValues", 0,0), -#endif /* ES7 additions */ JS_SELF_HOSTED_FN("includes", "ArrayIncludes", 2,0), diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp index 08d62eb2b..ef067d3db 100644 --- a/js/src/jsobj.cpp +++ b/js/src/jsobj.cpp @@ -2925,6 +2925,11 @@ DefineFunctionFromSpec(JSContext* cx, HandleObject obj, const JSFunctionSpec* fs if (!PropertySpecNameToId(cx, fs->name, &id)) return false; + if (StandardProtoKeyOrNull(obj) == JSProto_Array && id == NameToId(cx->names().values)) { + if (!cx->options().arrayProtoValues()) + return true; + } + JSFunction* fun = NewFunctionFromSpec(cx, fs, id); if (!fun) return false; diff --git a/js/src/shell/js.cpp b/js/src/shell/js.cpp index 08ab129ed..e954ce506 100644 --- a/js/src/shell/js.cpp +++ b/js/src/shell/js.cpp @@ -320,6 +320,7 @@ static bool enableNativeRegExp = false; static bool enableUnboxedArrays = false; static bool enableSharedMemory = SHARED_MEMORY_DEFAULT; static bool enableWasmAlwaysBaseline = false; +static bool enableArrayProtoValues = true; static bool printTiming = false; static const char* jsCacheDir = nullptr; static const char* jsCacheAsmJSPath = nullptr; @@ -7279,6 +7280,7 @@ SetContextOptions(JSContext* cx, const OptionParser& op) enableNativeRegExp = !op.getBoolOption("no-native-regexp"); enableUnboxedArrays = op.getBoolOption("unboxed-arrays"); enableWasmAlwaysBaseline = op.getBoolOption("wasm-always-baseline"); + enableArrayProtoValues = !op.getBoolOption("no-array-proto-values"); JS::ContextOptionsRef(cx).setBaseline(enableBaseline) .setIon(enableIon) @@ -7287,7 +7289,8 @@ SetContextOptions(JSContext* cx, const OptionParser& op) .setWasmAlwaysBaseline(enableWasmAlwaysBaseline) .setWasmAllowDebugging(true) .setNativeRegExp(enableNativeRegExp) - .setUnboxedArrays(enableUnboxedArrays); + .setUnboxedArrays(enableUnboxedArrays) + .setArrayProtoValues(enableArrayProtoValues); if (op.getBoolOption("wasm-check-bce")) jit::JitOptions.wasmAlwaysCheckBounds = true; @@ -7559,7 +7562,8 @@ SetWorkerContextOptions(JSContext* cx) .setWasmAlwaysBaseline(enableWasmAlwaysBaseline) .setWasmAllowDebugging(true) .setNativeRegExp(enableNativeRegExp) - .setUnboxedArrays(enableUnboxedArrays); + .setUnboxedArrays(enableUnboxedArrays) + .setArrayProtoValues(enableArrayProtoValues); cx->setOffthreadIonCompilationEnabled(offthreadCompilation); cx->profilingScripts = enableCodeCoverage || enableDisassemblyDumps; @@ -7732,6 +7736,7 @@ main(int argc, char** argv, char** envp) || !op.addBoolOption('\0', "unboxed-arrays", "Allow creating unboxed arrays") || !op.addBoolOption('\0', "wasm-always-baseline", "Enable wasm baseline compiler when possible") || !op.addBoolOption('\0', "wasm-check-bce", "Always generate wasm bounds check, even redundant ones.") + || !op.addBoolOption('\0', "no-array-proto-values", "Remove Array.prototype.values") #ifdef ENABLE_SHARED_ARRAY_BUFFER || !op.addStringOption('\0', "shared-memory", "on/off", "SharedArrayBuffer and Atomics " diff --git a/js/xpconnect/src/XPCJSContext.cpp b/js/xpconnect/src/XPCJSContext.cpp index 63055442f..ebe358459 100644 --- a/js/xpconnect/src/XPCJSContext.cpp +++ b/js/xpconnect/src/XPCJSContext.cpp @@ -1503,6 +1503,8 @@ ReloadPrefsCallback(const char* pref, void* data) sExtraWarningsForSystemJS = Preferences::GetBool(JS_OPTIONS_DOT_STR "strict.debug"); #endif + bool arrayProtoValues = Preferences::GetBool(JS_OPTIONS_DOT_STR "array_prototype_values"); + JS::ContextOptionsRef(cx).setBaseline(useBaseline) .setIon(useIon) .setAsmJS(useAsmJS) @@ -1514,7 +1516,8 @@ ReloadPrefsCallback(const char* pref, void* data) .setThrowOnDebuggeeWouldRun(throwOnDebuggeeWouldRun) .setDumpStackOnDebuggeeWouldRun(dumpStackOnDebuggeeWouldRun) .setWerror(werror) - .setExtraWarnings(extraWarnings); + .setExtraWarnings(extraWarnings) + .setArrayProtoValues(arrayProtoValues); JS_SetParallelParsingEnabled(cx, parallelParsing); JS_SetOffthreadIonCompilationEnabled(cx, offthreadIonCompilation); diff --git a/js/xpconnect/tests/chrome/test_xrayToJS.xul b/js/xpconnect/tests/chrome/test_xrayToJS.xul index 5708dc164..e8d8f176a 100644 --- a/js/xpconnect/tests/chrome/test_xrayToJS.xul +++ b/js/xpconnect/tests/chrome/test_xrayToJS.xul @@ -202,9 +202,9 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=933681 "pop", "shift", "unshift", "splice", "concat", "slice", "lastIndexOf", "indexOf", "includes", "forEach", "map", "reduce", "reduceRight", "filter", "some", "every", "find", "findIndex", "copyWithin", "fill", Symbol.iterator, Symbol.unscopables, "entries", "keys", - "constructor"]; + "values", "constructor"]; if (isNightlyBuild) { - gPrototypeProperties['Array'].push("values"); + // ...nothing now } gConstructorProperties['Array'] = constructorProps(["join", "reverse", "sort", "push", "pop", "shift", diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index 2dde436bf..6f8b91074 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -1263,6 +1263,8 @@ pref("dom.webcomponents.enabled", false); pref("dom.webcomponents.customelements.enabled", false); pref("javascript.enabled", true); +// Enable Array.prototype.values +pref("javascript.options.array_prototype_values", true); pref("javascript.options.strict", false); #ifdef DEBUG pref("javascript.options.strict.debug", false);