Merge pull request #78634 from Sauermann/fix-notification-order
Fix `Object::notification` order
This commit is contained in:
commit
8edc0b43b9
14 changed files with 314 additions and 28 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue