1
0
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:
George Marques
2024-04-30 11:50:10 -03:00
parent 64520fe674
commit 99b702ea3d
4 changed files with 36 additions and 10 deletions

View File

@@ -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);