1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 19:57:35 +00:00

LibJS: Convert GetIterator AO to ThrowCompletionOr

This commit is contained in:
Timothy Flynn 2021-10-20 08:24:54 -04:00 committed by Linus Groh
parent a3b3800cd4
commit 860a37640b
9 changed files with 56 additions and 48 deletions

View file

@ -12,24 +12,23 @@
namespace JS {
// 7.4.1 GetIterator ( obj [ , hint [ , method ] ] ), https://tc39.es/ecma262/#sec-getiterator
Object* get_iterator(GlobalObject& global_object, Value value, IteratorHint hint, Value method)
ThrowCompletionOr<Object*> get_iterator(GlobalObject& global_object, Value value, IteratorHint hint, Value method)
{
auto& vm = global_object.vm();
if (method.is_empty()) {
if (hint == IteratorHint::Async)
TODO();
auto object = TRY_OR_DISCARD(value.to_object(global_object));
method = TRY_OR_DISCARD(object->get(*vm.well_known_symbol_iterator()));
}
if (!method.is_function()) {
vm.throw_exception<TypeError>(global_object, ErrorType::NotIterable, value.to_string_without_side_effects());
return nullptr;
}
auto iterator = TRY_OR_DISCARD(vm.call(method.as_function(), value));
if (!iterator.is_object()) {
vm.throw_exception<TypeError>(global_object, ErrorType::NotIterable, value.to_string_without_side_effects());
return nullptr;
auto object = TRY(value.to_object(global_object));
method = TRY(object->get(*vm.well_known_symbol_iterator()));
}
if (!method.is_function())
return vm.throw_completion<TypeError>(global_object, ErrorType::NotIterable, value.to_string_without_side_effects());
auto iterator = TRY(vm.call(method.as_function(), value));
if (!iterator.is_object())
return vm.throw_completion<TypeError>(global_object, ErrorType::NotIterable, value.to_string_without_side_effects());
return &iterator.as_object();
}
@ -170,9 +169,10 @@ void get_iterator_values(GlobalObject& global_object, Value value, Function<Iter
{
auto& vm = global_object.vm();
auto iterator = get_iterator(global_object, value, IteratorHint::Sync, method);
if (!iterator)
auto iterator_or_error = get_iterator(global_object, value, IteratorHint::Sync, method);
if (iterator_or_error.is_error())
return;
auto* iterator = iterator_or_error.release_value();
while (true) {
auto next_object = iterator_next(*iterator);