You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
GDScript: Call implicit ready on base script first
It is generally expected that the base class is called before the inherited clas. This commit implements this behavior for the implicit ready function (`@onready` annotation) to make it consistent with the expectations.
This commit is contained in:
@@ -1958,19 +1958,22 @@ int GDScriptInstance::get_method_argument_count(const StringName &p_method, bool
|
||||
return 0;
|
||||
}
|
||||
|
||||
void GDScriptInstance::_call_implicit_ready_recursively(GDScript *p_script) {
|
||||
// Call base class first.
|
||||
if (p_script->_base) {
|
||||
_call_implicit_ready_recursively(p_script->_base);
|
||||
}
|
||||
if (p_script->implicit_ready) {
|
||||
Callable::CallError err;
|
||||
p_script->implicit_ready->call(this, nullptr, 0, err);
|
||||
}
|
||||
}
|
||||
|
||||
Variant GDScriptInstance::callp(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
|
||||
GDScript *sptr = script.ptr();
|
||||
if (unlikely(p_method == SNAME("_ready"))) {
|
||||
// Call implicit ready first, including for the super classes.
|
||||
while (sptr) {
|
||||
if (sptr->implicit_ready) {
|
||||
sptr->implicit_ready->call(this, nullptr, 0, r_error);
|
||||
}
|
||||
sptr = sptr->_base;
|
||||
}
|
||||
|
||||
// Reset this back for the regular call.
|
||||
sptr = script.ptr();
|
||||
// Call implicit ready first, including for the super classes recursively.
|
||||
_call_implicit_ready_recursively(sptr);
|
||||
}
|
||||
while (sptr) {
|
||||
HashMap<StringName, GDScriptFunction *>::Iterator E = sptr->member_functions.find(p_method);
|
||||
|
||||
Reference in New Issue
Block a user