From 4a9409a30f8669137d2b3d285d91ad2491da1172 Mon Sep 17 00:00:00 2001 From: David Snopek Date: Tue, 25 Feb 2025 16:53:34 -0600 Subject: [PATCH] Update `GDVIRTUAL*()` macros to match Godot 4.4 --- binding_generator.py | 30 +++++++++++++++++++-------- include/godot_cpp/classes/wrapped.hpp | 7 ++----- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/binding_generator.py b/binding_generator.py index 7cab58b7..103214e2 100644 --- a/binding_generator.py +++ b/binding_generator.py @@ -70,10 +70,9 @@ def generate_wrappers(target): f.write(txt) -def generate_virtual_version(argcount, const=False, returns=False): +def generate_virtual_version(argcount, const=False, returns=False, required=False): s = """#define GDVIRTUAL$VER($RET m_name $ARG)\\ ::godot::StringName _gdvirtual_##m_name##_sn = #m_name;\\ - template \\ _FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST {\\ if (::godot::internal::gdextension_interface_object_has_script_method(_owner, &_gdvirtual_##m_name##_sn)) { \\ GDExtensionCallError ce;\\ @@ -85,10 +84,8 @@ def generate_virtual_version(argcount, const=False, returns=False): return true;\\ }\\ }\\ - if (required) {\\ - ERR_PRINT_ONCE("Required virtual method " + get_class() + "::" + #m_name + " must be overridden before calling.");\\ - $RVOID\\ - }\\ + $REQCHECK\\ + $RVOID\\ return false;\\ }\\ _FORCE_INLINE_ bool _gdvirtual_##m_name##_overridden() const {\\ @@ -106,6 +103,7 @@ def generate_virtual_version(argcount, const=False, returns=False): sproto = str(argcount) method_info = "" + method_flags = "METHOD_FLAG_VIRTUAL" if returns: sproto += "R" s = s.replace("$RET", "m_ret,") @@ -114,16 +112,26 @@ def generate_virtual_version(argcount, const=False, returns=False): method_info += "\t\tmethod_info.return_val_metadata = ::godot::GetTypeInfo::METADATA;" else: s = s.replace("$RET ", "") - s = s.replace("\t\t\t$RVOID\\\n", "") + s = s.replace("\t\t$RVOID\\\n", "") if const: sproto += "C" + method_flags += " | METHOD_FLAG_CONST" s = s.replace("$CONST", "const") - s = s.replace("$METHOD_FLAGS", "::godot::METHOD_FLAG_VIRTUAL | ::godot::METHOD_FLAG_CONST") else: s = s.replace("$CONST ", "") - s = s.replace("$METHOD_FLAGS", "::godot::METHOD_FLAG_VIRTUAL") + if required: + sproto += "_REQUIRED" + method_flags += " | METHOD_FLAG_VIRTUAL_REQUIRED" + s = s.replace( + "$REQCHECK", + 'ERR_PRINT_ONCE("Required virtual method " + get_class() + "::" + #m_name + " must be overridden before calling.");', + ) + else: + s = s.replace("\t\t$REQCHECK\\\n", "") + + s = s.replace("$METHOD_FLAGS", method_flags) s = s.replace("$VER", sproto) argtext = "" callargtext = "" @@ -190,6 +198,10 @@ def generate_virtuals(target): txt += generate_virtual_version(i, False, True) txt += generate_virtual_version(i, True, False) txt += generate_virtual_version(i, True, True) + txt += generate_virtual_version(i, False, False, True) + txt += generate_virtual_version(i, False, True, True) + txt += generate_virtual_version(i, True, False, True) + txt += generate_virtual_version(i, True, True, True) txt += "#endif // GDEXTENSION_GDVIRTUAL_GEN_H\n" diff --git a/include/godot_cpp/classes/wrapped.hpp b/include/godot_cpp/classes/wrapped.hpp index 0c02d152..7a07dcb1 100644 --- a/include/godot_cpp/classes/wrapped.hpp +++ b/include/godot_cpp/classes/wrapped.hpp @@ -505,11 +505,8 @@ private: // Don't use this for your classes, use GDCLASS() instead. #define GDEXTENSION_CLASS(m_class, m_inherits) GDEXTENSION_CLASS_ALIAS(m_class, m_class, m_inherits) -#define GDVIRTUAL_CALL(m_name, ...) _gdvirtual_##m_name##_call(__VA_ARGS__) -#define GDVIRTUAL_CALL_PTR(m_obj, m_name, ...) m_obj->_gdvirtual_##m_name##_call(__VA_ARGS__) - -#define GDVIRTUAL_REQUIRED_CALL(m_name, ...) _gdvirtual_##m_name##_call(__VA_ARGS__) -#define GDVIRTUAL_REQUIRED_CALL_PTR(m_obj, m_name, ...) m_obj->_gdvirtual_##m_name##_call(__VA_ARGS__) +#define GDVIRTUAL_CALL(m_name, ...) _gdvirtual_##m_name##_call(__VA_ARGS__) +#define GDVIRTUAL_CALL_PTR(m_obj, m_name, ...) m_obj->_gdvirtual_##m_name##_call(__VA_ARGS__) #define GDVIRTUAL_BIND(m_name, ...) ::godot::ClassDB::add_virtual_method(get_class_static(), _gdvirtual_##m_name##_get_method_info(), ::godot::snarray(__VA_ARGS__)); #define GDVIRTUAL_IS_OVERRIDDEN(m_name) _gdvirtual_##m_name##_overridden()