diff --git a/Userland/Libraries/LibJS/AST.h b/Userland/Libraries/LibJS/AST.h index 9acb63a229..c981ffe86c 100644 --- a/Userland/Libraries/LibJS/AST.h +++ b/Userland/Libraries/LibJS/AST.h @@ -470,6 +470,8 @@ public: virtual void dump(int indent) const override; + virtual Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&) const override; + bool has_export(DeprecatedFlyString const& export_name) const; bool has_statement() const { return m_statement; } diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index f0794ffe38..501bf08909 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -2743,4 +2743,30 @@ Bytecode::CodeGenerationErrorOr ImportCall::generate_bytecode(Bytecode::Ge return {}; } +Bytecode::CodeGenerationErrorOr ExportStatement::generate_bytecode(Bytecode::Generator& generator) const +{ + if (!is_default_export()) { + if (m_statement) { + return m_statement->generate_bytecode(generator); + } + return {}; + } + + VERIFY(m_statement); + + if (is(*m_statement) || is(*m_statement)) { + return m_statement->generate_bytecode(generator); + } + + if (is(*m_statement)) { + TODO(); + } + + // ExportDeclaration : export default AssignmentExpression ; + VERIFY(is(*m_statement)); + TRY(generator.emit_named_evaluation_if_anonymous_function(static_cast(*m_statement), DeprecatedFlyString("default"sv))); + generator.emit(generator.intern_identifier("default"sv)); + return {}; +} + }