Sfoglia il codice sorgente

LibJS: Implement multiplication and division operators

Conrad Pankoff 5 anni fa
parent
commit
fdf7f81ba9

+ 10 - 0
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;

+ 2 - 0
Libraries/LibJS/AST.h

@@ -214,6 +214,8 @@ private:
 enum class BinaryOp {
     Plus,
     Minus,
+    Asterisk,
+    Slash,
     TypedEquals,
     TypedInequals,
     GreaterThan,

+ 6 - 0
Libraries/LibJS/Parser.cpp

@@ -127,6 +127,12 @@ NonnullOwnPtr<Expression> Parser::parse_secondary_expression(NonnullOwnPtr<Expre
     case TokenType::Minus:
         consume();
         return make<BinaryExpression>(BinaryOp::Minus, move(lhs), parse_expression());
+    case TokenType::Asterisk:
+        consume();
+        return make<BinaryExpression>(BinaryOp::Asterisk, move(lhs), parse_expression());
+    case TokenType::Slash:
+        consume();
+        return make<BinaryExpression>(BinaryOp::Slash, move(lhs), parse_expression());
     case TokenType::ParenOpen:
         return parse_call_expression(move(lhs));
     case TokenType::Equals:

+ 14 - 1
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())

+ 2 - 0
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&);