Jelajahi Sumber

LibJS: Rename IterableToList to IteratorToList

This is an editorial change in the ECMA-262 spec. See:
https://github.com/tc39/ecma262/commit/ff60140

In doing so, as the new name implies, callsites are updated to pass in
an IteratorRecord themselves, rather than an iterable value.
Timothy Flynn 2 tahun lalu
induk
melakukan
a7a109062a

+ 2 - 2
Userland/Libraries/LibJS/Runtime/AggregateErrorConstructor.cpp

@@ -64,8 +64,8 @@ ThrowCompletionOr<NonnullGCPtr<Object>> AggregateErrorConstructor::construct(Fun
     // 4. Perform ? InstallErrorCause(O, options).
     TRY(aggregate_error->install_error_cause(options));
 
-    // 5. Let errorsList be ? IterableToList(errors).
-    auto errors_list = TRY(iterable_to_list(vm, errors));
+    // 5. Let errorsList be ? IteratorToList(? GetIterator(errors, sync)).
+    auto errors_list = TRY(iterator_to_list(vm, TRY(get_iterator(vm, errors, IteratorHint::Sync))));
 
     // 6. Perform ! DefinePropertyOrThrow(O, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errorsList) }).
     MUST(aggregate_error->define_property_or_throw(vm.names.errors, { .value = Array::create_from(realm, errors_list), .writable = true, .enumerable = false, .configurable = true }));

+ 6 - 19
Userland/Libraries/LibJS/Runtime/IteratorOperations.cpp

@@ -208,29 +208,16 @@ NonnullGCPtr<Object> create_iterator_result_object(VM& vm, Value value, bool don
     return object;
 }
 
-// 7.4.13 IterableToList ( items [ , method ] ), https://tc39.es/ecma262/#sec-iterabletolist
-ThrowCompletionOr<MarkedVector<Value>> iterable_to_list(VM& vm, Value items, GCPtr<FunctionObject> method)
+// 7.4.13 IteratorToList ( iteratorRecord ), https://tc39.es/ecma262/#sec-iteratortolist
+ThrowCompletionOr<MarkedVector<Value>> iterator_to_list(VM& vm, IteratorRecord const& iterator_record)
 {
-    IteratorRecord iterator_record;
-
-    // 1. If method is present, then
-    if (method) {
-        // a. Let iteratorRecord be ? GetIteratorFromMethod(items, method).
-        iterator_record = TRY(get_iterator_from_method(vm, items, *method));
-    }
-    // 2. Else,
-    else {
-        // b. Let iteratorRecord be ? GetIterator(items, sync).
-        iterator_record = TRY(get_iterator(vm, items, IteratorHint::Sync));
-    }
-
-    // 3. Let values be a new empty List.
+    // 1. Let values be a new empty List.
     MarkedVector<Value> values(vm.heap());
 
-    // 4. Let next be true.
+    // 2. Let next be true.
     GCPtr<Object> next;
 
-    // 5. Repeat, while next is not false,
+    // 3. Repeat, while next is not false,
     do {
         // a. Set next to ? IteratorStep(iteratorRecord).
         next = TRY(iterator_step(vm, iterator_record));
@@ -245,7 +232,7 @@ ThrowCompletionOr<MarkedVector<Value>> iterable_to_list(VM& vm, Value items, GCP
         }
     } while (next);
 
-    // 6. Return values.
+    // 4. Return values.
     return values;
 }
 

+ 1 - 1
Userland/Libraries/LibJS/Runtime/IteratorOperations.h

@@ -31,7 +31,7 @@ ThrowCompletionOr<Value> iterator_value(VM&, Object& iterator_result);
 Completion iterator_close(VM&, IteratorRecord const&, Completion);
 Completion async_iterator_close(VM&, IteratorRecord const&, Completion);
 NonnullGCPtr<Object> create_iterator_result_object(VM&, Value, bool done);
-ThrowCompletionOr<MarkedVector<Value>> iterable_to_list(VM&, Value iterable, GCPtr<FunctionObject> method = {});
+ThrowCompletionOr<MarkedVector<Value>> iterator_to_list(VM&, IteratorRecord const&);
 
 using IteratorValueCallback = Function<Optional<Completion>(Value)>;
 Completion get_iterator_values(VM&, Value iterable, IteratorValueCallback callback);

+ 1 - 1
Userland/Libraries/LibJS/Runtime/TypedArray.cpp

@@ -529,7 +529,7 @@ void TypedArrayBase::visit_edges(Visitor& visitor)
             } else {                                                                                                                                                                   \
                 auto iterator = TRY(first_argument.get_method(vm, vm.well_known_symbol_iterator()));                                                                                   \
                 if (iterator) {                                                                                                                                                        \
-                    auto values = TRY(iterable_to_list(vm, first_argument, iterator));                                                                                                 \
+                    auto values = TRY(iterator_to_list(vm, TRY(get_iterator_from_method(vm, first_argument, *iterator))));                                                             \
                     TRY(initialize_typed_array_from_list(vm, *typed_array, values));                                                                                                   \
                 } else {                                                                                                                                                               \
                     TRY(initialize_typed_array_from_array_like(vm, *typed_array, first_argument.as_object()));                                                                         \

+ 1 - 1
Userland/Libraries/LibJS/Runtime/TypedArrayConstructor.cpp

@@ -86,7 +86,7 @@ JS_DEFINE_NATIVE_FUNCTION(TypedArrayConstructor::from)
     // 6. If usingIterator is not undefined, then
     if (using_iterator) {
         // a. Let values be ? IteratorToList(? GetIteratorFromMethod(source, usingIterator)).
-        auto values = TRY(iterable_to_list(vm, source, using_iterator));
+        auto values = TRY(iterator_to_list(vm, TRY(get_iterator_from_method(vm, source, *using_iterator))));
 
         // b. Let len be the number of elements in values.
         auto length = values.size();

+ 1 - 1
Userland/Libraries/LibWeb/WebAssembly/WebAssembly.cpp

@@ -203,7 +203,7 @@ JS::ThrowCompletionOr<size_t> instantiate_module(JS::VM& vm, Wasm::Module const&
                             if (method == JS::js_undefined())
                                 return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotIterable, TRY_OR_THROW_OOM(vm, result.to_string_without_side_effects()));
 
-                            auto values = TRY(JS::iterable_to_list(vm, result, method));
+                            auto values = TRY(JS::iterator_to_list(vm, TRY(JS::get_iterator_from_method(vm, result, *method))));
 
                             if (values.size() != type.results().size())
                                 return vm.throw_completion<JS::TypeError>(DeprecatedString::formatted("Invalid number of return values for multi-value wasm return of {} objects", type.results().size()));