[tor-commits] [tor-browser] 03/03: Bug 1770048: Improve self-hosted new_List r=jandem, tcampbell, a=dsmith
gitolite role
git at cupani.torproject.org
Mon May 23 08:25:27 UTC 2022
This is an automated email from the git hooks/post-receive script.
pierov pushed a commit to branch geckoview-99.0b3-11.5-2
in repository tor-browser.
commit 9f1fba5c0a9cfd9768e8793499080fe9566a5f0c
Author: Iain Ireland <iireland at mozilla.com>
AuthorDate: Thu May 19 14:30:10 2022 +0000
Bug 1770048: Improve self-hosted new_List r=jandem,tcampbell,a=dsmith
Differential Revision: https://phabricator.services.mozilla.com/D146760
---
js/src/builtin/Array.cpp | 19 +++++++++++++++++++
js/src/builtin/Array.h | 2 ++
js/src/builtin/Module.js | 16 ++++++++--------
js/src/builtin/RegExp.js | 6 +++---
js/src/builtin/Utilities.js | 11 +----------
js/src/vm/SelfHosting.cpp | 1 +
6 files changed, 34 insertions(+), 21 deletions(-)
diff --git a/js/src/builtin/Array.cpp b/js/src/builtin/Array.cpp
index d23f775107d7b..72e969b46be28 100644
--- a/js/src/builtin/Array.cpp
+++ b/js/src/builtin/Array.cpp
@@ -4946,3 +4946,22 @@ JS_PUBLIC_API bool JS::SetArrayLength(JSContext* cx, Handle<JSObject*> obj,
return SetLengthProperty(cx, obj, length);
}
+
+bool js::intrinsic_newList(JSContext* cx, unsigned argc, js::Value* vp) {
+ CallArgs args = CallArgsFromVp(argc, vp);
+ MOZ_ASSERT(args.length() == 0);
+
+ RootedShape shape(cx, GetArrayShapeWithProto(cx, nullptr));
+ if (!shape) {
+ return false;
+ }
+
+ uint32_t length = 0;
+ ArrayObject* list = ::NewArrayWithShape<0>(cx, shape, length, GenericObject);
+ if (!list) {
+ return false;
+ }
+
+ args.rval().setObject(*list);
+ return true;
+}
diff --git a/js/src/builtin/Array.h b/js/src/builtin/Array.h
index 53bbf5c86c585..ff5911b0d4321 100644
--- a/js/src/builtin/Array.h
+++ b/js/src/builtin/Array.h
@@ -127,6 +127,8 @@ extern bool array_slice(JSContext* cx, unsigned argc, js::Value* vp);
extern JSObject* ArraySliceDense(JSContext* cx, HandleObject obj, int32_t begin,
int32_t end, HandleObject result);
+extern bool intrinsic_newList(JSContext* cx, unsigned argc, js::Value* vp);
+
/*
* Append the given (non-hole) value to the end of an array. The array must be
* a newborn array -- that is, one which has not been exposed to script for
diff --git a/js/src/builtin/Module.js b/js/src/builtin/Module.js
index 3dfc92067f132..efd001b21bca9 100644
--- a/js/src/builtin/Module.js
+++ b/js/src/builtin/Module.js
@@ -14,7 +14,7 @@ function CallModuleResolveHook(module, moduleRequest, expectedMinimumStatus)
// https://tc39.es/ecma262/#sec-getexportednames
// ES2020 15.2.1.17.2 GetExportedNames
-function ModuleGetExportedNames(exportStarSet = [])
+function ModuleGetExportedNames(exportStarSet = new_List())
{
if (!IsObject(this) || !IsModule(this)) {
return callFunction(CallModuleMethodIfWrapped, this, exportStarSet,
@@ -26,13 +26,13 @@ function ModuleGetExportedNames(exportStarSet = [])
// Step 4
if (callFunction(std_Array_includes, exportStarSet, module))
- return [];
+ return new_List();
// Step 5
DefineDataProperty(exportStarSet, exportStarSet.length, module);
// Step 6
- let exportedNames = [];
+ let exportedNames = new_List();
let namesCount = 0;
// Step 7
@@ -99,7 +99,7 @@ function ModuleSetStatus(module, newStatus)
// - If the request is found to be ambiguous, the string `"ambiguous"` is
// returned.
//
-function ModuleResolveExport(exportName, resolveSet = [])
+function ModuleResolveExport(exportName, resolveSet = new_List())
{
assert(typeof exportName === "string", "ModuleResolveExport");
@@ -206,7 +206,7 @@ function GetModuleNamespace(module)
// Step 4
if (typeof namespace === "undefined") {
let exportedNames = callFunction(module.getExportedNames, module);
- let unambiguousNames = [];
+ let unambiguousNames = new_List();
for (let i = 0; i < exportedNames.length; i++) {
let name = exportedNames[i];
let resolution = callFunction(module.resolveExport, module, name);
@@ -312,7 +312,7 @@ function ModuleInstantiate()
}
// Step 3
- let stack = [];
+ let stack = new_List();
// Steps 4-5
try {
@@ -601,7 +601,7 @@ function ModuleEvaluate()
const capability = CreateTopLevelCapability(module);
// Step 4
- let stack = [];
+ let stack = new_List();
// Steps 5-6
try {
@@ -746,7 +746,7 @@ function InnerModuleEvaluation(module, stack, index)
}
// https://tc39.es/proposal-top-level-await/#sec-gather-async-parent-completions
-function GatherAsyncParentCompletions(module, execList = []) {
+function GatherAsyncParentCompletions(module, execList = new_List()) {
assert(module.status == MODULE_STATUS_EVALUATED, "bad status for async module");
// Step 5.
diff --git a/js/src/builtin/RegExp.js b/js/src/builtin/RegExp.js
index 81b5d6f34c119..619664288c86a 100644
--- a/js/src/builtin/RegExp.js
+++ b/js/src/builtin/RegExp.js
@@ -349,7 +349,7 @@ function RegExpReplaceSlowPath(rx, S, lengthS, replaceValue,
}
// Step 9.
- var results = [];
+ var results = new_List();
var nResults = 0;
// Step 11.
@@ -456,7 +456,7 @@ function RegExpGetComplexReplacement(result, matched, S, position,
functionalReplace, firstDollarIndex)
{
// Step 14.h.
- var captures = [];
+ var captures = new_List();
var capturesLength = 0;
// Step 14.k.i (reordered).
@@ -546,7 +546,7 @@ function RegExpGetFunctionalReplacement(result, S, position, replaceValue) {
}
// Steps 14.g-i, 14.k.i-ii.
- var captures = [];
+ var captures = new_List();
for (var n = 0; n <= nCaptures; n++) {
assert(typeof result[n] === "string" || result[n] === undefined,
"RegExpMatcher returns only strings and undefined");
diff --git a/js/src/builtin/Utilities.js b/js/src/builtin/Utilities.js
index 64ea59e4f2a2a..18400b490b6ef 100644
--- a/js/src/builtin/Utilities.js
+++ b/js/src/builtin/Utilities.js
@@ -27,16 +27,7 @@
// code are installed via the std_functions JSFunctionSpec[] in
// SelfHosting.cpp.
-/********** List / Record specification types **********/
-
-// A "List" is an internal type used in the ECMAScript spec to define a simple
-// ordered list of values. It is never exposed to user script, but we use a
-// simple Object (with null prototype) as a convenient implementation.
-//
-// NOTE: This does not track a `length` field.
-function new_List() {
- return std_Object_create(null);
-}
+/********** Specification types **********/
// A "Record" is an internal type used in the ECMAScript spec to define a struct
diff --git a/js/src/vm/SelfHosting.cpp b/js/src/vm/SelfHosting.cpp
index 0f55de73b2928..bd0840daf350a 100644
--- a/js/src/vm/SelfHosting.cpp
+++ b/js/src/vm/SelfHosting.cpp
@@ -2491,6 +2491,7 @@ static const JSFunctionSpec intrinsic_functions[] = {
#endif // JS_HAS_INTL_API
// Standard builtins used by self-hosting.
+ JS_FN("new_List", intrinsic_newList, 0, 0),
JS_INLINABLE_FN("std_Array", array_construct, 1, 0, Array),
JS_FN("std_Array_includes", array_includes, 1, 0),
JS_FN("std_Array_indexOf", array_indexOf, 1, 0),
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the tor-commits
mailing list