From af48a066c6c92377bb01d50c83c5a8a6b89ffd27 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 11 Jun 2021 10:46:46 +0200 Subject: [PATCH] LibJS: Add bytecode generation for FunctionExpression :^) --- Userland/Libraries/LibJS/AST.h | 2 ++ Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp | 5 +++++ Userland/Libraries/LibJS/Bytecode/Op.cpp | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibJS/AST.h b/Userland/Libraries/LibJS/AST.h index ebc5967c035..25ba50f0c9b 100644 --- a/Userland/Libraries/LibJS/AST.h +++ b/Userland/Libraries/LibJS/AST.h @@ -308,6 +308,8 @@ public: bool cannot_auto_rename() const { return m_cannot_auto_rename; } void set_cannot_auto_rename() { m_cannot_auto_rename = true; } + virtual void generate_bytecode(Bytecode::Generator&) const override; + private: bool m_cannot_auto_rename { false }; }; diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 9b0c95b749a..e9e82a6484c 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -605,6 +605,11 @@ void FunctionDeclaration::generate_bytecode(Bytecode::Generator&) const { } +void FunctionExpression::generate_bytecode(Bytecode::Generator& generator) const +{ + generator.emit(*this); +} + void VariableDeclaration::generate_bytecode(Bytecode::Generator& generator) const { for (auto& declarator : m_declarations) { diff --git a/Userland/Libraries/LibJS/Bytecode/Op.cpp b/Userland/Libraries/LibJS/Bytecode/Op.cpp index 265556b9b15..3776197f581 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Op.cpp @@ -218,7 +218,7 @@ void Call::execute(Bytecode::Interpreter& interpreter) const void NewFunction::execute(Bytecode::Interpreter& interpreter) const { auto& vm = interpreter.vm(); - interpreter.accumulator() = ScriptFunction::create(interpreter.global_object(), m_function_node.name(), m_function_node.body(), m_function_node.parameters(), m_function_node.function_length(), vm.current_scope(), m_function_node.is_generator(), m_function_node.is_strict_mode()); + interpreter.accumulator() = ScriptFunction::create(interpreter.global_object(), m_function_node.name(), m_function_node.body(), m_function_node.parameters(), m_function_node.function_length(), vm.current_scope(), m_function_node.is_generator(), m_function_node.is_strict_mode(), m_function_node.is_arrow_function()); } void Return::execute(Bytecode::Interpreter& interpreter) const