Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 0 additions & 7 deletions include/godot_cpp/core/class_db.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,6 @@ class ClassDB {
AHashMap<StringName, VirtualMethod> virtual_methods;
std::set<StringName> property_names;
std::set<StringName> constant_names;
// Pointer to the parent custom class, if any. Will be null if the parent class is a Godot class.
ClassInfo *parent_ptr = nullptr;
};

private:
Expand Down Expand Up @@ -233,11 +231,6 @@ void ClassDB::_register_class(bool p_virtual, bool p_exposed, bool p_runtime) {
cl.name = T::get_class_static();
cl.parent_name = T::get_parent_class_static();
cl.level = current_level;
AHashMap<StringName, ClassInfo>::Iterator parent_it = classes.find(cl.parent_name);
if (parent_it != classes.end()) {
// Assign parent if it is also a custom class
cl.parent_ptr = &parent_it->value;
}
classes[cl.name] = cl;
class_register_order.push_back(cl.name);

Expand Down
24 changes: 20 additions & 4 deletions src/core/class_db.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,13 @@ MethodBind *ClassDB::get_method(const StringName &p_class, const StringName &p_m
if (method != type->method_map.end()) {
return method->value;
}
type = type->parent_ptr;
continue;

AHashMap<StringName, ClassInfo>::Iterator parent_it = classes.find(type->parent_name);
if (parent_it == classes.end()) {
break;
}

type = &parent_it->value;
}

return nullptr;
Expand Down Expand Up @@ -243,7 +248,13 @@ void ClassDB::add_signal(const StringName &p_class, const MethodInfo &p_signal)
ClassInfo *check = &cl;
while (check) {
ERR_FAIL_COND_MSG(check->signal_names.find(p_signal.name) != check->signal_names.end(), String("Class '{0}' already has signal '{1}'.").format(Array::make(p_class, p_signal.name)));
check = check->parent_ptr;

AHashMap<StringName, ClassInfo>::Iterator parent_it = classes.find(check->parent_name);
if (parent_it == classes.end()) {
break;
}

check = &parent_it->value;
}

// register our signal in our plugin
Expand Down Expand Up @@ -303,7 +314,12 @@ GDExtensionClassCallVirtual ClassDB::get_virtual_func(void *p_userdata, GDExtens
return method_it->value.func;
}

type = type->parent_ptr;
AHashMap<StringName, ClassInfo>::Iterator parent_it = classes.find(type->parent_name);
if (parent_it == classes.end()) {
break;
}

type = &parent_it->value;
}

return nullptr;
Expand Down