LibJS: Throw TypeError when calling non-function object

We now have "undefined is not a function" :^)
This commit is contained in:
Linus Groh 2020-03-30 13:41:17 +01:00 committed by Andreas Kling
parent d4e3688f4f
commit fb0401871c
Notes: sideshowbarker 2024-07-19 08:03:07 +09:00
2 changed files with 34 additions and 2 deletions

View file

@ -66,8 +66,9 @@ Value CallExpression::execute(Interpreter& interpreter) const
if (interpreter.exception())
return {};
ASSERT(callee.is_object());
ASSERT(callee.as_object()->is_function());
if (!callee.is_object() || !callee.as_object()->is_function())
return interpreter.throw_exception<Error>("TypeError", String::format("%s is not a function", callee.to_string().characters()));
auto* function = static_cast<Function*>(callee.as_object());
auto& call_frame = interpreter.push_call_frame();

View file

@ -0,0 +1,31 @@
function assert(x) { if (!x) throw 1; }
try {
try {
var b = true;
b();
} catch(e) {
assert(e.name === "TypeError");
assert(e.message === "true is not a function");
}
try {
var n = 100 + 20 + 3;
n();
} catch(e) {
assert(e.name === "TypeError");
assert(e.message === "123 is not a function");
}
try {
var o = {};
o.a();
} catch(e) {
assert(e.name === "TypeError");
assert(e.message === "undefined is not a function");
}
console.log("PASS");
} catch(e) {
console.log("FAIL: " + e);
}