From 72d2bd56ce558764424918dee274903b7e044184 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Mon, 4 May 2020 23:07:05 +0100 Subject: [PATCH] LibJS: Implement modulo assignment operator (%=) --- Libraries/LibJS/AST.cpp | 9 +++++++++ Libraries/LibJS/AST.h | 1 + Libraries/LibJS/Parser.cpp | 4 ++++ Libraries/LibJS/Tests/assignment-operators.js | 4 ++++ 4 files changed, 18 insertions(+) diff --git a/Libraries/LibJS/AST.cpp b/Libraries/LibJS/AST.cpp index 5579e3cd68..70a181d7fe 100644 --- a/Libraries/LibJS/AST.cpp +++ b/Libraries/LibJS/AST.cpp @@ -850,6 +850,12 @@ Value AssignmentExpression::execute(Interpreter& interpreter) const return {}; rhs_result = div(interpreter, lhs_result, rhs_result); break; + case AssignmentOp::ModuloAssignment: + lhs_result = m_lhs->execute(interpreter); + if (interpreter.exception()) + return {}; + rhs_result = mod(interpreter, lhs_result, rhs_result); + break; case AssignmentOp::ExponentiationAssignment: lhs_result = m_lhs->execute(interpreter); if (interpreter.exception()) @@ -960,6 +966,9 @@ void AssignmentExpression::dump(int indent) const case AssignmentOp::DivisionAssignment: op_string = "/="; break; + case AssignmentOp::ModuloAssignment: + op_string = "%="; + break; case AssignmentOp::ExponentiationAssignment: op_string = "**="; break; diff --git a/Libraries/LibJS/AST.h b/Libraries/LibJS/AST.h index ab02e02572..245fa7ac4d 100644 --- a/Libraries/LibJS/AST.h +++ b/Libraries/LibJS/AST.h @@ -604,6 +604,7 @@ enum class AssignmentOp { SubtractionAssignment, MultiplicationAssignment, DivisionAssignment, + ModuloAssignment, ExponentiationAssignment, BitwiseAndAssignment, BitwiseOrAssignment, diff --git a/Libraries/LibJS/Parser.cpp b/Libraries/LibJS/Parser.cpp index c98a827056..a999b4b325 100644 --- a/Libraries/LibJS/Parser.cpp +++ b/Libraries/LibJS/Parser.cpp @@ -634,6 +634,9 @@ NonnullRefPtr Parser::parse_secondary_expression(NonnullRefPtr(BinaryOp::Modulo, move(lhs), parse_expression(min_precedence, associativity)); + case TokenType::PercentEquals: + consume(); + return create_ast_node(AssignmentOp::ModuloAssignment, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::DoubleAsterisk: consume(); return create_ast_node(BinaryOp::Exponentiation, move(lhs), parse_expression(min_precedence, associativity)); @@ -1194,6 +1197,7 @@ bool Parser::match_secondary_expression() const || type == TokenType::Slash || type == TokenType::SlashEquals || type == TokenType::Percent + || type == TokenType::PercentEquals || type == TokenType::DoubleAsterisk || type == TokenType::DoubleAsteriskEquals || type == TokenType::Equals diff --git a/Libraries/LibJS/Tests/assignment-operators.js b/Libraries/LibJS/Tests/assignment-operators.js index ec2a693988..fd1d82ca74 100644 --- a/Libraries/LibJS/Tests/assignment-operators.js +++ b/Libraries/LibJS/Tests/assignment-operators.js @@ -23,6 +23,10 @@ try { assert((x /= 2) === 3); assert(x === 3); + x = 6; + assert((x %= 4) === 2); + assert(x === 2); + x = 2; assert((x **= 3) === 8); assert(x === 8);