From 1760361304b26328fa631e1ced4744a6fa57cd1e Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Tue, 18 Jul 2023 14:52:21 -0400 Subject: [PATCH] LibJS: Make GetIterator's hint parameter required This is an editorial change in the ECMA-262 spec. See: https://github.com/tc39/ecma262/commit/2562811 --- Userland/Libraries/LibJS/AST.cpp | 2 +- Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp | 10 +++++----- .../Libraries/LibJS/Runtime/AbstractOperations.h | 3 ++- .../LibJS/Runtime/IteratorOperations.cpp | 14 ++++++-------- .../Libraries/LibJS/Runtime/IteratorOperations.h | 2 +- .../LibJS/Runtime/PromiseConstructor.cpp | 16 ++++++++-------- Userland/Libraries/LibJS/Runtime/VM.cpp | 4 ++-- 7 files changed, 25 insertions(+), 26 deletions(-) diff --git a/Userland/Libraries/LibJS/AST.cpp b/Userland/Libraries/LibJS/AST.cpp index 287b0fb1ac..99f1161238 100644 --- a/Userland/Libraries/LibJS/AST.cpp +++ b/Userland/Libraries/LibJS/AST.cpp @@ -1295,7 +1295,7 @@ Completion ForAwaitOfStatement::loop_evaluation(Interpreter& interpreter, Vector auto rhs_result = for_of_head_state.rhs_value; // NOTE: Perform step 7 from ForIn/OfHeadEvaluation. And since this is always async we only have to do step 7.d. - // d. Return ? GetIterator(exprValue, iteratorHint). + // d. Return ? GetIterator(exprValue, iteratorKind). auto iterator = TRY(get_iterator(vm, rhs_result, IteratorHint::Async)); // 14.7.5.7 ForIn/OfBodyEvaluation ( lhs, stmt, iteratorRecord, iterationKind, lhsKind, labelSet [ , iteratorKind ] ), https://tc39.es/ecma262/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 01508440ae..23c5a17299 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -2669,12 +2669,12 @@ static Bytecode::CodeGenerationErrorOr for_in_of_he // 7. Else, else { // a. Assert: iterationKind is iterate or async-iterate. - // b. If iterationKind is async-iterate, let iteratorHint be async. - // c. Else, let iteratorHint be sync. - auto iterator_hint = iteration_kind == IterationKind::AsyncIterate ? IteratorHint::Async : IteratorHint::Sync; + // b. If iterationKind is async-iterate, let iteratorKind be async. + // c. Else, let iteratorKind be sync. + auto iterator_kind = iteration_kind == IterationKind::AsyncIterate ? IteratorHint::Async : IteratorHint::Sync; - // d. Return ? GetIterator(exprValue, iteratorHint). - generator.emit(iterator_hint); + // d. Return ? GetIterator(exprValue, iteratorKind). + generator.emit(iterator_kind); } return result; diff --git a/Userland/Libraries/LibJS/Runtime/AbstractOperations.h b/Userland/Libraries/LibJS/Runtime/AbstractOperations.h index 0d151ffae9..153a03f6d6 100644 --- a/Userland/Libraries/LibJS/Runtime/AbstractOperations.h +++ b/Userland/Libraries/LibJS/Runtime/AbstractOperations.h @@ -226,7 +226,8 @@ ThrowCompletionOr group_by(VM& vm, Value items, Value callback_funct GroupsType groups; // 4. Let iteratorRecord be ? GetIterator(items). - auto iterator_record = TRY(get_iterator(vm, items)); + // FIXME: The Array Grouping proposal is out of date - the `kind` parameter is now required. + auto iterator_record = TRY(get_iterator(vm, items, IteratorHint::Sync)); // 5. Let k be 0. u64 k = 0; diff --git a/Userland/Libraries/LibJS/Runtime/IteratorOperations.cpp b/Userland/Libraries/LibJS/Runtime/IteratorOperations.cpp index 1a6e6ea3f9..44990c6e02 100644 --- a/Userland/Libraries/LibJS/Runtime/IteratorOperations.cpp +++ b/Userland/Libraries/LibJS/Runtime/IteratorOperations.cpp @@ -34,15 +34,13 @@ ThrowCompletionOr get_iterator_from_method(VM& vm, Value object, return iterator_record; } -// 7.4.3 GetIterator ( obj [ , hint ] ), https://tc39.es/ecma262/#sec-getiterator -ThrowCompletionOr get_iterator(VM& vm, Value object, IteratorHint hint) +// 7.4.3 GetIterator ( obj, kind ), https://tc39.es/ecma262/#sec-getiterator +ThrowCompletionOr get_iterator(VM& vm, Value object, IteratorHint kind) { JS::GCPtr method; - // 1. If hint is not present, set hint to sync. - - // 2. If hint is async, then - if (hint == IteratorHint::Async) { + // 1. If kind is async, then + if (kind == IteratorHint::Async) { // a. Let method be ? GetMethod(obj, @@asyncIterator). method = TRY(object.get_method(vm, vm.well_known_symbol_async_iterator())); @@ -62,7 +60,7 @@ ThrowCompletionOr get_iterator(VM& vm, Value object, IteratorHin return create_async_from_sync_iterator(vm, sync_iterator_record); } } - // 3. Else, + // 2. Else, else { // a. Let method be ? GetMethod(obj, @@iterator). method = TRY(object.get_method(vm, vm.well_known_symbol_iterator())); @@ -72,7 +70,7 @@ ThrowCompletionOr get_iterator(VM& vm, Value object, IteratorHin if (!method) return vm.throw_completion(ErrorType::NotIterable, TRY_OR_THROW_OOM(vm, object.to_string_without_side_effects())); - // 4. Return ? GetIteratorFromMethod(obj, method). + // 3. Return ? GetIteratorFromMethod(obj, method). return TRY(get_iterator_from_method(vm, object, *method)); } diff --git a/Userland/Libraries/LibJS/Runtime/IteratorOperations.h b/Userland/Libraries/LibJS/Runtime/IteratorOperations.h index 1629491263..f7b9a17305 100644 --- a/Userland/Libraries/LibJS/Runtime/IteratorOperations.h +++ b/Userland/Libraries/LibJS/Runtime/IteratorOperations.h @@ -23,7 +23,7 @@ enum class IteratorHint { }; ThrowCompletionOr get_iterator_from_method(VM&, Value, NonnullGCPtr); -ThrowCompletionOr get_iterator(VM&, Value, IteratorHint = IteratorHint::Sync); +ThrowCompletionOr get_iterator(VM&, Value, IteratorHint); ThrowCompletionOr> iterator_next(VM&, IteratorRecord const&, Optional = {}); ThrowCompletionOr> iterator_step(VM&, IteratorRecord const&); ThrowCompletionOr iterator_complete(VM&, Object& iterator_result); diff --git a/Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp b/Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp index 754dbf0ca5..864deccaad 100644 --- a/Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp @@ -324,9 +324,9 @@ JS_DEFINE_NATIVE_FUNCTION(PromiseConstructor::all) // 4. IfAbruptRejectPromise(promiseResolve, promiseCapability). auto promise_resolve = TRY_OR_REJECT(vm, promise_capability, get_promise_resolve(vm, constructor)); - // 5. Let iteratorRecord be Completion(GetIterator(iterable)). + // 5. Let iteratorRecord be Completion(GetIterator(iterable, sync)). // 6. IfAbruptRejectPromise(iteratorRecord, promiseCapability). - auto iterator_record = TRY_OR_REJECT(vm, promise_capability, get_iterator(vm, vm.argument(0))); + auto iterator_record = TRY_OR_REJECT(vm, promise_capability, get_iterator(vm, vm.argument(0), IteratorHint::Sync)); // 7. Let result be Completion(PerformPromiseAll(iteratorRecord, C, promiseCapability, promiseResolve)). auto result = perform_promise_all(vm, iterator_record, constructor, promise_capability, promise_resolve); @@ -358,9 +358,9 @@ JS_DEFINE_NATIVE_FUNCTION(PromiseConstructor::all_settled) // 4. IfAbruptRejectPromise(promiseResolve, promiseCapability). auto promise_resolve = TRY_OR_REJECT(vm, promise_capability, get_promise_resolve(vm, constructor)); - // 5. Let iteratorRecord be Completion(GetIterator(iterable)). + // 5. Let iteratorRecord be Completion(GetIterator(iterable, sync)). // 6. IfAbruptRejectPromise(iteratorRecord, promiseCapability). - auto iterator_record = TRY_OR_REJECT(vm, promise_capability, get_iterator(vm, vm.argument(0))); + auto iterator_record = TRY_OR_REJECT(vm, promise_capability, get_iterator(vm, vm.argument(0), IteratorHint::Sync)); // 7. Let result be Completion(PerformPromiseAllSettled(iteratorRecord, C, promiseCapability, promiseResolve)). auto result = perform_promise_all_settled(vm, iterator_record, constructor, promise_capability, promise_resolve); @@ -392,9 +392,9 @@ JS_DEFINE_NATIVE_FUNCTION(PromiseConstructor::any) // 4. IfAbruptRejectPromise(promiseResolve, promiseCapability). auto promise_resolve = TRY_OR_REJECT(vm, promise_capability, get_promise_resolve(vm, constructor)); - // 5. Let iteratorRecord be Completion(GetIterator(iterable)). + // 5. Let iteratorRecord be Completion(GetIterator(iterable, sync)). // 6. IfAbruptRejectPromise(iteratorRecord, promiseCapability). - auto iterator_record = TRY_OR_REJECT(vm, promise_capability, get_iterator(vm, vm.argument(0))); + auto iterator_record = TRY_OR_REJECT(vm, promise_capability, get_iterator(vm, vm.argument(0), IteratorHint::Sync)); // 7. Let result be Completion(PerformPromiseAny(iteratorRecord, C, promiseCapability, promiseResolve)). auto result = perform_promise_any(vm, iterator_record, constructor, promise_capability, promise_resolve); @@ -426,9 +426,9 @@ JS_DEFINE_NATIVE_FUNCTION(PromiseConstructor::race) // 4. IfAbruptRejectPromise(promiseResolve, promiseCapability). auto promise_resolve = TRY_OR_REJECT(vm, promise_capability, get_promise_resolve(vm, constructor)); - // 5. Let iteratorRecord be Completion(GetIterator(iterable)). + // 5. Let iteratorRecord be Completion(GetIterator(iterable, sync)). // 6. IfAbruptRejectPromise(iteratorRecord, promiseCapability). - auto iterator_record = TRY_OR_REJECT(vm, promise_capability, get_iterator(vm, vm.argument(0))); + auto iterator_record = TRY_OR_REJECT(vm, promise_capability, get_iterator(vm, vm.argument(0), IteratorHint::Sync)); // 7. Let result be Completion(PerformPromiseRace(iteratorRecord, C, promiseCapability, promiseResolve)). auto result = perform_promise_race(vm, iterator_record, constructor, promise_capability, promise_resolve); diff --git a/Userland/Libraries/LibJS/Runtime/VM.cpp b/Userland/Libraries/LibJS/Runtime/VM.cpp index 15a9dfab98..7df48f5100 100644 --- a/Userland/Libraries/LibJS/Runtime/VM.cpp +++ b/Userland/Libraries/LibJS/Runtime/VM.cpp @@ -337,8 +337,8 @@ ThrowCompletionOr VM::binding_initialization(NonnullRefPtr