summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibJS/Bytecode/Op.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Libraries/LibJS/Bytecode/Op.cpp')
-rw-r--r--Userland/Libraries/LibJS/Bytecode/Op.cpp39
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));