@@ -70,10 +70,9 @@ def generate_wrappers(target):
7070 f .write (txt )
7171
7272
73- def generate_virtual_version (argcount , const = False , returns = False ):
73+ def generate_virtual_version (argcount , const = False , returns = False , required = False ):
7474 s = """#define GDVIRTUAL$VER($RET m_name $ARG)\\
7575 ::godot::StringName _gdvirtual_##m_name##_sn = #m_name;\\
76- template <bool required>\\
7776 _FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST {\\
7877 if (::godot::internal::gdextension_interface_object_has_script_method(_owner, &_gdvirtual_##m_name##_sn)) { \\
7978 GDExtensionCallError ce;\\
@@ -85,10 +84,8 @@ def generate_virtual_version(argcount, const=False, returns=False):
8584 return true;\\
8685 }\\
8786 }\\
88- if (required) {\\
89- ERR_PRINT_ONCE("Required virtual method " + get_class() + "::" + #m_name + " must be overridden before calling.");\\
90- $RVOID\\
91- }\\
87+ $REQCHECK\\
88+ $RVOID\\
9289 return false;\\
9390 }\\
9491 _FORCE_INLINE_ bool _gdvirtual_##m_name##_overridden() const {\\
@@ -106,6 +103,7 @@ def generate_virtual_version(argcount, const=False, returns=False):
106103
107104 sproto = str (argcount )
108105 method_info = ""
106+ method_flags = "METHOD_FLAG_VIRTUAL"
109107 if returns :
110108 sproto += "R"
111109 s = s .replace ("$RET" , "m_ret," )
@@ -114,16 +112,26 @@ def generate_virtual_version(argcount, const=False, returns=False):
114112 method_info += "\t \t method_info.return_val_metadata = ::godot::GetTypeInfo<m_ret>::METADATA;"
115113 else :
116114 s = s .replace ("$RET " , "" )
117- s = s .replace ("\t \t \t $RVOID\\ \n " , "" )
115+ s = s .replace ("\t \t $RVOID\\ \n " , "" )
118116
119117 if const :
120118 sproto += "C"
119+ method_flags += " | METHOD_FLAG_CONST"
121120 s = s .replace ("$CONST" , "const" )
122- s = s .replace ("$METHOD_FLAGS" , "::godot::METHOD_FLAG_VIRTUAL | ::godot::METHOD_FLAG_CONST" )
123121 else :
124122 s = s .replace ("$CONST " , "" )
125- s = s .replace ("$METHOD_FLAGS" , "::godot::METHOD_FLAG_VIRTUAL" )
126123
124+ if required :
125+ sproto += "_REQUIRED"
126+ method_flags += " | METHOD_FLAG_VIRTUAL_REQUIRED"
127+ s = s .replace (
128+ "$REQCHECK" ,
129+ 'ERR_PRINT_ONCE("Required virtual method " + get_class() + "::" + #m_name + " must be overridden before calling.");' ,
130+ )
131+ else :
132+ s = s .replace ("\t \t $REQCHECK\\ \n " , "" )
133+
134+ s = s .replace ("$METHOD_FLAGS" , method_flags )
127135 s = s .replace ("$VER" , sproto )
128136 argtext = ""
129137 callargtext = ""
@@ -190,6 +198,10 @@ def generate_virtuals(target):
190198 txt += generate_virtual_version (i , False , True )
191199 txt += generate_virtual_version (i , True , False )
192200 txt += generate_virtual_version (i , True , True )
201+ txt += generate_virtual_version (i , False , False , True )
202+ txt += generate_virtual_version (i , False , True , True )
203+ txt += generate_virtual_version (i , True , False , True )
204+ txt += generate_virtual_version (i , True , True , True )
193205
194206 txt += "#endif // GDEXTENSION_GDVIRTUAL_GEN_H\n "
195207
0 commit comments