mirror of
https://github.com/RGBCube/serenity
synced 2025-05-22 17:15:08 +00:00
LibJS: Make typeof return undefined for undefined variables
This makes `typeof i_dont_exist` return `undefined` instead of throwing an error.
This commit is contained in:
parent
b0932b0aec
commit
0b74ea3d6a
2 changed files with 32 additions and 3 deletions
|
@ -585,9 +585,25 @@ Value UnaryExpression::execute(Interpreter& interpreter) const
|
|||
return base_object->delete_property(reference.name());
|
||||
}
|
||||
|
||||
auto lhs_result = m_lhs->execute(interpreter);
|
||||
if (interpreter.exception())
|
||||
return {};
|
||||
Value lhs_result;
|
||||
if (m_op == UnaryOp::Typeof && m_lhs->is_identifier()) {
|
||||
auto reference = m_lhs->to_reference(interpreter);
|
||||
if (interpreter.exception()) {
|
||||
return {};
|
||||
}
|
||||
// FIXME: standard recommends checking with is_unresolvable but it ALWAYS return false here
|
||||
if (reference.is_local_variable() || reference.is_global_variable()) {
|
||||
auto name = reference.name();
|
||||
lhs_result = interpreter.get_variable(name.to_string()).value_or(js_undefined());
|
||||
if (interpreter.exception())
|
||||
return {};
|
||||
}
|
||||
} else {
|
||||
lhs_result = m_lhs->execute(interpreter);
|
||||
if (interpreter.exception())
|
||||
return {};
|
||||
}
|
||||
|
||||
switch (m_op) {
|
||||
case UnaryOp::BitwiseNot:
|
||||
return bitwise_not(interpreter, lhs_result);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue