diff options
Diffstat (limited to 'Libraries/LibJS/AST.cpp')
-rw-r--r-- | Libraries/LibJS/AST.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/Libraries/LibJS/AST.cpp b/Libraries/LibJS/AST.cpp index d1e9d53828..a815a6715a 100644 --- a/Libraries/LibJS/AST.cpp +++ b/Libraries/LibJS/AST.cpp @@ -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); |