LibJS: Implement typeof operator

This commit is contained in:
Conrad Pankoff 2020-03-18 06:33:32 +11:00 committed by Andreas Kling
parent 0a71533aff
commit 46a897b59b
Notes: sideshowbarker 2024-07-19 08:16:15 +09:00
4 changed files with 27 additions and 1 deletions

View file

@ -0,0 +1 @@
console.log(typeof undefined, typeof true, typeof 'a', typeof 1, typeof {});

View file

@ -199,6 +199,23 @@ Value UnaryExpression::execute(Interpreter& interpreter) const
return bitwise_not(lhs_result);
case UnaryOp::Not:
return Value(!lhs_result.to_boolean());
case UnaryOp::Typeof:
switch (lhs_result.type()) {
case Value::Type::Undefined:
return js_string(interpreter.heap(), "undefined");
case Value::Type::Null:
// yes, this is on purpose. yes, this is how javascript works.
// yes, it's silly.
return js_string(interpreter.heap(), "object");
case Value::Type::Number:
return js_string(interpreter.heap(), "number");
case Value::Type::String:
return js_string(interpreter.heap(), "string");
case Value::Type::Object:
return js_string(interpreter.heap(), "object");
case Value::Type::Boolean:
return js_string(interpreter.heap(), "boolean");
}
}
ASSERT_NOT_REACHED();
@ -318,6 +335,9 @@ void UnaryExpression::dump(int indent) const
case UnaryOp::Not:
op_string = "!";
break;
case UnaryOp::Typeof:
op_string = "typeof ";
break;
}
print_indent(indent);

View file

@ -309,6 +309,7 @@ private:
enum class UnaryOp {
BitwiseNot,
Not,
Typeof,
};
class UnaryExpression : public Expression {

View file

@ -254,6 +254,9 @@ NonnullOwnPtr<Expression> Parser::parse_unary_prefixed_expression()
case TokenType::Tilde:
consume();
return make<UnaryExpression>(UnaryOp::BitwiseNot, parse_primary_expression());
case TokenType::Typeof:
consume();
return make<UnaryExpression>(UnaryOp::Typeof, parse_primary_expression());
default:
m_has_errors = true;
expected("primary expression (missing switch case)");
@ -532,7 +535,8 @@ bool Parser::match_unary_prefixed_expression() const
return type == TokenType::PlusPlus
|| type == TokenType::MinusMinus
|| type == TokenType::ExclamationMark
|| type == TokenType::Tilde;
|| type == TokenType::Tilde
|| type == TokenType::Typeof;
}
bool Parser::match_secondary_expression() const