Skip to content

Commit

Permalink
updated 1165
Browse files Browse the repository at this point in the history
  • Loading branch information
DmitriySalnikov committed Jul 31, 2023
1 parent d42db29 commit 23f69b2
Showing 1 changed file with 58 additions and 34 deletions.
92 changes: 58 additions & 34 deletions patches/1165.patch
Original file line number Diff line number Diff line change
@@ -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"]:
Expand All @@ -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"]:
Expand All @@ -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
Expand All @@ -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"]:
Expand All @@ -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("")

Expand All @@ -50,7 +53,19 @@ index d04c698..bb4a6a5 100644
result.append("#include <godot_cpp/core/class_db.hpp>")
result.append("")
result.append("#include <type_traits>")
@@ -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("")

Expand Down Expand Up @@ -102,40 +117,49 @@ 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",
+ "enum": "_enum",
}
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 @@
Expand All @@ -147,7 +171,7 @@ index b1625bf..26dfb7e 100644
#include <list>
#include <set>
#include <string>
@@ -146,6 +148,8 @@ public:
@@ -137,6 +139,8 @@ class ClassDB {

static void initialize(GDExtensionInitializationLevel p_level);
static void deinitialize(GDExtensionInitializationLevel p_level);
Expand All @@ -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<StringName, const GDExtensionInstanceBindingCallbacks *>::iterator callbacks_it = instance_binding_callbacks.find(p_class);
Expand Down

0 comments on commit 23f69b2

Please sign in to comment.