diff --git a/Libraries/LibJS/AST.cpp b/Libraries/LibJS/AST.cpp index 307794971c9..1394c5dc050 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 87478f34438..decfa5137b7 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 df5e3bca320..38e278300c5 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 e7f62823047..b5c0bc47a16 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 a88d2697bcb..c62c84d4969 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 66b599715de..010d8d3e6cd 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);