diff options
Diffstat (limited to 'Userland/Libraries/LibJS/Bytecode/Op.cpp')
-rw-r--r-- | Userland/Libraries/LibJS/Bytecode/Op.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/Userland/Libraries/LibJS/Bytecode/Op.cpp b/Userland/Libraries/LibJS/Bytecode/Op.cpp index 32a70f534c..a624d02663 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Op.cpp @@ -124,6 +124,40 @@ void NewArray::execute_impl(Bytecode::Interpreter& interpreter) const interpreter.accumulator() = Array::create_from(interpreter.global_object(), elements); } +void IteratorToArray::execute_impl(Bytecode::Interpreter& interpreter) const +{ + auto& global_object = interpreter.global_object(); + auto& vm = interpreter.vm(); + auto iterator = interpreter.accumulator().to_object(global_object); + if (vm.exception()) + return; + + auto array = Array::create(global_object); + size_t index = 0; + + while (true) { + auto iterator_result = iterator_next(*iterator); + if (!iterator_result) + return; + + auto complete = iterator_complete(global_object, *iterator_result); + if (vm.exception()) + return; + + if (complete) { + interpreter.accumulator() = array; + return; + } + + auto value = iterator_value(global_object, *iterator_result); + if (vm.exception()) + return; + + array->put(index, value); + index++; + } +} + void NewString::execute_impl(Bytecode::Interpreter& interpreter) const { interpreter.accumulator() = js_string(interpreter.vm(), interpreter.current_executable().get_string(m_string)); @@ -418,6 +452,11 @@ String NewArray::to_string_impl(Bytecode::Executable const&) const return builder.to_string(); } +String IteratorToArray::to_string_impl(const Bytecode::Executable&) const +{ + return "IteratorToArray"; +} + String NewString::to_string_impl(Bytecode::Executable const& executable) const { return String::formatted("NewString {} (\"{}\")", m_string, executable.string_table->get(m_string)); |