diff --git a/Userland/Libraries/LibJS/AST.cpp b/Userland/Libraries/LibJS/AST.cpp index c5277d7979..fdd9bc60d0 100644 --- a/Userland/Libraries/LibJS/AST.cpp +++ b/Userland/Libraries/LibJS/AST.cpp @@ -2282,4 +2282,31 @@ Optional NumericLiteral::generate_bytecode(Bytecode::Generat return dst; } +Optional StringLiteral::generate_bytecode(Bytecode::Generator& generator) const +{ + auto dst = generator.allocate_register(); + generator.emit(dst, m_value); + return dst; +} + +Optional Identifier::generate_bytecode(Bytecode::Generator& generator) const +{ + auto reg = generator.allocate_register(); + generator.emit(reg, m_string); + return reg; +} + +Optional AssignmentExpression::generate_bytecode(Bytecode::Generator& generator) const +{ + if (is(*m_lhs)) { + auto& identifier = static_cast(*m_lhs); + auto rhs_reg = m_rhs->generate_bytecode(generator); + VERIFY(rhs_reg.has_value()); + generator.emit(identifier.string(), *rhs_reg); + return rhs_reg; + } + + TODO(); +} + } diff --git a/Userland/Libraries/LibJS/AST.h b/Userland/Libraries/LibJS/AST.h index 198063d0a5..80261010a2 100644 --- a/Userland/Libraries/LibJS/AST.h +++ b/Userland/Libraries/LibJS/AST.h @@ -666,6 +666,7 @@ public: virtual Value execute(Interpreter&, GlobalObject&) const override; virtual void dump(int indent) const override; + virtual Optional generate_bytecode(Bytecode::Generator&) const override; StringView value() const { return m_value; } bool is_use_strict_directive() const { return m_is_use_strict_directive; }; @@ -719,6 +720,7 @@ public: virtual Value execute(Interpreter&, GlobalObject&) const override; virtual void dump(int indent) const override; virtual Reference to_reference(Interpreter&, GlobalObject&) const override; + virtual Optional generate_bytecode(Bytecode::Generator&) const override; private: FlyString m_string; @@ -896,6 +898,7 @@ public: virtual Value execute(Interpreter&, GlobalObject&) const override; virtual void dump(int indent) const override; + virtual Optional generate_bytecode(Bytecode::Generator&) const override; private: AssignmentOp m_op; diff --git a/Userland/Libraries/LibJS/Bytecode/Op.cpp b/Userland/Libraries/LibJS/Bytecode/Op.cpp index 52564e6be8..017edd0f87 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Op.cpp @@ -6,6 +6,7 @@ #include #include +#include #include namespace JS::Bytecode::Op { @@ -20,6 +21,21 @@ void Add::execute(Bytecode::Interpreter& interpreter) const interpreter.reg(m_dst) = add(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); } +void NewString::execute(Bytecode::Interpreter& interpreter) const +{ + interpreter.reg(m_dst) = js_string(interpreter.vm(), m_string); +} + +void GetVariable::execute(Bytecode::Interpreter& interpreter) const +{ + interpreter.reg(m_dst) = interpreter.vm().get_variable(m_identifier, interpreter.global_object()); +} + +void SetVariable::execute(Bytecode::Interpreter& interpreter) const +{ + interpreter.vm().set_variable(m_identifier, interpreter.reg(m_src), interpreter.global_object()); +} + String Load::to_string() const { return String::formatted("Load dst:r{}, value:{}", m_dst.index(), m_value.to_string_without_side_effects()); @@ -30,4 +46,19 @@ String Add::to_string() const return String::formatted("Add dst:r{}, src1:r{}, src2:r{}", m_dst.index(), m_src1.index(), m_src2.index()); } +String NewString::to_string() const +{ + return String::formatted("NewString dst:r{}, string:\"{}\"", m_dst.index(), m_string); +} + +String GetVariable::to_string() const +{ + return String::formatted("GetVariable dst:r{}, identifier:{}", m_dst.index(), m_identifier); +} + +String SetVariable::to_string() const +{ + return String::formatted("SetVariable identifier:{}, src:r{}", m_identifier, m_src.index()); +} + } diff --git a/Userland/Libraries/LibJS/Bytecode/Op.h b/Userland/Libraries/LibJS/Bytecode/Op.h index 872a65c026..77f46f2a76 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.h +++ b/Userland/Libraries/LibJS/Bytecode/Op.h @@ -6,6 +6,7 @@ #pragma once +#include #include #include #include @@ -49,4 +50,55 @@ private: Register m_src2; }; +class NewString final : public Instruction { +public: + NewString(Register dst, String string) + : m_dst(dst) + , m_string(move(string)) + { + } + + virtual ~NewString() override { } + virtual void execute(Bytecode::Interpreter&) const override; + virtual String to_string() const override; + +private: + Register m_dst; + String m_string; +}; + +class SetVariable final : public Instruction { +public: + SetVariable(FlyString identifier, Register src) + : m_identifier(move(identifier)) + , m_src(src) + { + } + + virtual ~SetVariable() override { } + virtual void execute(Bytecode::Interpreter&) const override; + virtual String to_string() const override; + +private: + FlyString m_identifier; + Register m_src; +}; + +class GetVariable final : public Instruction { +public: + GetVariable(Register dst, FlyString identifier) + : m_dst(dst) + , m_identifier(move(identifier)) + { + } + + virtual ~GetVariable() override { } + virtual void execute(Bytecode::Interpreter&) const override; + virtual String to_string() const override; + +private: + Register m_dst; + FlyString m_identifier; +}; + }