diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index d009fdce40..c1254f09be 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -90,6 +90,20 @@ Optional AssignmentExpression::generate_bytecode(Bytecode::G return rhs_reg; } + if (is(*m_lhs)) { + auto& expression = static_cast(*m_lhs); + auto object_reg = expression.object().generate_bytecode(generator); + + if (expression.is_computed()) { + TODO(); + } else { + VERIFY(is(expression.property())); + auto rhs_reg = m_rhs->generate_bytecode(generator); + generator.emit(*object_reg, static_cast(expression.property()).string(), *rhs_reg); + return rhs_reg; + } + } + TODO(); } diff --git a/Userland/Libraries/LibJS/Bytecode/Op.cpp b/Userland/Libraries/LibJS/Bytecode/Op.cpp index bff5b53347..647c0d9f95 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Op.cpp @@ -56,6 +56,12 @@ void SetVariable::execute(Bytecode::Interpreter& interpreter) const interpreter.vm().set_variable(m_identifier, interpreter.reg(m_src), interpreter.global_object()); } +void PutById::execute(Bytecode::Interpreter& interpreter) const +{ + if (auto* object = interpreter.reg(m_base).to_object(interpreter.global_object())) + object->put(m_property, interpreter.reg(m_src)); +} + void Jump::execute(Bytecode::Interpreter& interpreter) const { interpreter.jump(m_target); @@ -122,6 +128,11 @@ String SetVariable::to_string() const return String::formatted("SetVariable identifier:{}, src:{}", m_identifier, m_src); } +String PutById::to_string() const +{ + return String::formatted("PutById base:{}, property:{}, src:{}", m_base, m_property, m_src); +} + String Jump::to_string() const { return String::formatted("Jump {}", m_target); diff --git a/Userland/Libraries/LibJS/Bytecode/Op.h b/Userland/Libraries/LibJS/Bytecode/Op.h index a7fe80d306..bf06d97774 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.h +++ b/Userland/Libraries/LibJS/Bytecode/Op.h @@ -174,6 +174,25 @@ private: FlyString m_identifier; }; +class PutById final : public Instruction { +public: + PutById(Register base, FlyString property, Register src) + : m_base(base) + , m_property(move(property)) + , m_src(src) + { + } + + virtual ~PutById() override { } + virtual void execute(Bytecode::Interpreter&) const override; + virtual String to_string() const override; + +private: + Register m_base; + FlyString m_property; + Register m_src; +}; + class Jump final : public Instruction { public: explicit Jump(Label target)