Explorar el Código

LibJS: Implement the NewClass opcode

Ali Mohammad Pur hace 3 años
padre
commit
d7c207beb9

+ 9 - 0
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)

+ 5 - 1
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;

+ 7 - 3
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

+ 2 - 0
Userland/Libraries/LibJS/Runtime/VM.h

@@ -55,6 +55,8 @@ public:
         InterpreterExecutionScope(Interpreter&);
         ~InterpreterExecutionScope();
 
+        Interpreter& interpreter() { return m_interpreter; }
+
     private:
         Interpreter& m_interpreter;
     };