mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 21:57:35 +00:00
LibJS: Make GetIterator's hint parameter required
This is an editorial change in the ECMA-262 spec. See:
2562811
This commit is contained in:
parent
5703833116
commit
1760361304
7 changed files with 25 additions and 26 deletions
|
@ -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
|
||||
|
|
|
@ -2669,12 +2669,12 @@ static Bytecode::CodeGenerationErrorOr<ForInOfHeadEvaluationResult> 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<Bytecode::Op::GetIterator>(iterator_hint);
|
||||
// d. Return ? GetIterator(exprValue, iteratorKind).
|
||||
generator.emit<Bytecode::Op::GetIterator>(iterator_kind);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
|
|
@ -226,7 +226,8 @@ ThrowCompletionOr<GroupsType> 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;
|
||||
|
|
|
@ -34,15 +34,13 @@ ThrowCompletionOr<IteratorRecord> get_iterator_from_method(VM& vm, Value object,
|
|||
return iterator_record;
|
||||
}
|
||||
|
||||
// 7.4.3 GetIterator ( obj [ , hint ] ), https://tc39.es/ecma262/#sec-getiterator
|
||||
ThrowCompletionOr<IteratorRecord> get_iterator(VM& vm, Value object, IteratorHint hint)
|
||||
// 7.4.3 GetIterator ( obj, kind ), https://tc39.es/ecma262/#sec-getiterator
|
||||
ThrowCompletionOr<IteratorRecord> get_iterator(VM& vm, Value object, IteratorHint kind)
|
||||
{
|
||||
JS::GCPtr<FunctionObject> 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<IteratorRecord> 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<IteratorRecord> get_iterator(VM& vm, Value object, IteratorHin
|
|||
if (!method)
|
||||
return vm.throw_completion<TypeError>(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));
|
||||
}
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ enum class IteratorHint {
|
|||
};
|
||||
|
||||
ThrowCompletionOr<IteratorRecord> get_iterator_from_method(VM&, Value, NonnullGCPtr<FunctionObject>);
|
||||
ThrowCompletionOr<IteratorRecord> get_iterator(VM&, Value, IteratorHint = IteratorHint::Sync);
|
||||
ThrowCompletionOr<IteratorRecord> get_iterator(VM&, Value, IteratorHint);
|
||||
ThrowCompletionOr<NonnullGCPtr<Object>> iterator_next(VM&, IteratorRecord const&, Optional<Value> = {});
|
||||
ThrowCompletionOr<GCPtr<Object>> iterator_step(VM&, IteratorRecord const&);
|
||||
ThrowCompletionOr<bool> iterator_complete(VM&, Object& iterator_result);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -337,8 +337,8 @@ ThrowCompletionOr<void> VM::binding_initialization(NonnullRefPtr<BindingPattern
|
|||
}
|
||||
// BindingPattern : ArrayBindingPattern
|
||||
else {
|
||||
// 1. Let iteratorRecord be ? GetIterator(value).
|
||||
auto iterator_record = TRY(get_iterator(vm, value));
|
||||
// 1. Let iteratorRecord be ? GetIterator(value, sync).
|
||||
auto iterator_record = TRY(get_iterator(vm, value, IteratorHint::Sync));
|
||||
|
||||
// 2. Let result be Completion(IteratorBindingInitialization of ArrayBindingPattern with arguments iteratorRecord and environment).
|
||||
auto result = iterator_binding_initialization(*target, iterator_record, environment);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue