commit 3bd23014b758ca15d96769ef64cf053862b8f51a
parent 7f7402dfe6120d8880602a6cf8b1415b88010b70
Author: Iain Ireland <iireland@mozilla.com>
Date: Thu, 13 Nov 2025 23:37:51 +0000
Bug 1998297: Use a macro for CreateArrayIterator r=jandem
Differential Revision: https://phabricator.services.mozilla.com/D271333
Diffstat:
3 files changed, 15 insertions(+), 16 deletions(-)
diff --git a/js/src/builtin/Array.js b/js/src/builtin/Array.js
@@ -514,16 +514,6 @@ function ArrayFill(value, start = 0, end = undefined) {
return O;
}
-// ES6 draft specification, section 22.1.5.1, version 2013-09-05.
-function CreateArrayIterator(obj, kind) {
- var iteratedObject = ToObject(obj);
- var iterator = NewArrayIterator();
- UnsafeSetReservedSlot(iterator, ITERATOR_SLOT_TARGET, iteratedObject);
- UnsafeSetReservedSlot(iterator, ITERATOR_SLOT_NEXT_INDEX, 0);
- UnsafeSetReservedSlot(iterator, ARRAY_ITERATOR_SLOT_ITEM_KIND, kind);
- return iterator;
-}
-
// ES6, 22.1.5.2.1
// http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%arrayiteratorprototype%.next
function ArrayIteratorNext() {
@@ -603,16 +593,16 @@ SetIsInlinableLargeFunction(ArrayIteratorNext);
// Uncloned functions with `$` prefix are allocated as extended function
// to store the original name in `SetCanonicalName`.
function $ArrayValues() {
- return CreateArrayIterator(this, ITEM_KIND_VALUE);
+ RETURN_ARRAY_ITERATOR(this, ITEM_KIND_VALUE);
}
SetCanonicalName($ArrayValues, "values");
function ArrayEntries() {
- return CreateArrayIterator(this, ITEM_KIND_KEY_AND_VALUE);
+ RETURN_ARRAY_ITERATOR(this, ITEM_KIND_KEY_AND_VALUE);
}
function ArrayKeys() {
- return CreateArrayIterator(this, ITEM_KIND_KEY);
+ RETURN_ARRAY_ITERATOR(this, ITEM_KIND_KEY);
}
// https://tc39.es/proposal-array-from-async/
diff --git a/js/src/builtin/SelfHostingDefines.h b/js/src/builtin/SelfHostingDefines.h
@@ -87,6 +87,15 @@
// Item kind for Map/Set iterators.
#define MAP_SET_ITERATOR_SLOT_ITEM_KIND 1
+/* Spec: https://tc39.es/ecma262/#sec-createarrayiterator */
+#define RETURN_ARRAY_ITERATOR(obj, kind) \
+ var iteratedObject = ToObject(obj); \
+ var iterator = NewArrayIterator(); \
+ UnsafeSetReservedSlot(iterator, ITERATOR_SLOT_TARGET, iteratedObject); \
+ UnsafeSetReservedSlot(iterator, ITERATOR_SLOT_NEXT_INDEX, 0); \
+ UnsafeSetReservedSlot(iterator, ARRAY_ITERATOR_SLOT_ITEM_KIND, kind); \
+ return iterator
+
#define ITEM_KIND_KEY 0
#define ITEM_KIND_VALUE 1
#define ITEM_KIND_KEY_AND_VALUE 2
diff --git a/js/src/builtin/TypedArray.js b/js/src/builtin/TypedArray.js
@@ -214,7 +214,7 @@ function TypedArrayEntries() {
PossiblyWrappedTypedArrayLength(O);
// Step 7.
- return CreateArrayIterator(O, ITEM_KIND_KEY_AND_VALUE);
+ RETURN_ARRAY_ITERATOR(O, ITEM_KIND_KEY_AND_VALUE);
}
// ES2021 draft rev 190d474c3d8728653fbf8a5a37db1de34b9c1472
@@ -456,7 +456,7 @@ function TypedArrayKeys() {
PossiblyWrappedTypedArrayLength(O);
// Step 3.
- return CreateArrayIterator(O, ITEM_KIND_KEY);
+ RETURN_ARRAY_ITERATOR(O, ITEM_KIND_KEY);
}
// ES2017 draft rev 6859bb9ccaea9c6ede81d71e5320e3833b92cb3e
@@ -879,7 +879,7 @@ function $TypedArrayValues() {
PossiblyWrappedTypedArrayLength(O);
// Step 7.
- return CreateArrayIterator(O, ITEM_KIND_VALUE);
+ RETURN_ARRAY_ITERATOR(O, ITEM_KIND_VALUE);
}
SetCanonicalName($TypedArrayValues, "values");