From 03b251a70451bf062885a7a6e749f91b63af6a6b Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Wed, 20 Oct 2021 13:41:27 -0400 Subject: [PATCH] LibJS: Convert IterableToList AO to ThrowCompletionOr --- .../Libraries/LibJS/Runtime/AggregateErrorConstructor.cpp | 4 +--- Userland/Libraries/LibJS/Runtime/IteratorOperations.cpp | 8 ++++---- Userland/Libraries/LibJS/Runtime/IteratorOperations.h | 2 +- Userland/Libraries/LibJS/Runtime/TypedArray.cpp | 4 +--- .../Libraries/LibJS/Runtime/TypedArrayConstructor.cpp | 4 +--- 5 files changed, 8 insertions(+), 14 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/AggregateErrorConstructor.cpp b/Userland/Libraries/LibJS/Runtime/AggregateErrorConstructor.cpp index 511e9d798a..ae6a1cb7d5 100644 --- a/Userland/Libraries/LibJS/Runtime/AggregateErrorConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/AggregateErrorConstructor.cpp @@ -51,9 +51,7 @@ Value AggregateErrorConstructor::construct(FunctionObject& new_target) TRY_OR_DISCARD(aggregate_error->install_error_cause(vm.argument(2))); - auto errors_list = iterable_to_list(global_object, vm.argument(0)); - if (vm.exception()) - return {}; + auto errors_list = TRY_OR_DISCARD(iterable_to_list(global_object, vm.argument(0))); MUST(aggregate_error->define_property_or_throw(vm.names.errors, { .value = Array::create_from(global_object, errors_list), .writable = true, .enumerable = false, .configurable = true })); diff --git a/Userland/Libraries/LibJS/Runtime/IteratorOperations.cpp b/Userland/Libraries/LibJS/Runtime/IteratorOperations.cpp index a0a1a894ed..543ed6b641 100644 --- a/Userland/Libraries/LibJS/Runtime/IteratorOperations.cpp +++ b/Userland/Libraries/LibJS/Runtime/IteratorOperations.cpp @@ -147,19 +147,19 @@ Object* create_iterator_result_object(GlobalObject& global_object, Value value, } // 7.4.10 IterableToList ( items [ , method ] ), https://tc39.es/ecma262/#sec-iterabletolist -MarkedValueList iterable_to_list(GlobalObject& global_object, Value iterable, Value method) +ThrowCompletionOr iterable_to_list(GlobalObject& global_object, Value iterable, Value method) { auto& vm = global_object.vm(); MarkedValueList values(vm.heap()); - (void)get_iterator_values( + TRY(get_iterator_values( global_object, iterable, [&](auto value) -> Optional { values.append(value); return {}; }, - method); + method)); - return values; + return { move(values) }; } Completion get_iterator_values(GlobalObject& global_object, Value iterable, IteratorValueCallback callback, Value method) diff --git a/Userland/Libraries/LibJS/Runtime/IteratorOperations.h b/Userland/Libraries/LibJS/Runtime/IteratorOperations.h index 385b275250..636e9fef46 100644 --- a/Userland/Libraries/LibJS/Runtime/IteratorOperations.h +++ b/Userland/Libraries/LibJS/Runtime/IteratorOperations.h @@ -27,7 +27,7 @@ ThrowCompletionOr iterator_complete(GlobalObject&, Object& iterator_result ThrowCompletionOr iterator_value(GlobalObject&, Object& iterator_result); Completion iterator_close(Object& iterator, Completion completion); Object* create_iterator_result_object(GlobalObject&, Value value, bool done); -MarkedValueList iterable_to_list(GlobalObject&, Value iterable, Value method = {}); +ThrowCompletionOr iterable_to_list(GlobalObject&, Value iterable, Value method = {}); using IteratorValueCallback = Function(Value)>; Completion get_iterator_values(GlobalObject& global_object, Value iterable, IteratorValueCallback callback, Value method = {}); diff --git a/Userland/Libraries/LibJS/Runtime/TypedArray.cpp b/Userland/Libraries/LibJS/Runtime/TypedArray.cpp index e78aaf3740..d3cc6ea433 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArray.cpp +++ b/Userland/Libraries/LibJS/Runtime/TypedArray.cpp @@ -465,9 +465,7 @@ void TypedArrayBase::visit_edges(Visitor& visitor) } else { \ auto iterator = TRY_OR_DISCARD(first_argument.get_method(global_object(), *vm.well_known_symbol_iterator())); \ if (iterator) { \ - auto values = iterable_to_list(global_object(), first_argument, iterator); \ - if (vm.exception()) \ - return {}; \ + auto values = TRY_OR_DISCARD(iterable_to_list(global_object(), first_argument, iterator)); \ TRY_OR_DISCARD(initialize_typed_array_from_list(global_object(), *typed_array, values)); \ } else { \ TRY_OR_DISCARD(initialize_typed_array_from_array_like(global_object(), *typed_array, first_argument.as_object())); \ diff --git a/Userland/Libraries/LibJS/Runtime/TypedArrayConstructor.cpp b/Userland/Libraries/LibJS/Runtime/TypedArrayConstructor.cpp index e98fa19824..614f3976cd 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArrayConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/TypedArrayConstructor.cpp @@ -79,9 +79,7 @@ JS_DEFINE_OLD_NATIVE_FUNCTION(TypedArrayConstructor::from) auto using_iterator = TRY_OR_DISCARD(source.get_method(global_object, *vm.well_known_symbol_iterator())); if (using_iterator) { - auto values = iterable_to_list(global_object, source, using_iterator); - if (vm.exception()) - return {}; + auto values = TRY_OR_DISCARD(iterable_to_list(global_object, source, using_iterator)); MarkedValueList arguments(vm.heap()); arguments.empend(values.size());