Merge pull request #91364 from vnen/gdscript-implicit-ready-base-first

GDScript: Call implicit ready on base script first
This commit is contained in:
Rémi Verschelde 2024-05-02 17:31:32 +02:00
commit a7029e4c8a
No known key found for this signature in database
GPG Key ID: C3336907360768E1
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; 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) { Variant GDScriptInstance::callp(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
GDScript *sptr = script.ptr(); GDScript *sptr = script.ptr();
if (unlikely(p_method == SNAME("_ready"))) { if (unlikely(p_method == SNAME("_ready"))) {
// Call implicit ready first, including for the super classes. // Call implicit ready first, including for the super classes recursively.
while (sptr) { _call_implicit_ready_recursively(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();
} }
while (sptr) { while (sptr) {
HashMap<StringName, GDScriptFunction *>::Iterator E = sptr->member_functions.find(p_method); HashMap<StringName, GDScriptFunction *>::Iterator E = sptr->member_functions.find(p_method);

View File

@ -365,6 +365,8 @@ class GDScriptInstance : public ScriptInstance {
SelfList<GDScriptFunctionState>::List pending_func_states; SelfList<GDScriptFunctionState>::List pending_func_states;
void _call_implicit_ready_recursively(GDScript *p_script);
public: public:
virtual Object *get_owner() { return owner; } virtual Object *get_owner() { return owner; }

View File

@ -0,0 +1,18 @@
#GH-63329
class A extends Node:
@onready var a := get_value("a")
func get_value(var_name: String) -> String:
print(var_name)
return var_name
class B extends A:
@onready var b := get_value("b")
func _ready():
pass
func test():
var node := B.new()
node._ready()
node.free()

View File

@ -0,0 +1,3 @@
GDTEST_OK
a
b