From e141f1e976647735868c1c8efe6a8374b70461b9 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Sun, 9 Jan 2022 19:00:07 +0100 Subject: [PATCH] LibJS: Use Optional for potentially missing value in Iterator AOs Given we're already moving away from using the empty Value elsewhere, and I'm about to update most of this code, let's do this small tweak now. --- .../LibJS/Runtime/IteratorOperations.cpp | 22 +++++++++---------- .../LibJS/Runtime/IteratorOperations.h | 8 +++---- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/IteratorOperations.cpp b/Userland/Libraries/LibJS/Runtime/IteratorOperations.cpp index 691e13046e..56345afcb0 100644 --- a/Userland/Libraries/LibJS/Runtime/IteratorOperations.cpp +++ b/Userland/Libraries/LibJS/Runtime/IteratorOperations.cpp @@ -15,10 +15,10 @@ namespace JS { // 7.4.1 GetIterator ( obj [ , hint [ , method ] ] ), https://tc39.es/ecma262/#sec-getiterator -ThrowCompletionOr get_iterator(GlobalObject& global_object, Value value, IteratorHint hint, Value method) +ThrowCompletionOr get_iterator(GlobalObject& global_object, Value value, IteratorHint hint, Optional method) { auto& vm = global_object.vm(); - if (method.is_empty()) { + if (!method.has_value()) { if (hint == IteratorHint::Async) { auto* async_method = TRY(value.get_method(global_object, *vm.well_known_symbol_async_iterator())); if (async_method == nullptr) { @@ -32,10 +32,10 @@ ThrowCompletionOr get_iterator(GlobalObject& global_object, Value value } } - if (!method.is_function()) + if (!method->is_function()) return vm.throw_completion(global_object, ErrorType::NotIterable, value.to_string_without_side_effects()); - auto iterator = TRY(vm.call(method.as_function(), value)); + auto iterator = TRY(vm.call(method->as_function(), value)); if (!iterator.is_object()) return vm.throw_completion(global_object, ErrorType::NotIterable, value.to_string_without_side_effects()); @@ -43,7 +43,7 @@ ThrowCompletionOr get_iterator(GlobalObject& global_object, Value value } // 7.4.2 IteratorNext ( iteratorRecord [ , value ] ), https://tc39.es/ecma262/#sec-iteratornext -ThrowCompletionOr iterator_next(Object& iterator, Value value) +ThrowCompletionOr iterator_next(Object& iterator, Optional value) { // FIXME: Implement using iterator records, not ordinary objects auto& vm = iterator.vm(); @@ -54,10 +54,10 @@ ThrowCompletionOr iterator_next(Object& iterator, Value value) return vm.throw_completion(global_object, ErrorType::IterableNextNotAFunction); Value result; - if (value.is_empty()) + if (!value.has_value()) result = TRY(vm.call(next_method.as_function(), &iterator)); else - result = TRY(vm.call(next_method.as_function(), &iterator, value)); + result = TRY(vm.call(next_method.as_function(), &iterator, *value)); if (!result.is_object()) return vm.throw_completion(global_object, ErrorType::IterableNextBadReturn); @@ -173,7 +173,7 @@ Object* create_iterator_result_object(GlobalObject& global_object, Value value, } // 7.4.11 IterableToList ( items [ , method ] ), https://tc39.es/ecma262/#sec-iterabletolist -ThrowCompletionOr iterable_to_list(GlobalObject& global_object, Value iterable, Value method) +ThrowCompletionOr iterable_to_list(GlobalObject& global_object, Value iterable, Optional method) { auto& vm = global_object.vm(); MarkedValueList values(vm.heap()); @@ -183,14 +183,14 @@ ThrowCompletionOr iterable_to_list(GlobalObject& global_object, values.append(value); return {}; }, - method)); + move(method))); return { move(values) }; } -Completion get_iterator_values(GlobalObject& global_object, Value iterable, IteratorValueCallback callback, Value method) +Completion get_iterator_values(GlobalObject& global_object, Value iterable, IteratorValueCallback callback, Optional method) { - auto* iterator = TRY(get_iterator(global_object, iterable, IteratorHint::Sync, method)); + auto* iterator = TRY(get_iterator(global_object, iterable, IteratorHint::Sync, move(method))); while (true) { auto* next_object = TRY(iterator_step(global_object, *iterator)); diff --git a/Userland/Libraries/LibJS/Runtime/IteratorOperations.h b/Userland/Libraries/LibJS/Runtime/IteratorOperations.h index af8616c4c1..a1cbcac932 100644 --- a/Userland/Libraries/LibJS/Runtime/IteratorOperations.h +++ b/Userland/Libraries/LibJS/Runtime/IteratorOperations.h @@ -20,17 +20,17 @@ enum class IteratorHint { Async, }; -ThrowCompletionOr get_iterator(GlobalObject&, Value value, IteratorHint hint = IteratorHint::Sync, Value method = {}); -ThrowCompletionOr iterator_next(Object& iterator, Value value = {}); +ThrowCompletionOr get_iterator(GlobalObject&, Value value, IteratorHint hint = IteratorHint::Sync, Optional method = {}); +ThrowCompletionOr iterator_next(Object& iterator, Optional value = {}); ThrowCompletionOr iterator_step(GlobalObject&, Object& iterator); ThrowCompletionOr iterator_complete(GlobalObject&, Object& iterator_result); ThrowCompletionOr iterator_value(GlobalObject&, Object& iterator_result); Completion iterator_close(Object& iterator, Completion completion); Completion async_iterator_close(Object& iterator, Completion completion); Object* create_iterator_result_object(GlobalObject&, Value value, bool done); -ThrowCompletionOr iterable_to_list(GlobalObject&, Value iterable, Value method = {}); +ThrowCompletionOr iterable_to_list(GlobalObject&, Value iterable, Optional method = {}); using IteratorValueCallback = Function(Value)>; -Completion get_iterator_values(GlobalObject& global_object, Value iterable, IteratorValueCallback callback, Value method = {}); +Completion get_iterator_values(GlobalObject& global_object, Value iterable, IteratorValueCallback callback, Optional method = {}); }