diff options
Diffstat (limited to 'Userland/Libraries/LibJS/Bytecode')
-rw-r--r-- | Userland/Libraries/LibJS/Bytecode/Interpreter.cpp | 9 | ||||
-rw-r--r-- | Userland/Libraries/LibJS/Bytecode/Interpreter.h | 6 | ||||
-rw-r--r-- | Userland/Libraries/LibJS/Bytecode/Op.cpp | 10 |
3 files changed, 21 insertions, 4 deletions
diff --git a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp index f4cfc5d5e3..6e280919ff 100644 --- a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp @@ -10,6 +10,7 @@ #include <LibJS/Bytecode/Instruction.h> #include <LibJS/Bytecode/Interpreter.h> #include <LibJS/Bytecode/Op.h> +#include <LibJS/Interpreter.h> #include <LibJS/Runtime/GlobalEnvironment.h> #include <LibJS/Runtime/GlobalObject.h> #include <LibJS/Runtime/Realm.h> @@ -193,6 +194,14 @@ ThrowCompletionOr<void> Interpreter::continue_pending_unwind(Label const& resume return {}; } +VM::InterpreterExecutionScope Interpreter::ast_interpreter_scope() +{ + if (!m_ast_interpreter) + m_ast_interpreter = JS::Interpreter::create_with_existing_realm(m_realm); + + return { *m_ast_interpreter }; +} + AK::Array<OwnPtr<PassManager>, static_cast<UnderlyingType<Interpreter::OptimizationLevel>>(Interpreter::OptimizationLevel::__Count)> Interpreter::s_optimization_pipelines {}; Bytecode::PassManager& Interpreter::optimization_pipeline(Interpreter::OptimizationLevel level) diff --git a/Userland/Libraries/LibJS/Bytecode/Interpreter.h b/Userland/Libraries/LibJS/Bytecode/Interpreter.h index 7d5fcfd0c7..026a747df9 100644 --- a/Userland/Libraries/LibJS/Bytecode/Interpreter.h +++ b/Userland/Libraries/LibJS/Bytecode/Interpreter.h @@ -13,6 +13,7 @@ #include <LibJS/Forward.h> #include <LibJS/Heap/Cell.h> #include <LibJS/Heap/Handle.h> +#include <LibJS/Runtime/VM.h> #include <LibJS/Runtime/Value.h> namespace JS::Bytecode { @@ -34,7 +35,7 @@ public: ThrowCompletionOr<Value> run(Bytecode::Executable const& executable, Bytecode::BasicBlock const* entry_point = nullptr) { auto value_and_frame = run_and_return_frame(executable, entry_point); - return value_and_frame.value; + return move(value_and_frame.value); } struct ValueAndFrame { @@ -78,6 +79,8 @@ public: }; static Bytecode::PassManager& optimization_pipeline(OptimizationLevel = OptimizationLevel::Default); + VM::InterpreterExecutionScope ast_interpreter_scope(); + private: RegisterWindow& registers() { return m_register_windows.last(); } @@ -93,6 +96,7 @@ private: Executable const* m_current_executable { nullptr }; Vector<UnwindInfo> m_unwind_contexts; Handle<Value> m_saved_exception; + OwnPtr<JS::Interpreter> m_ast_interpreter; }; extern bool g_dump_bytecode; diff --git a/Userland/Libraries/LibJS/Bytecode/Op.cpp b/Userland/Libraries/LibJS/Bytecode/Op.cpp index 1b079d801d..533c544580 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Op.cpp @@ -536,10 +536,14 @@ ThrowCompletionOr<void> IteratorResultValue::execute_impl(Bytecode::Interpreter& return {}; } -ThrowCompletionOr<void> NewClass::execute_impl(Bytecode::Interpreter&) const +ThrowCompletionOr<void> NewClass::execute_impl(Bytecode::Interpreter& interpreter) const { - (void)m_class_expression; - TODO(); + auto name = m_class_expression.name(); + auto scope = interpreter.ast_interpreter_scope(); + auto& ast_interpreter = scope.interpreter(); + auto class_object = TRY(m_class_expression.class_definition_evaluation(ast_interpreter, interpreter.global_object(), name, name.is_null() ? "" : name)); + interpreter.accumulator() = class_object; + return {}; } String Load::to_string_impl(Bytecode::Executable const&) const |