diff --git a/patches/1165.patch b/patches/1165.patch index 2ada651..2dfce68 100644 --- a/patches/1165.patch +++ b/patches/1165.patch @@ -1,8 +1,8 @@ diff --git a/binding_generator.py b/binding_generator.py -index d04c698..bb4a6a5 100644 +index 6e47e7bcb..44c8fe75d 100644 --- a/binding_generator.py +++ b/binding_generator.py -@@ -97,9 +97,9 @@ def get_file_list(api_filepath, output_dir, headers=False, sources=False): +@@ -97,9 +97,10 @@ def get_file_list(api_filepath, output_dir, headers=False, sources=False): files.append(str(source_filename.as_posix())) for engine_class in api["classes"]: @@ -11,10 +11,11 @@ index d04c698..bb4a6a5 100644 if engine_class["name"] == "ClassDB": - continue + engine_class["name"] = "ClassDBSingleton" ++ engine_class["alias_for"] = "ClassDB" header_filename = include_gen_folder / "classes" / (camel_to_snake(engine_class["name"]) + ".hpp") source_filename = source_gen_folder / "classes" / (camel_to_snake(engine_class["name"]) + ".cpp") if headers: -@@ -1036,21 +1036,21 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node): +@@ -1036,21 +1037,23 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node): # First create map of classes and singletons. for class_api in api["classes"]: @@ -23,6 +24,7 @@ index d04c698..bb4a6a5 100644 if class_api["name"] == "ClassDB": - continue + class_api["name"] = "ClassDBSingleton" ++ class_api["alias_for"] = "ClassDB" engine_classes[class_api["name"]] = class_api["is_refcounted"] for native_struct in api["native_structures"]: engine_classes[native_struct["name"]] = False @@ -32,6 +34,7 @@ index d04c698..bb4a6a5 100644 + # Generate code for the ClassDB singleton under a different name. + if singleton["name"] == "ClassDB": + singleton["name"] = "ClassDBSingleton" ++ singleton["alias_for"] = "ClassDB" singletons.append(singleton["name"]) for class_api in api["classes"]: @@ -41,7 +44,7 @@ index d04c698..bb4a6a5 100644 # Check used classes for header include. used_classes = set() fully_used_classes = set() -@@ -1242,7 +1242,7 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us +@@ -1242,7 +1245,7 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us if len(fully_used_classes) > 0: result.append("") @@ -50,7 +53,19 @@ index d04c698..bb4a6a5 100644 result.append("#include ") result.append("") result.append("#include ") -@@ -1421,6 +1421,51 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us +@@ -1263,7 +1266,10 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us + inherits = class_api["inherits"] if "inherits" in class_api else "Wrapped" + result.append(f"class {class_name} : public {inherits} {{") + +- result.append(f"\tGDEXTENSION_CLASS({class_name}, {inherits})") ++ if "alias_for" in class_api: ++ result.append(f"\tGDEXTENSION_CLASS_ALIAS({class_name}, {class_api['alias_for']}, {inherits})") ++ else: ++ result.append(f"\tGDEXTENSION_CLASS({class_name}, {inherits})") + result.append("") + + result.append("public:") +@@ -1421,6 +1427,51 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us result.append(f'VARIANT_ENUM_CAST({class_name}::{enum_api["name"]});') result.append("") @@ -102,31 +117,7 @@ index d04c698..bb4a6a5 100644 result.append(f"#endif // ! {header_guard}") return "\n".join(result) -@@ -1453,7 +1498,10 @@ def generate_engine_class_source(class_api, used_classes, fully_used_classes, us - - if is_singleton: - result.append(f"{class_name} *{class_name}::get_singleton() {{") -- result.append(f"\tconst StringName _gde_class_name = {class_name}::get_class_static();") -+ if class_name != "ClassDBSingleton": -+ result.append(f"\tconst StringName _gde_class_name = {class_name}::get_class_static();") -+ else: -+ result.append(f"\tstatic const StringName _gde_class_name = StringName(\"ClassDB\");") - result.append( - "\tstatic GDExtensionObjectPtr singleton_obj = internal::gdextension_interface_global_get_singleton(_gde_class_name._native_ptr());" - ) -@@ -1480,7 +1528,10 @@ def generate_engine_class_source(class_api, used_classes, fully_used_classes, us - result.append(method_signature + " {") - - # Method body. -- result.append(f"\tconst StringName _gde_class_name = {class_name}::get_class_static();") -+ if class_name != "ClassDBSingleton": -+ result.append(f"\tconst StringName _gde_class_name = {class_name}::get_class_static();") -+ else: -+ result.append(f"\tstatic const StringName _gde_class_name = StringName(\"ClassDB\");") - result.append(f'\tconst StringName _gde_method_name = "{method["name"]}";') - result.append( - f'\tstatic GDExtensionMethodBindPtr _gde_method_bind = internal::gdextension_interface_classdb_get_method_bind(_gde_class_name._native_ptr(), _gde_method_name._native_ptr(), {method["hash"]});' -@@ -2285,6 +2336,7 @@ def escape_identifier(id): +@@ -2288,6 +2339,7 @@ def escape_identifier(id): "operator": "_operator", "typeof": "type_of", "typename": "type_name", @@ -134,8 +125,41 @@ index d04c698..bb4a6a5 100644 } if id in cpp_keywords_map: return cpp_keywords_map[id] +diff --git a/include/godot_cpp/classes/wrapped.hpp b/include/godot_cpp/classes/wrapped.hpp +index f2efbd091..d297945d6 100644 +--- a/include/godot_cpp/classes/wrapped.hpp ++++ b/include/godot_cpp/classes/wrapped.hpp +@@ -305,7 +305,7 @@ public: + }; + + // Don't use this for your classes, use GDCLASS() instead. +-#define GDEXTENSION_CLASS(m_class, m_inherits) \ ++#define GDEXTENSION_CLASS_ALIAS(m_class, m_alias_for, m_inherits) \ + private: \ + void operator=(const m_class &p_rval) {} \ + \ +@@ -353,7 +353,7 @@ public: + static void initialize_class() {} \ + \ + static ::godot::StringName &get_class_static() { \ +- static ::godot::StringName string_name = ::godot::StringName(#m_class); \ ++ static ::godot::StringName string_name = ::godot::StringName(#m_alias_for); \ + return string_name; \ + } \ + \ +@@ -378,6 +378,9 @@ public: + _gde_binding_free_callback, \ + _gde_binding_reference_callback, \ + }; \ +- m_class() : m_class(#m_class) {} ++ m_class() : m_class(#m_alias_for) {} ++ ++// Don't use this for your classes, use GDCLASS() instead. ++#define GDEXTENSION_CLASS(m_class, m_inherits) GDEXTENSION_CLASS_ALIAS(m_class, m_class, m_inherits) + + #endif // GODOT_WRAPPED_HPP diff --git a/include/godot_cpp/core/class_db.hpp b/include/godot_cpp/core/class_db.hpp -index b1625bf..26dfb7e 100644 +index 0802a45dc..35fb05310 100644 --- a/include/godot_cpp/core/class_db.hpp +++ b/include/godot_cpp/core/class_db.hpp @@ -38,6 +38,8 @@ @@ -147,7 +171,7 @@ index b1625bf..26dfb7e 100644 #include #include #include -@@ -146,6 +148,8 @@ public: +@@ -137,6 +139,8 @@ class ClassDB { static void initialize(GDExtensionInitializationLevel p_level); static void deinitialize(GDExtensionInitializationLevel p_level); @@ -157,10 +181,10 @@ index b1625bf..26dfb7e 100644 #define BIND_CONSTANT(m_constant) \ diff --git a/src/core/class_db.cpp b/src/core/class_db.cpp -index e8bb40c..cfd065e 100644 +index 159c03142..e12e569a2 100644 --- a/src/core/class_db.cpp +++ b/src/core/class_db.cpp -@@ -318,7 +318,18 @@ GDExtensionClassCallVirtual ClassDB::get_virtual_func(void *p_userdata, GDExtens +@@ -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::iterator callbacks_it = instance_binding_callbacks.find(p_class);