Skip to content

Commit 3536803

Browse files
Implement vararg methods of builtin classes.
1 parent ff6f579 commit 3536803

File tree

2 files changed

+87
-13
lines changed

2 files changed

+87
-13
lines changed

binding_generator.py

Lines changed: 85 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ def get_file_list(api_filepath, output_dir, headers=False, sources=False):
121121
include_gen_folder / "variant" / "builtin_binds.hpp",
122122
include_gen_folder / "variant" / "utility_functions.hpp",
123123
include_gen_folder / "variant" / "variant_size.hpp",
124+
include_gen_folder / "variant" / "builtin_vararg_methods.hpp",
124125
include_gen_folder / "classes" / "global_constants.hpp",
125126
include_gen_folder / "classes" / "global_constants_binds.hpp",
126127
]:
@@ -344,6 +345,40 @@ def generate_builtin_bindings(api, output_dir, build_config):
344345

345346
builtin_binds_file.write("\n".join(builtin_binds))
346347

348+
# Create a header to implement all builtin class vararg methods and be included in "variant.hpp".
349+
builtin_vararg_methods_header = include_gen_folder / "builtin_vararg_methods.hpp"
350+
builtin_vararg_methods_header.open("w+").write(
351+
generate_builtin_class_vararg_method_implements_header(api["builtin_classes"])
352+
)
353+
354+
355+
def generate_builtin_class_vararg_method_implements_header(builtin_classes):
356+
result = []
357+
358+
add_header("builtin_vararg_methods.hpp", result)
359+
360+
header_guard = "GODOT_CPP_BUILTIN_VARARG_METHODS_HPP"
361+
result.append(f"#ifndef {header_guard}")
362+
result.append(f"#define {header_guard}")
363+
result.append("")
364+
for builtin_api in builtin_classes:
365+
if not "methods" in builtin_api:
366+
continue
367+
class_name = builtin_api["name"]
368+
for method in builtin_api["methods"]:
369+
if not method["is_vararg"]:
370+
continue
371+
372+
result += make_varargs_template(
373+
method, "is_static" in method and method["is_static"], class_name, False, False, True
374+
)
375+
result.append("")
376+
377+
result.append("")
378+
result.append(f"#endif // ! {header_guard}")
379+
380+
return "\n".join(result)
381+
347382

348383
def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_classes):
349384
result = []
@@ -1969,10 +2004,22 @@ def make_signature(
19692004
return function_signature
19702005

19712006

1972-
def make_varargs_template(function_data, static=False):
2007+
def make_varargs_template(
2008+
function_data,
2009+
static=False,
2010+
class_befor_signature="",
2011+
with_public_declare=True,
2012+
with_indent=True,
2013+
for_builtin_classes=False,
2014+
):
19732015
result = []
19742016

1975-
function_signature = "\tpublic: template<class... Args> "
2017+
function_signature = ""
2018+
2019+
if with_public_declare:
2020+
function_signature = "public: "
2021+
2022+
function_signature += "template<class... Args> "
19762023

19772024
if static:
19782025
function_signature += "static "
@@ -1993,6 +2040,8 @@ def make_varargs_template(function_data, static=False):
19932040
if not function_signature.endswith("*"):
19942041
function_signature += " "
19952042

2043+
if len(class_befor_signature) > 0:
2044+
function_signature += class_befor_signature + "::"
19962045
function_signature += f'{escape_identifier(function_data["name"])}'
19972046

19982047
method_arguments = []
@@ -2013,7 +2062,7 @@ def make_varargs_template(function_data, static=False):
20132062
function_signature += " {"
20142063
result.append(function_signature)
20152064

2016-
args_array = f"\t\tstd::array<Variant, {len(method_arguments)} + sizeof...(Args)> variant_args {{ "
2065+
args_array = f"\tstd::array<Variant, {len(method_arguments)} + sizeof...(Args)> variant_args {{ "
20172066
for argument in method_arguments:
20182067
if argument["type"] == "Variant":
20192068
args_array += argument["name"]
@@ -2023,19 +2072,42 @@ def make_varargs_template(function_data, static=False):
20232072

20242073
args_array += "Variant(args)... };"
20252074
result.append(args_array)
2026-
result.append(f"\t\tstd::array<const Variant *, {len(method_arguments)} + sizeof...(Args)> call_args;")
2027-
result.append("\t\tfor(size_t i = 0; i < variant_args.size(); i++) {")
2028-
result.append("\t\t\tcall_args[i] = &variant_args[i];")
2029-
result.append("\t\t}")
2075+
result.append(f"\tstd::array<const Variant *, {len(method_arguments)} + sizeof...(Args)> call_args;")
2076+
result.append("\tfor(size_t i = 0; i < variant_args.size(); i++) {")
2077+
result.append("\t\tcall_args[i] = &variant_args[i];")
2078+
result.append("\t}")
20302079

2031-
call_line = "\t\t"
2080+
call_line = "\t"
20322081

2033-
if return_type != "void":
2034-
call_line += "return "
2082+
if not for_builtin_classes:
2083+
if return_type != "void":
2084+
call_line += "return "
20352085

2036-
call_line += f'{escape_identifier(function_data["name"])}_internal(call_args.data(), variant_args.size());'
2037-
result.append(call_line)
2038-
result.append("\t}")
2086+
call_line += f'{escape_identifier(function_data["name"])}_internal(call_args.data(), variant_args.size());'
2087+
result.append(call_line)
2088+
else:
2089+
base = "(GDExtensionTypePtr)&opaque"
2090+
if static:
2091+
base = "nullptr"
2092+
2093+
ret = "nullptr"
2094+
if return_type != "void":
2095+
ret = "&ret"
2096+
result.append(f'\t{correct_type(function_data["return_type"])} ret;')
2097+
2098+
function_name = function_data["name"]
2099+
result.append(
2100+
f"\t_method_bindings.method_{function_name}({base}, reinterpret_cast<GDExtensionConstTypePtr *>(call_args.data()), {ret}, {len(method_arguments)} + sizeof...(Args));"
2101+
)
2102+
2103+
if return_type != "void":
2104+
result.append("\treturn ret;")
2105+
2106+
result.append("}")
2107+
2108+
if with_indent:
2109+
for i in range(len(result)):
2110+
result[i] = "\t" + result[i]
20392111

20402112
return result
20412113

include/godot_cpp/variant/variant.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,8 @@ String vformat(const String &p_text, const VarArgs... p_args) {
334334
return p_text % args_array;
335335
}
336336

337+
#include <godot_cpp/variant/builtin_vararg_methods.hpp>
338+
337339
} // namespace godot
338340

339341
#endif // GODOT_VARIANT_HPP

0 commit comments

Comments
 (0)