From e1cd36559dda50aac1bc5d8cbd969efd486a961e Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Fri, 15 Apr 2022 21:24:42 +0430 Subject: [PATCH] LibJS: Make the BC generator.next(value) work This used to put the value in the previous frame's accumulator register, which is only correct for the first invocation of the generator. --- Userland/Libraries/LibJS/Runtime/GeneratorObject.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibJS/Runtime/GeneratorObject.cpp b/Userland/Libraries/LibJS/Runtime/GeneratorObject.cpp index bea7bd240c..843becbb12 100644 --- a/Userland/Libraries/LibJS/Runtime/GeneratorObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/GeneratorObject.cpp @@ -100,12 +100,17 @@ ThrowCompletionOr GeneratorObject::next_impl(VM& vm, GlobalObject& global bytecode_interpreter->accumulator() = js_undefined(); return throw_completion(value_to_throw.release_value()); } - bytecode_interpreter->accumulator() = next_argument.value_or(js_undefined()); Bytecode::RegisterWindow* frame = nullptr; if (m_frame.has_value()) frame = &m_frame.value(); + auto next_value = next_argument.value_or(js_undefined()); + if (frame) + frame->registers[0] = next_value; + else + bytecode_interpreter->accumulator() = next_value; + auto next_result = bytecode_interpreter->run_and_return_frame(*m_generating_function->bytecode_executable(), next_block, frame); vm.pop_execution_context();