diff --git a/Libraries/LibJS/AST.cpp b/Libraries/LibJS/AST.cpp index 007a7d9e74..307794971c 100644 --- a/Libraries/LibJS/AST.cpp +++ b/Libraries/LibJS/AST.cpp @@ -115,6 +115,10 @@ Value BinaryExpression::execute(Interpreter& interpreter) const return add(lhs_result, rhs_result); case BinaryOp::Minus: return sub(lhs_result, rhs_result); + case BinaryOp::Asterisk: + return mul(lhs_result, rhs_result); + case BinaryOp::Slash: + return div(lhs_result, rhs_result); case BinaryOp::TypedEquals: return typed_eq(lhs_result, rhs_result); case BinaryOp::TypedInequals: @@ -194,6 +198,12 @@ void BinaryExpression::dump(int indent) const case BinaryOp::Minus: op_string = "-"; break; + case BinaryOp::Asterisk: + op_string = "*"; + break; + case BinaryOp::Slash: + op_string = "/"; + break; case BinaryOp::TypedEquals: op_string = "==="; break; diff --git a/Libraries/LibJS/AST.h b/Libraries/LibJS/AST.h index 772d168f49..87478f3443 100644 --- a/Libraries/LibJS/AST.h +++ b/Libraries/LibJS/AST.h @@ -214,6 +214,8 @@ private: enum class BinaryOp { Plus, Minus, + Asterisk, + Slash, TypedEquals, TypedInequals, GreaterThan, diff --git a/Libraries/LibJS/Parser.cpp b/Libraries/LibJS/Parser.cpp index 24c4f58549..df5e3bca32 100644 --- a/Libraries/LibJS/Parser.cpp +++ b/Libraries/LibJS/Parser.cpp @@ -127,6 +127,12 @@ NonnullOwnPtr Parser::parse_secondary_expression(NonnullOwnPtr(BinaryOp::Minus, move(lhs), parse_expression()); + case TokenType::Asterisk: + consume(); + return make(BinaryOp::Asterisk, move(lhs), parse_expression()); + case TokenType::Slash: + consume(); + return make(BinaryOp::Slash, move(lhs), parse_expression()); case TokenType::ParenOpen: return parse_call_expression(move(lhs)); case TokenType::Equals: diff --git a/Libraries/LibJS/Value.cpp b/Libraries/LibJS/Value.cpp index 8dfb920196..a88d2697bc 100644 --- a/Libraries/LibJS/Value.cpp +++ b/Libraries/LibJS/Value.cpp @@ -145,7 +145,6 @@ Value right_shift(Value lhs, Value rhs) } Value add(Value lhs, Value rhs) - { ASSERT(lhs.is_number()); ASSERT(rhs.is_number()); @@ -159,6 +158,20 @@ Value sub(Value lhs, Value rhs) return Value(lhs.as_double() - rhs.as_double()); } +Value mul(Value lhs, Value rhs) +{ + ASSERT(lhs.is_number()); + ASSERT(rhs.is_number()); + return Value(lhs.as_double() * rhs.as_double()); +} + +Value div(Value lhs, Value rhs) +{ + ASSERT(lhs.is_number()); + ASSERT(rhs.is_number()); + return Value(lhs.as_double() / rhs.as_double()); +} + Value typed_eq(Value lhs, Value rhs) { if (rhs.type() != lhs.type()) diff --git a/Libraries/LibJS/Value.h b/Libraries/LibJS/Value.h index 51b3982910..66b599715d 100644 --- a/Libraries/LibJS/Value.h +++ b/Libraries/LibJS/Value.h @@ -168,6 +168,8 @@ Value left_shift(Value lhs, Value rhs); Value right_shift(Value lhs, Value rhs); Value add(Value lhs, Value rhs); Value sub(Value lhs, Value rhs); +Value mul(Value lhs, Value rhs); +Value div(Value lhs, Value rhs); Value typed_eq(Value lhs, Value rhs); const LogStream& operator<<(const LogStream&, const Value&);