Skip to content

Commit b303f76

Browse files
committed
Rollback PR godotengine#1676 to see if it fixes my cmake issues
1 parent a3f8921 commit b303f76

File tree

6 files changed

+23
-31
lines changed

6 files changed

+23
-31
lines changed

binding_generator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1694,7 +1694,7 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
16941694
# condition returns false (in such cases it can't compile due to ambiguity).
16951695
f"\t\tif constexpr (!std::is_same_v<decltype(&B::{method_name}), decltype(&T::{method_name})>) {{"
16961696
)
1697-
result.append(f"\t\t\tBIND_VIRTUAL_METHOD(T, {method_name}, {method['hash']});")
1697+
result.append(f"\t\t\tBIND_VIRTUAL_METHOD(T, {method_name});")
16981698
result.append("\t\t}")
16991699

17001700
result.append("\t}")

gdextension/gdextension_interface.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -273,9 +273,7 @@ typedef GDExtensionObjectPtr (*GDExtensionClassCreateInstance2)(void *p_class_us
273273
typedef void (*GDExtensionClassFreeInstance)(void *p_class_userdata, GDExtensionClassInstancePtr p_instance);
274274
typedef GDExtensionClassInstancePtr (*GDExtensionClassRecreateInstance)(void *p_class_userdata, GDExtensionObjectPtr p_object);
275275
typedef GDExtensionClassCallVirtual (*GDExtensionClassGetVirtual)(void *p_class_userdata, GDExtensionConstStringNamePtr p_name);
276-
typedef GDExtensionClassCallVirtual (*GDExtensionClassGetVirtual2)(void *p_class_userdata, GDExtensionConstStringNamePtr p_name, uint32_t p_hash);
277276
typedef void *(*GDExtensionClassGetVirtualCallData)(void *p_class_userdata, GDExtensionConstStringNamePtr p_name);
278-
typedef void *(*GDExtensionClassGetVirtualCallData2)(void *p_class_userdata, GDExtensionConstStringNamePtr p_name, uint32_t p_hash);
279277
typedef void (*GDExtensionClassCallVirtualWithData)(GDExtensionClassInstancePtr p_instance, GDExtensionConstStringNamePtr p_name, void *p_virtual_call_userdata, const GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret);
280278

281279
typedef struct {
@@ -386,14 +384,14 @@ typedef struct {
386384
GDExtensionClassFreeInstance free_instance_func; // Destructor; mandatory.
387385
GDExtensionClassRecreateInstance recreate_instance_func;
388386
// Queries a virtual function by name and returns a callback to invoke the requested virtual function.
389-
GDExtensionClassGetVirtual2 get_virtual_func;
387+
GDExtensionClassGetVirtual get_virtual_func;
390388
// Paired with `call_virtual_with_data_func`, this is an alternative to `get_virtual_func` for extensions that
391389
// need or benefit from extra data when calling virtual functions.
392390
// Returns user data that will be passed to `call_virtual_with_data_func`.
393391
// Returning `NULL` from this function signals to Godot that the virtual function is not overridden.
394392
// Data returned from this function should be managed by the extension and must be valid until the extension is deinitialized.
395393
// You should supply either `get_virtual_func`, or `get_virtual_call_data_func` with `call_virtual_with_data_func`.
396-
GDExtensionClassGetVirtualCallData2 get_virtual_call_data_func;
394+
GDExtensionClassGetVirtualCallData get_virtual_call_data_func;
397395
// Used to call virtual functions when `get_virtual_call_data_func` is not null.
398396
GDExtensionClassCallVirtualWithData call_virtual_with_data_func;
399397
void *class_userdata; // Per-class user data, later accessible in instance bindings.

include/godot_cpp/core/class_db.hpp

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -88,17 +88,12 @@ class ClassDB {
8888

8989
public:
9090
struct ClassInfo {
91-
struct VirtualMethod {
92-
GDExtensionClassCallVirtual func;
93-
uint32_t hash;
94-
};
95-
9691
StringName name;
9792
StringName parent_name;
9893
GDExtensionInitializationLevel level = GDEXTENSION_INITIALIZATION_SCENE;
9994
std::unordered_map<StringName, MethodBind *> method_map;
10095
std::set<StringName> signal_names;
101-
std::unordered_map<StringName, VirtualMethod> virtual_methods;
96+
std::unordered_map<StringName, GDExtensionClassCallVirtual> virtual_methods;
10297
std::set<StringName> property_names;
10398
std::set<StringName> constant_names;
10499
// Pointer to the parent custom class, if any. Will be null if the parent class is a Godot class.
@@ -122,13 +117,15 @@ class ClassDB {
122117
static void _register_class(bool p_virtual = false, bool p_exposed = true, bool p_runtime = false);
123118

124119
template <typename T>
125-
static GDExtensionObjectPtr _create_instance_func(void *data, GDExtensionBool p_notify_postinitialize) {
120+
static GDExtensionObjectPtr _create_instance_func(void *data /*, bool p_notify_postinitialize*/) {
126121
if constexpr (!std::is_abstract_v<T>) {
127122
Wrapped::_set_construct_info<T>();
128123
T *new_object = new ("", "") T;
124+
/*
129125
if (p_notify_postinitialize) {
130126
new_object->_postinitialize();
131127
}
128+
*/
132129
return new_object->_owner;
133130
} else {
134131
return nullptr;
@@ -198,13 +195,13 @@ class ClassDB {
198195
static void add_signal(const StringName &p_class, const MethodInfo &p_signal);
199196
static void bind_integer_constant(const StringName &p_class_name, const StringName &p_enum_name, const StringName &p_constant_name, GDExtensionInt p_constant_value, bool p_is_bitfield = false);
200197
// Binds an implementation of a virtual method defined in Godot.
201-
static void bind_virtual_method(const StringName &p_class, const StringName &p_method, GDExtensionClassCallVirtual p_call, uint32_t p_hash);
198+
static void bind_virtual_method(const StringName &p_class, const StringName &p_method, GDExtensionClassCallVirtual p_call);
202199
// Add a new virtual method that can be implemented by scripts.
203200
static void add_virtual_method(const StringName &p_class, const MethodInfo &p_method, const Vector<StringName> &p_arg_names = Vector<StringName>());
204201

205202
static MethodBind *get_method(const StringName &p_class, const StringName &p_method);
206203

207-
static GDExtensionClassCallVirtual get_virtual_func(void *p_userdata, GDExtensionConstStringNamePtr p_name, uint32_t p_hash);
204+
static GDExtensionClassCallVirtual get_virtual_func(void *p_userdata, GDExtensionConstStringNamePtr p_name);
208205
static const GDExtensionInstanceBindingCallbacks *get_instance_binding_callbacks(const StringName &p_class);
209206

210207
static void initialize(GDExtensionInitializationLevel p_level);
@@ -222,12 +219,12 @@ class ClassDB {
222219
#define BIND_BITFIELD_FLAG(m_constant) \
223220
::godot::ClassDB::bind_integer_constant(get_class_static(), ::godot::_gde_constant_get_bitfield_name(m_constant, #m_constant), #m_constant, m_constant, true);
224221

225-
#define BIND_VIRTUAL_METHOD(m_class, m_method, m_hash) \
222+
#define BIND_VIRTUAL_METHOD(m_class, m_method) \
226223
{ \
227224
auto _call##m_method = [](GDExtensionObjectPtr p_instance, const GDExtensionConstTypePtr *p_args, GDExtensionTypePtr p_ret) -> void { \
228225
call_with_ptr_args(reinterpret_cast<m_class *>(p_instance), &m_class::m_method, p_args, p_ret); \
229226
}; \
230-
::godot::ClassDB::bind_virtual_method(m_class::get_class_static(), #m_method, _call##m_method, m_hash); \
227+
::godot::ClassDB::bind_virtual_method(m_class::get_class_static(), #m_method, _call##m_method); \
231228
}
232229

233230
template <typename T, bool is_abstract>
@@ -251,12 +248,11 @@ void ClassDB::_register_class(bool p_virtual, bool p_exposed, bool p_runtime) {
251248
class_register_order.push_back(cl.name);
252249

253250
// Register this class with Godot
254-
GDExtensionClassCreationInfo4 class_info = {
251+
GDExtensionClassCreationInfo3 class_info = {
255252
p_virtual, // GDExtensionBool is_virtual;
256253
is_abstract, // GDExtensionBool is_abstract;
257254
p_exposed, // GDExtensionBool is_exposed;
258255
p_runtime, // GDExtensionBool is_runtime;
259-
nullptr, // GDExtensionConstStringPtr icon_path;
260256
T::set_bind, // GDExtensionClassSet set_func;
261257
T::get_bind, // GDExtensionClassGet get_func;
262258
T::has_get_property_list() ? T::get_property_list_bind : nullptr, // GDExtensionClassGetPropertyList get_property_list_func;
@@ -274,10 +270,11 @@ void ClassDB::_register_class(bool p_virtual, bool p_exposed, bool p_runtime) {
274270
&ClassDB::get_virtual_func, // GDExtensionClassGetVirtual get_virtual_func;
275271
nullptr, // GDExtensionClassGetVirtualCallData get_virtual_call_data_func;
276272
nullptr, // GDExtensionClassCallVirtualWithData call_virtual_func;
273+
nullptr,
277274
(void *)&T::get_class_static(), // void *class_userdata;
278275
};
279276

280-
internal::gdextension_interface_classdb_register_extension_class4(internal::library, cl.name._native_ptr(), cl.parent_name._native_ptr(), &class_info);
277+
internal::gdextension_interface_classdb_register_extension_class3(internal::library, cl.name._native_ptr(), cl.parent_name._native_ptr(), &class_info);
281278

282279
// call bind_methods etc. to register all members of the class
283280
T::initialize_class();

include/godot_cpp/godot.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ extern "C" GDExtensionInterfacePlaceHolderScriptInstanceUpdate gdextension_inter
185185
extern "C" GDExtensionInterfaceClassdbConstructObject2 gdextension_interface_classdb_construct_object2;
186186
extern "C" GDExtensionInterfaceClassdbGetMethodBind gdextension_interface_classdb_get_method_bind;
187187
extern "C" GDExtensionInterfaceClassdbGetClassTag gdextension_interface_classdb_get_class_tag;
188-
extern "C" GDExtensionInterfaceClassdbRegisterExtensionClass4 gdextension_interface_classdb_register_extension_class4;
188+
extern "C" GDExtensionInterfaceClassdbRegisterExtensionClass3 gdextension_interface_classdb_register_extension_class3;
189189
extern "C" GDExtensionInterfaceClassdbRegisterExtensionClassMethod gdextension_interface_classdb_register_extension_class_method;
190190
extern "C" GDExtensionInterfaceClassdbRegisterExtensionClassVirtualMethod gdextension_interface_classdb_register_extension_class_virtual_method;
191191
extern "C" GDExtensionInterfaceClassdbRegisterExtensionClassIntegerConstant gdextension_interface_classdb_register_extension_class_integer_constant;

src/core/class_db.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ void ClassDB::bind_integer_constant(const StringName &p_class_name, const String
285285
// Register it with Godot
286286
internal::gdextension_interface_classdb_register_extension_class_integer_constant(internal::library, p_class_name._native_ptr(), p_enum_name._native_ptr(), p_constant_name._native_ptr(), p_constant_value, p_is_bitfield);
287287
}
288-
GDExtensionClassCallVirtual ClassDB::get_virtual_func(void *p_userdata, GDExtensionConstStringNamePtr p_name, uint32_t p_hash) {
288+
GDExtensionClassCallVirtual ClassDB::get_virtual_func(void *p_userdata, GDExtensionConstStringNamePtr p_name) {
289289
// This is called by Godot the first time it calls a virtual function, and it caches the result, per object instance.
290290
// Because of this, it can happen from different threads at once.
291291
// It should be ok not using any mutex as long as we only READ data.
@@ -299,10 +299,10 @@ GDExtensionClassCallVirtual ClassDB::get_virtual_func(void *p_userdata, GDExtens
299299

300300
// Find method in current class, or any of its parent classes (Godot classes not included)
301301
while (type != nullptr) {
302-
std::unordered_map<StringName, ClassInfo::VirtualMethod>::const_iterator method_it = type->virtual_methods.find(*name);
302+
std::unordered_map<StringName, GDExtensionClassCallVirtual>::const_iterator method_it = type->virtual_methods.find(*name);
303303

304-
if (method_it != type->virtual_methods.end() && method_it->second.hash == p_hash) {
305-
return method_it->second.func;
304+
if (method_it != type->virtual_methods.end()) {
305+
return method_it->second;
306306
}
307307

308308
type = type->parent_ptr;
@@ -328,7 +328,7 @@ const GDExtensionInstanceBindingCallbacks *ClassDB::get_instance_binding_callbac
328328
return callbacks_it->second;
329329
}
330330

331-
void ClassDB::bind_virtual_method(const StringName &p_class, const StringName &p_method, GDExtensionClassCallVirtual p_call, uint32_t p_hash) {
331+
void ClassDB::bind_virtual_method(const StringName &p_class, const StringName &p_method, GDExtensionClassCallVirtual p_call) {
332332
std::unordered_map<StringName, ClassInfo>::iterator type_it = classes.find(p_class);
333333
ERR_FAIL_COND_MSG(type_it == classes.end(), String("Class '{0}' doesn't exist.").format(Array::make(p_class)));
334334

@@ -337,10 +337,7 @@ void ClassDB::bind_virtual_method(const StringName &p_class, const StringName &p
337337
ERR_FAIL_COND_MSG(type.method_map.find(p_method) != type.method_map.end(), String("Method '{0}::{1}()' already registered as non-virtual.").format(Array::make(p_class, p_method)));
338338
ERR_FAIL_COND_MSG(type.virtual_methods.find(p_method) != type.virtual_methods.end(), String("Virtual '{0}::{1}()' method already registered.").format(Array::make(p_class, p_method)));
339339

340-
type.virtual_methods[p_method] = ClassInfo::VirtualMethod{
341-
p_call,
342-
p_hash,
343-
};
340+
type.virtual_methods[p_method] = p_call;
344341
}
345342

346343
void ClassDB::add_virtual_method(const StringName &p_class, const MethodInfo &p_method, const Vector<StringName> &p_arg_names) {

src/godot.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ GDExtensionInterfacePlaceHolderScriptInstanceUpdate gdextension_interface_placeh
191191
GDExtensionInterfaceClassdbConstructObject2 gdextension_interface_classdb_construct_object2 = nullptr;
192192
GDExtensionInterfaceClassdbGetMethodBind gdextension_interface_classdb_get_method_bind = nullptr;
193193
GDExtensionInterfaceClassdbGetClassTag gdextension_interface_classdb_get_class_tag = nullptr;
194-
GDExtensionInterfaceClassdbRegisterExtensionClass4 gdextension_interface_classdb_register_extension_class4 = nullptr;
194+
GDExtensionInterfaceClassdbRegisterExtensionClass3 gdextension_interface_classdb_register_extension_class3 = nullptr;
195195
GDExtensionInterfaceClassdbRegisterExtensionClassMethod gdextension_interface_classdb_register_extension_class_method = nullptr;
196196
GDExtensionInterfaceClassdbRegisterExtensionClassVirtualMethod gdextension_interface_classdb_register_extension_class_virtual_method = nullptr;
197197
GDExtensionInterfaceClassdbRegisterExtensionClassIntegerConstant gdextension_interface_classdb_register_extension_class_integer_constant = nullptr;
@@ -473,7 +473,7 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge
473473
LOAD_PROC_ADDRESS(classdb_construct_object2, GDExtensionInterfaceClassdbConstructObject2);
474474
LOAD_PROC_ADDRESS(classdb_get_method_bind, GDExtensionInterfaceClassdbGetMethodBind);
475475
LOAD_PROC_ADDRESS(classdb_get_class_tag, GDExtensionInterfaceClassdbGetClassTag);
476-
LOAD_PROC_ADDRESS(classdb_register_extension_class4, GDExtensionInterfaceClassdbRegisterExtensionClass4);
476+
LOAD_PROC_ADDRESS(classdb_register_extension_class3, GDExtensionInterfaceClassdbRegisterExtensionClass3);
477477
LOAD_PROC_ADDRESS(classdb_register_extension_class_method, GDExtensionInterfaceClassdbRegisterExtensionClassMethod);
478478
LOAD_PROC_ADDRESS(classdb_register_extension_class_virtual_method, GDExtensionInterfaceClassdbRegisterExtensionClassVirtualMethod);
479479
LOAD_PROC_ADDRESS(classdb_register_extension_class_integer_constant, GDExtensionInterfaceClassdbRegisterExtensionClassIntegerConstant);

0 commit comments

Comments
 (0)