diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 0b63b5a6fc..4dbbd94e76 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -260,7 +260,10 @@ void StringLiteral::generate_bytecode(Bytecode::Generator& generator) const void Identifier::generate_bytecode(Bytecode::Generator& generator) const { - generator.emit(generator.intern_string(m_string)); + if (m_argument_index.has_value()) + generator.emit(m_argument_index.value()); + else + generator.emit(generator.intern_string(m_string)); } void AssignmentExpression::generate_bytecode(Bytecode::Generator& generator) const diff --git a/Userland/Libraries/LibJS/Bytecode/Instruction.h b/Userland/Libraries/LibJS/Bytecode/Instruction.h index c60fb451d8..11c9b6b745 100644 --- a/Userland/Libraries/LibJS/Bytecode/Instruction.h +++ b/Userland/Libraries/LibJS/Bytecode/Instruction.h @@ -61,6 +61,7 @@ O(Decrement) \ O(Throw) \ O(PushLexicalEnvironment) \ + O(LoadArgument) \ O(EnterUnwindContext) \ O(LeaveUnwindContext) \ O(ContinuePendingUnwind) \ diff --git a/Userland/Libraries/LibJS/Bytecode/Op.cpp b/Userland/Libraries/LibJS/Bytecode/Op.cpp index 4009f539f8..abc6a21cd5 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Op.cpp @@ -311,6 +311,11 @@ void PutByValue::execute(Bytecode::Interpreter& interpreter) const } } +void LoadArgument::execute(Bytecode::Interpreter& interpreter) const +{ + interpreter.accumulator() = interpreter.vm().argument(m_index); +} + String Load::to_string(Bytecode::Executable const&) const { return String::formatted("Load {}", m_src); @@ -493,4 +498,9 @@ String PutByValue::to_string(const Bytecode::Executable&) const return String::formatted("PutByValue base:{}, property:{}", m_base, m_property); } +String LoadArgument::to_string(const Bytecode::Executable&) const +{ + return String::formatted("LoadArgument {}", m_index); +} + } diff --git a/Userland/Libraries/LibJS/Bytecode/Op.h b/Userland/Libraries/LibJS/Bytecode/Op.h index 039642c91d..c13d51789b 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.h +++ b/Userland/Libraries/LibJS/Bytecode/Op.h @@ -529,6 +529,22 @@ public: private: HashMap m_variables; }; + +class LoadArgument final : public Instruction { +public: + explicit LoadArgument(size_t index) + : Instruction(Type::LoadArgument) + , m_index(index) + { + } + + void execute(Bytecode::Interpreter&) const; + String to_string(Bytecode::Executable const&) const; + +private: + size_t m_index { 0 }; +}; + } namespace JS::Bytecode {