Skip to content

Commit 26358b5

Browse files
authored
Merge pull request godotengine#1719 from dsnopek/gdvirtual-required-macros
Update `GDVIRTUAL*()` macros to match Godot 4.4
2 parents e381658 + 4a9409a commit 26358b5

File tree

2 files changed

+23
-14
lines changed

2 files changed

+23
-14
lines changed

binding_generator.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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\tmethod_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

include/godot_cpp/classes/wrapped.hpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -505,11 +505,8 @@ public:
505505
// Don't use this for your classes, use GDCLASS() instead.
506506
#define GDEXTENSION_CLASS(m_class, m_inherits) GDEXTENSION_CLASS_ALIAS(m_class, m_class, m_inherits)
507507

508-
#define GDVIRTUAL_CALL(m_name, ...) _gdvirtual_##m_name##_call<false>(__VA_ARGS__)
509-
#define GDVIRTUAL_CALL_PTR(m_obj, m_name, ...) m_obj->_gdvirtual_##m_name##_call<false>(__VA_ARGS__)
510-
511-
#define GDVIRTUAL_REQUIRED_CALL(m_name, ...) _gdvirtual_##m_name##_call<true>(__VA_ARGS__)
512-
#define GDVIRTUAL_REQUIRED_CALL_PTR(m_obj, m_name, ...) m_obj->_gdvirtual_##m_name##_call<true>(__VA_ARGS__)
508+
#define GDVIRTUAL_CALL(m_name, ...) _gdvirtual_##m_name##_call(__VA_ARGS__)
509+
#define GDVIRTUAL_CALL_PTR(m_obj, m_name, ...) m_obj->_gdvirtual_##m_name##_call(__VA_ARGS__)
513510

514511
#define GDVIRTUAL_BIND(m_name, ...) ::godot::ClassDB::add_virtual_method(get_class_static(), _gdvirtual_##m_name##_get_method_info(), ::godot::snarray(__VA_ARGS__));
515512
#define GDVIRTUAL_IS_OVERRIDDEN(m_name) _gdvirtual_##m_name##_overridden()

0 commit comments

Comments
 (0)