Make Callable not crash on call when the object has been freed
Also add a GDScript test for this case.
This commit is contained in:
parent
ffdb3cccd2
commit
ea44744e2d
3 changed files with 20 additions and 0 deletions
|
@ -50,6 +50,15 @@ void Callable::call(const Variant **p_arguments, int p_argcount, Variant &r_retu
|
||||||
custom->call(p_arguments, p_argcount, r_return_value, r_call_error);
|
custom->call(p_arguments, p_argcount, r_return_value, r_call_error);
|
||||||
} else {
|
} else {
|
||||||
Object *obj = ObjectDB::get_instance(ObjectID(object));
|
Object *obj = ObjectDB::get_instance(ObjectID(object));
|
||||||
|
#ifdef DEBUG_ENABLED
|
||||||
|
if (!obj) {
|
||||||
|
r_call_error.error = CallError::CALL_ERROR_INSTANCE_IS_NULL;
|
||||||
|
r_call_error.argument = 0;
|
||||||
|
r_call_error.expected = 0;
|
||||||
|
r_return_value = Variant();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
r_return_value = obj->call(method, p_arguments, p_argcount, r_call_error);
|
r_return_value = obj->call(method, p_arguments, p_argcount, r_call_error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
func test():
|
||||||
|
var node := Node.new()
|
||||||
|
var inside_tree = node.is_inside_tree
|
||||||
|
node.free()
|
||||||
|
inside_tree.call()
|
|
@ -0,0 +1,6 @@
|
||||||
|
GDTEST_RUNTIME_ERROR
|
||||||
|
>> SCRIPT ERROR
|
||||||
|
>> on function: test()
|
||||||
|
>> runtime/errors/callable_call_after_free_object.gd
|
||||||
|
>> 5
|
||||||
|
>> Attempt to call function 'null::is_inside_tree (Callable)' on a null instance.
|
Loading…
Reference in a new issue