diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index eac9f3bf0b..1f682453ab 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)) {