Skip to content

Commit 9da6ecd

Browse files
authored
Merge pull request #1492 from dsnopek/4.2-cherrypicks-5
Cherry-picks for the godot-cpp 4.2 branch - 5th batch
2 parents 7e72c8b + c5204a2 commit 9da6ecd

File tree

4 files changed

+23
-13
lines changed

4 files changed

+23
-13
lines changed

binding_generator.py

+17-7
Original file line numberDiff line numberDiff line change
@@ -1535,13 +1535,16 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
15351535
result.append("\t \\")
15361536

15371537
for method in class_api["methods"]:
1538-
# ClassDBSingleton shouldn't have any static or vararg methods, but if some appear later, lets skip them.
1539-
if vararg:
1540-
continue
1538+
# ClassDBSingleton shouldn't have any static methods, but if some appear later, lets skip them.
15411539
if "is_static" in method and method["is_static"]:
15421540
continue
15431541

1544-
method_signature = "\tstatic "
1542+
vararg = "is_vararg" in method and method["is_vararg"]
1543+
if vararg:
1544+
method_signature = "\ttemplate<typename... Args> static "
1545+
else:
1546+
method_signature = "\tstatic "
1547+
15451548
return_type = None
15461549
if "return_type" in method:
15471550
return_type = correct_type(method["return_type"].replace("ClassDBSingleton", "ClassDB"), None, False)
@@ -1563,7 +1566,7 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
15631566
method_arguments = method["arguments"]
15641567

15651568
method_signature += make_function_parameters(
1566-
method_arguments, include_default=True, for_builtin=True, is_vararg=False
1569+
method_arguments, include_default=True, for_builtin=True, is_vararg=vararg
15671570
)
15681571

15691572
method_signature += ") { \\"
@@ -1577,6 +1580,8 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
15771580
method_body += f"({return_type})"
15781581
method_body += f'ClassDBSingleton::get_singleton()->{method["name"]}('
15791582
method_body += ", ".join(map(lambda x: escape_identifier(x["name"]), method_arguments))
1583+
if vararg:
1584+
method_body += ", args..."
15801585
method_body += "); \\"
15811586

15821587
result.append(method_body)
@@ -2224,9 +2229,9 @@ def make_varargs_template(
22242229
args_array = f"\tstd::array<Variant, {len(method_arguments)} + sizeof...(Args)> variant_args {{ "
22252230
for argument in method_arguments:
22262231
if argument["type"] == "Variant":
2227-
args_array += argument["name"]
2232+
args_array += escape_identifier(argument["name"])
22282233
else:
2229-
args_array += f'Variant({argument["name"]})'
2234+
args_array += f'Variant({escape_identifier(argument["name"])})'
22302235
args_array += ", "
22312236

22322237
args_array += "Variant(args)... };"
@@ -2426,6 +2431,7 @@ def correct_default_value(value, type_name):
24262431
"null": "nullptr",
24272432
'""': "String()",
24282433
'&""': "StringName()",
2434+
'^""': "NodePath()",
24292435
"[]": "Array()",
24302436
"{}": "Dictionary()",
24312437
"Transform2D(1, 0, 0, 1, 0, 0)": "Transform2D()", # Default transform.
@@ -2437,6 +2443,10 @@ def correct_default_value(value, type_name):
24372443
return f"{type_name}()"
24382444
if value.startswith("Array["):
24392445
return f"{{}}"
2446+
if value.startswith("&"):
2447+
return value[1::]
2448+
if value.startswith("^"):
2449+
return value[1::]
24402450
return value
24412451

24422452

include/godot_cpp/core/class_db.hpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -338,10 +338,10 @@ MethodBind *ClassDB::bind_vararg_method(uint32_t p_flags, StringName p_name, M p
338338
return bind;
339339
}
340340

341-
#define GDREGISTER_CLASS(m_class) ClassDB::register_class<m_class>();
342-
#define GDREGISTER_VIRTUAL_CLASS(m_class) ClassDB::register_class<m_class>(true);
343-
#define GDREGISTER_ABSTRACT_CLASS(m_class) ClassDB::register_abstract_class<m_class>();
344-
#define GDREGISTER_INTERNAL_CLASS(m_class) ClassDB::register_internal_class<m_class>();
341+
#define GDREGISTER_CLASS(m_class) ::godot::ClassDB::register_class<m_class>();
342+
#define GDREGISTER_VIRTUAL_CLASS(m_class) ::godot::ClassDB::register_class<m_class>(true);
343+
#define GDREGISTER_ABSTRACT_CLASS(m_class) ::godot::ClassDB::register_abstract_class<m_class>();
344+
#define GDREGISTER_INTERNAL_CLASS(m_class) ::godot::ClassDB::register_internal_class<m_class>();
345345

346346
} // namespace godot
347347

src/core/class_db.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ void ClassDB::deinitialize(GDExtensionInitializationLevel p_level) {
388388
{
389389
std::lock_guard<std::mutex> lock(engine_singletons_mutex);
390390
singleton_objects.reserve(engine_singletons.size());
391-
for (const std::pair<StringName, Object *> &pair : engine_singletons) {
391+
for (const std::pair<const StringName, Object *> &pair : engine_singletons) {
392392
singleton_objects.push_back(pair.second);
393393
}
394394
}

src/core/object.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ MethodInfo::operator Dictionary() const {
7575
dict["name"] = name;
7676
dict["args"] = internal::convert_property_list(arguments);
7777
Array da;
78-
for (int i = 0; i < default_arguments.size(); i++) {
78+
for (size_t i = 0; i < default_arguments.size(); i++) {
7979
da.push_back(default_arguments[i]);
8080
}
8181
dict["default_args"] = da;

0 commit comments

Comments
 (0)