From 6681415f5895777de4f44637848330b1f370e7b1 Mon Sep 17 00:00:00 2001 From: Ryan Chandler Date: Mon, 7 Jun 2021 20:12:38 +0100 Subject: [PATCH] LibJS: Add support for various assignment operators --- .../Libraries/LibJS/Bytecode/ASTCodegen.cpp | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index eac9f3bf0b3..1f682453abf 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -177,8 +177,50 @@ Optional AssignmentExpression::generate_bytecode(Bytecode::G 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; + + if (m_op == AssignmentOp::Assignment) { + generator.emit(identifier.string(), *rhs_reg); + return rhs_reg; + } + + auto lhs_reg = m_lhs->generate_bytecode(generator); + auto dst_reg = generator.allocate_register(); + + switch (m_op) { + case AssignmentOp::AdditionAssignment: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + break; + case AssignmentOp::SubtractionAssignment: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + break; + case AssignmentOp::MultiplicationAssignment: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + break; + case AssignmentOp::DivisionAssignment: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + break; + case AssignmentOp::ModuloAssignment: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + break; + case AssignmentOp::ExponentiationAssignment: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + break; + case AssignmentOp::BitwiseAndAssignment: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + break; + case AssignmentOp::BitwiseOrAssignment: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + break; + case AssignmentOp::BitwiseXorAssignment: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + break; + default: + TODO(); + } + + generator.emit(identifier.string(), dst_reg); + + return dst_reg; } if (is(*m_lhs)) {