From 155e60a5ffee58f3c0e82610084765d08dc7d6b4 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Mon, 12 May 2025 17:32:54 +0300 Subject: [PATCH] LibJS: Use `iteration_step()` in IteratorNextUnpack instruction Allows us to avoid code duplication for builtin iterators fast path. --- Libraries/LibJS/Bytecode/Interpreter.cpp | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/Libraries/LibJS/Bytecode/Interpreter.cpp b/Libraries/LibJS/Bytecode/Interpreter.cpp index f71d6d7427d..5ab5b96d0d3 100644 --- a/Libraries/LibJS/Bytecode/Interpreter.cpp +++ b/Libraries/LibJS/Bytecode/Interpreter.cpp @@ -3172,20 +3172,14 @@ ThrowCompletionOr IteratorNextUnpack::execute_impl(Bytecode::Interpreter& { auto& vm = interpreter.vm(); auto& iterator_record = static_cast(interpreter.get(m_iterator_record).as_cell()); - - Value value; - bool done = false; - if (auto* builtin_iterator = iterator_record.iterator->as_builtin_iterator_if_next_is_not_redefined()) { - TRY(builtin_iterator->next(vm, done, value)); - } else { - auto result = TRY(iterator_next(vm, iterator_record)); - value = TRY(result->internal_get(vm.names.value, {})); - done = TRY(result->internal_get(vm.names.done, {})).to_boolean(); + auto iteration_result_or_done = TRY(iterator_step(vm, iterator_record)); + if (iteration_result_or_done.has()) { + interpreter.set(dst_done(), Value(true)); + return {}; } - - interpreter.set(dst_done(), Value(done)); - interpreter.set(dst_value(), value); - + auto& iteration_result = iteration_result_or_done.get(); + interpreter.set(dst_done(), TRY(iteration_result.done)); + interpreter.set(dst_value(), TRY(iteration_result.value)); return {}; }