Skip to content

Commit c2af6bc

Browse files
dsnopekTitanNano
andcommitted
GDExtension: Mark virtual function as is_required in extension_api.json
Co-authored-by: Jovan Gerodetti <[email protected]>
1 parent 2c136e6 commit c2af6bc

36 files changed

+473
-462
lines changed

core/extension/extension_api_dump.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,6 +1017,7 @@ Dictionary GDExtensionAPIDump::generate_extension_api(bool p_include_docs) {
10171017
d2["name"] = String(method_name);
10181018
d2["is_const"] = (F.flags & METHOD_FLAG_CONST) ? true : false;
10191019
d2["is_static"] = (F.flags & METHOD_FLAG_STATIC) ? true : false;
1020+
d2["is_required"] = (F.flags & METHOD_FLAG_VIRTUAL_REQUIRED) ? true : false;
10201021
d2["is_vararg"] = false;
10211022
d2["is_virtual"] = true;
10221023
// virtual functions have no hash since no MethodBind is involved

core/extension/make_wrappers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ def generate_mod_version(argcount, const=False, returns=False):
5555

5656
proto_ex = """
5757
#define EXBIND$VER($RETTYPE m_name$ARG) \\
58-
GDVIRTUAL$VER($RETTYPE_##m_name$ARG)\\
58+
GDVIRTUAL$VER_REQUIRED($RETTYPE_##m_name$ARG)\\
5959
virtual $RETVAL m_name($FUNCARGS) $CONST override { \\
6060
$RETPRE\\
61-
GDVIRTUAL_REQUIRED_CALL(_##m_name$CALLARGS$RETREF);\\
61+
GDVIRTUAL_CALL(_##m_name$CALLARGS$RETREF);\\
6262
$RETPOST\\
6363
}
6464
"""

core/object/make_virtuals.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
StringName _gdvirtual_##m_name##_sn = #m_name;\\
33
mutable bool _gdvirtual_##m_name##_initialized = false;\\
44
mutable void *_gdvirtual_##m_name = nullptr;\\
5-
template <bool required>\\
65
_FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST {\\
76
ScriptInstance *_script_instance = ((Object *)(this))->get_script_instance();\\
87
if (_script_instance) {\\
@@ -36,10 +35,8 @@
3635
}\\
3736
return true;\\
3837
}\\
39-
if (required) {\\
40-
ERR_PRINT_ONCE("Required virtual method " + get_class() + "::" + #m_name + " must be overridden before calling.");\\
41-
$RVOID\\
42-
}\\
38+
$REQCHECK\\
39+
$RVOID\\
4340
return false;\\
4441
}\\
4542
_FORCE_INLINE_ bool _gdvirtual_##m_name##_overridden() const {\\
@@ -73,10 +70,11 @@
7370
"""
7471

7572

76-
def generate_version(argcount, const=False, returns=False):
73+
def generate_version(argcount, const=False, returns=False, required=False):
7774
s = proto
7875
sproto = str(argcount)
7976
method_info = ""
77+
method_flags = "METHOD_FLAG_VIRTUAL"
8078
if returns:
8179
sproto += "R"
8280
s = s.replace("$RET", "m_ret,")
@@ -86,17 +84,27 @@ def generate_version(argcount, const=False, returns=False):
8684
method_info += "\t\tmethod_info.return_val_metadata = GetTypeInfo<m_ret>::METADATA;"
8785
else:
8886
s = s.replace("$RET ", "")
89-
s = s.replace("\t\t\t$RVOID\\\n", "")
87+
s = s.replace("\t\t$RVOID\\\n", "")
9088
s = s.replace("\t\t\t$CALLPTRRETDEF\\\n", "")
9189

9290
if const:
9391
sproto += "C"
92+
method_flags += " | METHOD_FLAG_CONST"
9493
s = s.replace("$CONST", "const")
95-
s = s.replace("$METHOD_FLAGS", "METHOD_FLAG_VIRTUAL | METHOD_FLAG_CONST")
9694
else:
9795
s = s.replace("$CONST ", "")
98-
s = s.replace("$METHOD_FLAGS", "METHOD_FLAG_VIRTUAL")
9996

97+
if required:
98+
sproto += "_REQUIRED"
99+
method_flags += " | METHOD_FLAG_VIRTUAL_REQUIRED"
100+
s = s.replace(
101+
"$REQCHECK",
102+
'ERR_PRINT_ONCE("Required virtual method " + get_class() + "::" + #m_name + " must be overridden before calling.");',
103+
)
104+
else:
105+
s = s.replace("\t\t$REQCHECK\\\n", "")
106+
107+
s = s.replace("$METHOD_FLAGS", method_flags)
100108
s = s.replace("$VER", sproto)
101109
argtext = ""
102110
callargtext = ""
@@ -198,6 +206,10 @@ def run(target, source, env):
198206
txt += generate_version(i, False, True)
199207
txt += generate_version(i, True, False)
200208
txt += generate_version(i, True, True)
209+
txt += generate_version(i, False, False, True)
210+
txt += generate_version(i, False, True, True)
211+
txt += generate_version(i, True, False, True)
212+
txt += generate_version(i, True, True, True)
201213

202214
txt += "#endif // GDVIRTUAL_GEN_H\n"
203215

core/object/object.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ enum MethodFlags {
215215
METHOD_FLAG_VARARG = 16,
216216
METHOD_FLAG_STATIC = 32,
217217
METHOD_FLAG_OBJECT_CORE = 64,
218+
METHOD_FLAG_VIRTUAL_REQUIRED = 128,
218219
METHOD_FLAGS_DEFAULT = METHOD_FLAG_NORMAL,
219220
};
220221

@@ -368,11 +369,8 @@ struct ObjectGDExtension {
368369
#endif
369370
};
370371

371-
#define GDVIRTUAL_CALL(m_name, ...) _gdvirtual_##m_name##_call<false>(__VA_ARGS__)
372-
#define GDVIRTUAL_CALL_PTR(m_obj, m_name, ...) m_obj->_gdvirtual_##m_name##_call<false>(__VA_ARGS__)
373-
374-
#define GDVIRTUAL_REQUIRED_CALL(m_name, ...) _gdvirtual_##m_name##_call<true>(__VA_ARGS__)
375-
#define GDVIRTUAL_REQUIRED_CALL_PTR(m_obj, m_name, ...) m_obj->_gdvirtual_##m_name##_call<true>(__VA_ARGS__)
372+
#define GDVIRTUAL_CALL(m_name, ...) _gdvirtual_##m_name##_call(__VA_ARGS__)
373+
#define GDVIRTUAL_CALL_PTR(m_obj, m_name, ...) m_obj->_gdvirtual_##m_name##_call(__VA_ARGS__)
376374

377375
#ifdef DEBUG_METHODS_ENABLED
378376
#define GDVIRTUAL_BIND(m_name, ...) ::ClassDB::add_virtual_method(get_class_static(), _gdvirtual_##m_name##_get_method_info(), true, sarray(__VA_ARGS__));

0 commit comments

Comments
 (0)