summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Snopek <dsnopek@gmail.com>2023-07-06 21:39:19 -0500
committerDavid Snopek <dsnopek@gmail.com>2023-09-19 10:54:07 -0500
commit52ca3ef547b5586fd0a085c5b01a08b8f95332ca (patch)
tree269287210c31473a9cc7480813d3d874b472554c /src
parent0d6de7a80e328c1969c9feabaf268008764c6812 (diff)
downloadredot-cpp-52ca3ef547b5586fd0a085c5b01a08b8f95332ca.tar.gz
Handle missing instance binding callbacks by finding the closest parent
Diffstat (limited to 'src')
-rw-r--r--src/core/class_db.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/core/class_db.cpp b/src/core/class_db.cpp
index 159c031..e12e569 100644
--- a/src/core/class_db.cpp
+++ b/src/core/class_db.cpp
@@ -310,7 +310,18 @@ GDExtensionClassCallVirtual ClassDB::get_virtual_func(void *p_userdata, GDExtens
const GDExtensionInstanceBindingCallbacks *ClassDB::get_instance_binding_callbacks(const StringName &p_class) {
std::unordered_map<StringName, const GDExtensionInstanceBindingCallbacks *>::iterator callbacks_it = instance_binding_callbacks.find(p_class);
- ERR_FAIL_COND_V_MSG(callbacks_it == instance_binding_callbacks.end(), nullptr, String("Cannot find instance binding callbacks for class '{0}'.").format(Array::make(p_class)));
+ if (likely(callbacks_it != instance_binding_callbacks.end())) {
+ return callbacks_it->second;
+ }
+
+ // If we don't have an instance binding callback for the given class, find the closest parent where we do.
+ StringName class_name = p_class;
+ do {
+ class_name = get_parent_class(class_name);
+ ERR_FAIL_COND_V_MSG(class_name == StringName(), nullptr, String("Cannot find instance binding callbacks for class '{0}'.").format(Array::make(p_class)));
+ callbacks_it = instance_binding_callbacks.find(class_name);
+ } while (callbacks_it == instance_binding_callbacks.end());
+
return callbacks_it->second;
}