Merge pull request #78634 from Sauermann/fix-notification-order

Fix `Object::notification` order
This commit is contained in:
Rémi Verschelde 2023-08-30 08:44:36 +02:00
commit 8edc0b43b9
No known key found for this signature in database
GPG key ID: C3336907360768E1
14 changed files with 314 additions and 28 deletions

View file

@ -1921,14 +1921,23 @@ Variant GDScriptInstance::callp(const StringName &p_method, const Variant **p_ar
return Variant();
}
void GDScriptInstance::notification(int p_notification) {
void GDScriptInstance::notification(int p_notification, bool p_reversed) {
//notification is not virtual, it gets called at ALL levels just like in C.
Variant value = p_notification;
const Variant *args[1] = { &value };
List<GDScript *> pl;
GDScript *sptr = script.ptr();
while (sptr) {
HashMap<StringName, GDScriptFunction *>::Iterator E = sptr->member_functions.find(GDScriptLanguage::get_singleton()->strings._notification);
if (p_reversed) {
pl.push_back(sptr);
} else {
pl.push_front(sptr);
}
sptr = sptr->_base;
}
for (GDScript *sc : pl) {
HashMap<StringName, GDScriptFunction *>::Iterator E = sc->member_functions.find(GDScriptLanguage::get_singleton()->strings._notification);
if (E) {
Callable::CallError err;
E->value->call(this, args, 1, err);
@ -1936,7 +1945,6 @@ void GDScriptInstance::notification(int p_notification) {
//print error about notification call
}
}
sptr = sptr->_base;
}
}

View file

@ -332,7 +332,7 @@ public:
Variant debug_get_member_by_index(int p_idx) const { return members[p_idx]; }
virtual void notification(int p_notification);
virtual void notification(int p_notification, bool p_reversed = false);
String to_string(bool *r_valid);
virtual Ref<Script> get_script() const;

View file

@ -1978,7 +1978,7 @@ const Variant CSharpInstance::get_rpc_config() const {
return script->get_rpc_config();
}
void CSharpInstance::notification(int p_notification) {
void CSharpInstance::notification(int p_notification, bool p_reversed) {
if (p_notification == Object::NOTIFICATION_PREDELETE) {
// When NOTIFICATION_PREDELETE is sent, we also take the chance to call Dispose().
// It's safe to call Dispose() multiple times and NOTIFICATION_PREDELETE is guaranteed
@ -1996,7 +1996,7 @@ void CSharpInstance::notification(int p_notification) {
return;
}
_call_notification(p_notification);
_call_notification(p_notification, p_reversed);
GDMonoCache::managed_callbacks.CSharpInstanceBridge_CallDispose(
gchandle.get_intptr(), /* okIfNull */ false);
@ -2004,10 +2004,10 @@ void CSharpInstance::notification(int p_notification) {
return;
}
_call_notification(p_notification);
_call_notification(p_notification, p_reversed);
}
void CSharpInstance::_call_notification(int p_notification) {
void CSharpInstance::_call_notification(int p_notification, bool p_reversed) {
Variant arg = p_notification;
const Variant *args[1] = { &arg };
StringName method_name = SNAME("_notification");

View file

@ -283,8 +283,8 @@ public:
const Variant get_rpc_config() const override;
void notification(int p_notification) override;
void _call_notification(int p_notification);
void notification(int p_notification, bool p_reversed = false) override;
void _call_notification(int p_notification, bool p_reversed = false);
String to_string(bool *r_valid) override;