Merge pull request #85770 from Repiteo/make-virtuals-refactor-and-fix

Refactor and fix `make_virtuals.py`
This commit is contained in:
Yuri Sizov 2023-12-08 16:58:44 +01:00
commit f16057522e

View file

@ -1,5 +1,4 @@
proto = """ proto = """#define GDVIRTUAL$VER($RET m_name $ARG)\\
#define GDVIRTUAL$VER($RET m_name $ARG) \\
StringName _gdvirtual_##m_name##_sn = #m_name;\\ StringName _gdvirtual_##m_name##_sn = #m_name;\\
mutable bool _gdvirtual_##m_name##_initialized = false;\\ mutable bool _gdvirtual_##m_name##_initialized = false;\\
mutable void *_gdvirtual_##m_name = nullptr;\\ mutable void *_gdvirtual_##m_name = nullptr;\\
@ -37,12 +36,10 @@ _FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST { \\
}\\ }\\
return true;\\ return true;\\
}\\ }\\
\\
if (required) {\\ if (required) {\\
ERR_PRINT_ONCE("Required virtual method " + get_class() + "::" + #m_name + " must be overridden before calling.");\\ ERR_PRINT_ONCE("Required virtual method " + get_class() + "::" + #m_name + " must be overridden before calling.");\\
$RVOID\\ $RVOID\\
}\\ }\\
\\
return false;\\ return false;\\
}\\ }\\
_FORCE_INLINE_ bool _gdvirtual_##m_name##_overridden() const {\\ _FORCE_INLINE_ bool _gdvirtual_##m_name##_overridden() const {\\
@ -65,11 +62,10 @@ _FORCE_INLINE_ bool _gdvirtual_##m_name##_overridden() const { \\
}\\ }\\
return false;\\ return false;\\
}\\ }\\
\\
_FORCE_INLINE_ static MethodInfo _gdvirtual_##m_name##_get_method_info() {\\ _FORCE_INLINE_ static MethodInfo _gdvirtual_##m_name##_get_method_info() {\\
MethodInfo method_info;\\ MethodInfo method_info;\\
method_info.name = #m_name;\\ method_info.name = #m_name;\\
method_info.flags = METHOD_FLAG_VIRTUAL;\\ method_info.flags = $METHOD_FLAGS;\\
$FILL_METHOD_INFO\\ $FILL_METHOD_INFO\\
return method_info;\\ return method_info;\\
} }
@ -86,19 +82,20 @@ def generate_version(argcount, const=False, returns=False):
s = s.replace("$RET", "m_ret,") s = s.replace("$RET", "m_ret,")
s = s.replace("$RVOID", "(void)r_ret;") # If required, may lead to uninitialized errors s = s.replace("$RVOID", "(void)r_ret;") # If required, may lead to uninitialized errors
s = s.replace("$CALLPTRRETDEF", "PtrToArg<m_ret>::EncodeT ret;") s = s.replace("$CALLPTRRETDEF", "PtrToArg<m_ret>::EncodeT ret;")
method_info += "\tmethod_info.return_val = GetTypeInfo<m_ret>::get_class_info();\\\n" method_info += "method_info.return_val = GetTypeInfo<m_ret>::get_class_info();\\\n"
method_info += "\tmethod_info.return_val_metadata = GetTypeInfo<m_ret>::METADATA;\\\n" method_info += "\t\tmethod_info.return_val_metadata = GetTypeInfo<m_ret>::METADATA;"
else: else:
s = s.replace("$RET ", "") s = s.replace("$RET ", "")
s = s.replace("$RVOID", "") s = s.replace("\t\t\t$RVOID\\\n", "")
s = s.replace("$CALLPTRRETDEF", "") s = s.replace("\t\t\t$CALLPTRRETDEF\\\n", "")
if const: if const:
sproto += "C" sproto += "C"
s = s.replace("$CONST", "const") s = s.replace("$CONST", "const")
method_info += "\tmethod_info.flags|=METHOD_FLAG_CONST;\\\n" s = s.replace("$METHOD_FLAGS", "METHOD_FLAG_VIRTUAL | METHOD_FLAG_CONST")
else: else:
s = s.replace("$CONST ", "") s = s.replace("$CONST ", "")
s = s.replace("$METHOD_FLAGS", "METHOD_FLAG_VIRTUAL")
s = s.replace("$VER", sproto) s = s.replace("$VER", sproto)
argtext = "" argtext = ""
@ -108,9 +105,9 @@ def generate_version(argcount, const=False, returns=False):
callptrargsptr = "" callptrargsptr = ""
if argcount > 0: if argcount > 0:
argtext += ", " argtext += ", "
callsiargs = "Variant vargs[" + str(argcount) + "]={" callsiargs = f"Variant vargs[{argcount}] = {{ "
callsiargptrs = "\t\tconst Variant *vargptrs[" + str(argcount) + "]={" callsiargptrs = f"\t\t\tconst Variant *vargptrs[{argcount}] = {{ "
callptrargsptr = "\t\tGDExtensionConstTypePtr argptrs[" + str(argcount) + "]={" callptrargsptr = f"\t\t\tGDExtensionConstTypePtr argptrs[{argcount}] = {{ "
callptrargs = "" callptrargs = ""
for i in range(argcount): for i in range(argcount):
if i > 0: if i > 0:
@ -118,33 +115,33 @@ def generate_version(argcount, const=False, returns=False):
callargtext += ", " callargtext += ", "
callsiargs += ", " callsiargs += ", "
callsiargptrs += ", " callsiargptrs += ", "
callptrargs += "\t\t" callptrargs += "\t\t\t"
callptrargsptr += ", " callptrargsptr += ", "
argtext += "m_type" + str(i + 1) argtext += f"m_type{i + 1}"
callargtext += "m_type" + str(i + 1) + " arg" + str(i + 1) callargtext += f"m_type{i + 1} arg{i + 1}"
callsiargs += "Variant(arg" + str(i + 1) + ")" callsiargs += f"Variant(arg{i + 1})"
callsiargptrs += "&vargs[" + str(i) + "]" callsiargptrs += f"&vargs[{i}]"
callptrargs += ( callptrargs += (
"PtrToArg<m_type" + str(i + 1) + ">::EncodeT argval" + str(i + 1) + " = arg" + str(i + 1) + ";\\\n" f"PtrToArg<m_type{i + 1}>::EncodeT argval{i + 1} = (PtrToArg<m_type{i + 1}>::EncodeT)arg{i + 1};\\\n"
)
callptrargsptr += "&argval" + str(i + 1)
method_info += "\tmethod_info.arguments.push_back(GetTypeInfo<m_type" + str(i + 1) + ">::get_class_info());\\\n"
method_info += (
"\tmethod_info.arguments_metadata.push_back(GetTypeInfo<m_type" + str(i + 1) + ">::METADATA);\\\n"
) )
callptrargsptr += f"&argval{i + 1}"
if method_info:
method_info += "\\\n\t\t"
method_info += f"method_info.arguments.push_back(GetTypeInfo<m_type{i + 1}>::get_class_info());\\\n"
method_info += f"\t\tmethod_info.arguments_metadata.push_back(GetTypeInfo<m_type{i + 1}>::METADATA);"
if argcount: if argcount:
callsiargs += " };\\\n" callsiargs += " };\\\n"
callsiargptrs += "};\\\n" callsiargptrs += " };"
s = s.replace("$CALLSIARGS", callsiargs + callsiargptrs) s = s.replace("$CALLSIARGS", callsiargs + callsiargptrs)
s = s.replace("$CALLSIARGPASS", "(const Variant **)vargptrs," + str(argcount)) s = s.replace("$CALLSIARGPASS", f"(const Variant **)vargptrs, {argcount}")
callptrargsptr += "};\\\n" callptrargsptr += " };"
s = s.replace("$CALLPTRARGS", callptrargs + callptrargsptr) s = s.replace("$CALLPTRARGS", callptrargs + callptrargsptr)
s = s.replace("$CALLPTRARGPASS", "reinterpret_cast<GDExtensionConstTypePtr *>(argptrs)") s = s.replace("$CALLPTRARGPASS", "reinterpret_cast<GDExtensionConstTypePtr *>(argptrs)")
else: else:
s = s.replace("$CALLSIARGS", "") s = s.replace("\t\t\t$CALLSIARGS\\\n", "")
s = s.replace("$CALLSIARGPASS", "nullptr, 0") s = s.replace("$CALLSIARGPASS", "nullptr, 0")
s = s.replace("$CALLPTRARGS", "") s = s.replace("\t\t\t$CALLPTRARGS\\\n", "")
s = s.replace("$CALLPTRARGPASS", "nullptr") s = s.replace("$CALLPTRARGPASS", "nullptr")
if returns: if returns:
@ -157,13 +154,16 @@ def generate_version(argcount, const=False, returns=False):
s = s.replace("$CALLPTRRET", "r_ret = (m_ret)ret;") s = s.replace("$CALLPTRRET", "r_ret = (m_ret)ret;")
else: else:
s = s.replace("$CALLSIBEGIN", "") s = s.replace("$CALLSIBEGIN", "")
s = s.replace("$CALLSIRET", "") s = s.replace("\t\t\t\t$CALLSIRET\\\n", "")
s = s.replace("$CALLPTRRETPASS", "nullptr") s = s.replace("$CALLPTRRETPASS", "nullptr")
s = s.replace("$CALLPTRRET", "") s = s.replace("\t\t\t\t$CALLPTRRET\\\n", "")
s = s.replace(" $ARG", argtext) s = s.replace(" $ARG", argtext)
s = s.replace("$CALLARGS", callargtext) s = s.replace("$CALLARGS", callargtext)
if method_info:
s = s.replace("$FILL_METHOD_INFO", method_info) s = s.replace("$FILL_METHOD_INFO", method_info)
else:
s = s.replace("\t\t$FILL_METHOD_INFO\\\n", method_info)
return s return s
@ -171,7 +171,7 @@ def generate_version(argcount, const=False, returns=False):
def run(target, source, env): def run(target, source, env):
max_versions = 12 max_versions = 12
txt = """ txt = """/* THIS FILE IS GENERATED DO NOT EDIT */
#ifndef GDVIRTUAL_GEN_H #ifndef GDVIRTUAL_GEN_H
#define GDVIRTUAL_GEN_H #define GDVIRTUAL_GEN_H
@ -193,13 +193,13 @@ def run(target, source, env):
""" """
for i in range(max_versions + 1): for i in range(max_versions + 1):
txt += "/* " + str(i) + " Arguments */\n\n" txt += f"/* {i} Arguments */\n\n"
txt += generate_version(i, False, False) txt += generate_version(i, False, False)
txt += generate_version(i, False, True) txt += generate_version(i, False, True)
txt += generate_version(i, True, False) txt += generate_version(i, True, False)
txt += generate_version(i, True, True) txt += generate_version(i, True, True)
txt += "#endif" txt += "#endif // GDVIRTUAL_GEN_H\n"
with open(target[0], "w") as f: with open(target[0], "w") as f:
f.write(txt) f.write(txt)