summaryrefslogtreecommitdiff
path: root/Libraries/LibJS/AST.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Libraries/LibJS/AST.cpp')
-rw-r--r--Libraries/LibJS/AST.cpp20
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);