From 0fe87c5fec856e174157a6adce5a41e760851885 Mon Sep 17 00:00:00 2001 From: Conrad Pankoff Date: Thu, 12 Mar 2020 23:07:08 +1100 Subject: [PATCH] LibJS: Implement <= and >= binary operators --- Libraries/LibJS/AST.cpp | 10 ++++++++++ Libraries/LibJS/AST.h | 2 ++ Libraries/LibJS/Parser.cpp | 8 ++++++++ Libraries/LibJS/Token.h | 2 ++ Libraries/LibJS/Value.cpp | 14 ++++++++++++++ Libraries/LibJS/Value.h | 2 ++ 6 files changed, 38 insertions(+) diff --git a/Libraries/LibJS/AST.cpp b/Libraries/LibJS/AST.cpp index 307794971c..1394c5dc05 100644 --- a/Libraries/LibJS/AST.cpp +++ b/Libraries/LibJS/AST.cpp @@ -125,8 +125,12 @@ Value BinaryExpression::execute(Interpreter& interpreter) const return Value(!typed_eq(lhs_result, rhs_result).to_boolean()); case BinaryOp::GreaterThan: return greater_than(lhs_result, rhs_result); + case BinaryOp::GreaterThanEquals: + return greater_than_equals(lhs_result, rhs_result); case BinaryOp::LessThan: return less_than(lhs_result, rhs_result); + case BinaryOp::LessThanEquals: + return less_than_equals(lhs_result, rhs_result); case BinaryOp::BitwiseAnd: return bitwise_and(lhs_result, rhs_result); case BinaryOp::BitwiseOr: @@ -213,9 +217,15 @@ void BinaryExpression::dump(int indent) const case BinaryOp::GreaterThan: op_string = ">"; break; + case BinaryOp::GreaterThanEquals: + op_string = ">="; + break; case BinaryOp::LessThan: op_string = "<"; break; + case BinaryOp::LessThanEquals: + op_string = "<="; + break; case BinaryOp::BitwiseAnd: op_string = "&"; break; diff --git a/Libraries/LibJS/AST.h b/Libraries/LibJS/AST.h index 87478f3443..decfa5137b 100644 --- a/Libraries/LibJS/AST.h +++ b/Libraries/LibJS/AST.h @@ -219,7 +219,9 @@ enum class BinaryOp { TypedEquals, TypedInequals, GreaterThan, + GreaterThanEquals, LessThan, + LessThanEquals, BitwiseAnd, BitwiseOr, BitwiseXor, diff --git a/Libraries/LibJS/Parser.cpp b/Libraries/LibJS/Parser.cpp index df5e3bca32..38e278300c 100644 --- a/Libraries/LibJS/Parser.cpp +++ b/Libraries/LibJS/Parser.cpp @@ -133,6 +133,12 @@ NonnullOwnPtr Parser::parse_secondary_expression(NonnullOwnPtr(BinaryOp::Slash, move(lhs), parse_expression()); + case TokenType::GreaterThanEquals: + consume(); + return make(BinaryOp::GreaterThanEquals, move(lhs), parse_expression()); + case TokenType::LessThanEquals: + consume(); + return make(BinaryOp::LessThanEquals, move(lhs), parse_expression()); case TokenType::ParenOpen: return parse_call_expression(move(lhs)); case TokenType::Equals: @@ -248,6 +254,8 @@ bool Parser::match_secondary_expression() const || type == TokenType::Asterisk || type == TokenType::Slash || type == TokenType::Equals + || type == TokenType::GreaterThanEquals + || type == TokenType::LessThanEquals || type == TokenType::ParenOpen || type == TokenType::Period; } diff --git a/Libraries/LibJS/Token.h b/Libraries/LibJS/Token.h index e7f6282304..b5c0bc47a1 100644 --- a/Libraries/LibJS/Token.h +++ b/Libraries/LibJS/Token.h @@ -58,11 +58,13 @@ enum class TokenType { Finally, Function, GreaterThan, + GreaterThanEquals, Identifier, If, Interface, Invalid, LessThan, + LessThanEquals, Let, Minus, MinusEquals, diff --git a/Libraries/LibJS/Value.cpp b/Libraries/LibJS/Value.cpp index a88d2697bc..c62c84d496 100644 --- a/Libraries/LibJS/Value.cpp +++ b/Libraries/LibJS/Value.cpp @@ -96,6 +96,13 @@ Value greater_than(Value lhs, Value rhs) return Value(lhs.as_double() > rhs.as_double()); } +Value greater_than_equals(Value lhs, Value rhs) +{ + ASSERT(lhs.is_number()); + ASSERT(rhs.is_number()); + return Value(lhs.as_double() >= rhs.as_double()); +} + Value less_than(Value lhs, Value rhs) { ASSERT(lhs.is_number()); @@ -103,6 +110,13 @@ Value less_than(Value lhs, Value rhs) return Value(lhs.as_double() < rhs.as_double()); } +Value less_than_equals(Value lhs, Value rhs) +{ + ASSERT(lhs.is_number()); + ASSERT(rhs.is_number()); + return Value(lhs.as_double() <= rhs.as_double()); +} + Value bitwise_and(Value lhs, Value rhs) { ASSERT(lhs.is_number()); diff --git a/Libraries/LibJS/Value.h b/Libraries/LibJS/Value.h index 66b599715d..010d8d3e6c 100644 --- a/Libraries/LibJS/Value.h +++ b/Libraries/LibJS/Value.h @@ -159,7 +159,9 @@ inline Value js_null() } Value greater_than(Value lhs, Value rhs); +Value greater_than_equals(Value lhs, Value rhs); Value less_than(Value lhs, Value rhs); +Value less_than_equals(Value lhs, Value rhs); Value bitwise_and(Value lhs, Value rhs); Value bitwise_or(Value lhs, Value rhs); Value bitwise_xor(Value lhs, Value rhs);