|
15 | 15 | }""" |
16 | 16 |
|
17 | 17 | proto = """#define GDVIRTUAL$VER($ALIAS $RET m_name $ARG)\\ |
18 | | - StringName _gdvirtual_##$VARNAME##_sn = #m_name;\\ |
19 | | - mutable bool _gdvirtual_##$VARNAME##_initialized = false;\\ |
20 | 18 | mutable void *_gdvirtual_##$VARNAME = nullptr;\\ |
21 | 19 | _FORCE_INLINE_ bool _gdvirtual_##$VARNAME##_call($CALLARGS) $CONST {\\ |
| 20 | + static const StringName _gdvirtual_##$VARNAME##_sn = _scs_create(#m_name, true);\\ |
22 | 21 | $SCRIPTCALL\\ |
23 | | - if (unlikely(_get_extension() && !_gdvirtual_##$VARNAME##_initialized)) {\\ |
24 | | - MethodInfo mi = _gdvirtual_##$VARNAME##_get_method_info();\\ |
25 | | - uint32_t hash = mi.get_compatibility_hash();\\ |
26 | | - _gdvirtual_##$VARNAME = nullptr;\\ |
27 | | - if (_get_extension()->get_virtual_call_data2 && _get_extension()->call_virtual_with_data) {\\ |
28 | | - _gdvirtual_##$VARNAME = _get_extension()->get_virtual_call_data2(_get_extension()->class_userdata, &_gdvirtual_##$VARNAME##_sn, hash);\\ |
29 | | - } else if (_get_extension()->get_virtual2) {\\ |
30 | | - _gdvirtual_##$VARNAME = (void *)_get_extension()->get_virtual2(_get_extension()->class_userdata, &_gdvirtual_##$VARNAME##_sn, hash);\\ |
| 22 | + if (_get_extension()) {\\ |
| 23 | + if (unlikely(!_gdvirtual_##$VARNAME)) {\\ |
| 24 | + MethodInfo mi = _gdvirtual_##$VARNAME##_get_method_info();\\ |
| 25 | + uint32_t hash = mi.get_compatibility_hash();\\ |
| 26 | + _gdvirtual_##$VARNAME = nullptr;\\ |
| 27 | + if (_get_extension()->get_virtual_call_data2 && _get_extension()->call_virtual_with_data) {\\ |
| 28 | + _gdvirtual_##$VARNAME = _get_extension()->get_virtual_call_data2(_get_extension()->class_userdata, &_gdvirtual_##$VARNAME##_sn, hash);\\ |
| 29 | + } else if (_get_extension()->get_virtual2) {\\ |
| 30 | + _gdvirtual_##$VARNAME = (void *)_get_extension()->get_virtual2(_get_extension()->class_userdata, &_gdvirtual_##$VARNAME##_sn, hash);\\ |
| 31 | + }\\ |
| 32 | + _GDVIRTUAL_GET_DEPRECATED(_gdvirtual_##$VARNAME, _gdvirtual_##$VARNAME##_sn, $COMPAT)\\ |
| 33 | + _GDVIRTUAL_TRACK(_gdvirtual_##$VARNAME);\\ |
| 34 | + if (_gdvirtual_##$VARNAME == nullptr) {\\ |
| 35 | + _gdvirtual_##$VARNAME = reinterpret_cast<void*>(_INVALID_GDVIRTUAL_FUNC_ADDR);\\ |
| 36 | + }\\ |
31 | 37 | }\\ |
32 | | - _GDVIRTUAL_GET_DEPRECATED(_gdvirtual_##$VARNAME, _gdvirtual_##$VARNAME##_sn, $COMPAT)\\ |
33 | | - _GDVIRTUAL_TRACK(_gdvirtual_##$VARNAME, _gdvirtual_##$VARNAME##_initialized);\\ |
34 | | - _gdvirtual_##$VARNAME##_initialized = true;\\ |
35 | | - }\\ |
36 | | - if (_gdvirtual_##$VARNAME) {\\ |
37 | | - $CALLPTRARGS\\ |
38 | | - $CALLPTRRETDEF\\ |
39 | | - if (_get_extension()->call_virtual_with_data) {\\ |
40 | | - _get_extension()->call_virtual_with_data(_get_extension_instance(), &_gdvirtual_##$VARNAME##_sn, _gdvirtual_##$VARNAME, $CALLPTRARGPASS, $CALLPTRRETPASS);\\ |
41 | | - $CALLPTRRET\\ |
42 | | - } else {\\ |
43 | | - ((GDExtensionClassCallVirtual)_gdvirtual_##$VARNAME)(_get_extension_instance(), $CALLPTRARGPASS, $CALLPTRRETPASS);\\ |
44 | | - $CALLPTRRET\\ |
| 38 | + if (_gdvirtual_##$VARNAME != reinterpret_cast<void*>(_INVALID_GDVIRTUAL_FUNC_ADDR)) {\\ |
| 39 | + $CALLPTRARGS\\ |
| 40 | + $CALLPTRRETDEF\\ |
| 41 | + if (_get_extension()->call_virtual_with_data) {\\ |
| 42 | + _get_extension()->call_virtual_with_data(_get_extension_instance(), &_gdvirtual_##$VARNAME##_sn, _gdvirtual_##$VARNAME, $CALLPTRARGPASS, $CALLPTRRETPASS);\\ |
| 43 | + $CALLPTRRET\\ |
| 44 | + } else {\\ |
| 45 | + ((GDExtensionClassCallVirtual)_gdvirtual_##$VARNAME)(_get_extension_instance(), $CALLPTRARGPASS, $CALLPTRRETPASS);\\ |
| 46 | + $CALLPTRRET\\ |
| 47 | + }\\ |
| 48 | + return true;\\ |
45 | 49 | }\\ |
46 | | - return true;\\ |
47 | 50 | }\\ |
48 | 51 | $REQCHECK\\ |
49 | 52 | $RVOID\\ |
50 | 53 | return false;\\ |
51 | 54 | }\\ |
52 | 55 | _FORCE_INLINE_ bool _gdvirtual_##$VARNAME##_overridden() const {\\ |
| 56 | + static const StringName _gdvirtual_##$VARNAME##_sn = _scs_create(#m_name, true);\\ |
53 | 57 | $SCRIPTHASMETHOD\\ |
54 | | - if (unlikely(_get_extension() && !_gdvirtual_##$VARNAME##_initialized)) {\\ |
55 | | - MethodInfo mi = _gdvirtual_##$VARNAME##_get_method_info();\\ |
56 | | - uint32_t hash = mi.get_compatibility_hash();\\ |
57 | | - _gdvirtual_##$VARNAME = nullptr;\\ |
58 | | - if (_get_extension()->get_virtual_call_data2 && _get_extension()->call_virtual_with_data) {\\ |
59 | | - _gdvirtual_##$VARNAME = _get_extension()->get_virtual_call_data2(_get_extension()->class_userdata, &_gdvirtual_##$VARNAME##_sn, hash);\\ |
60 | | - } else if (_get_extension()->get_virtual2) {\\ |
61 | | - _gdvirtual_##$VARNAME = (void *)_get_extension()->get_virtual2(_get_extension()->class_userdata, &_gdvirtual_##$VARNAME##_sn, hash);\\ |
| 58 | + if (_get_extension()) {\\ |
| 59 | + if (unlikely(!_gdvirtual_##$VARNAME)) {\\ |
| 60 | + MethodInfo mi = _gdvirtual_##$VARNAME##_get_method_info();\\ |
| 61 | + uint32_t hash = mi.get_compatibility_hash();\\ |
| 62 | + _gdvirtual_##$VARNAME = nullptr;\\ |
| 63 | + if (_get_extension()->get_virtual_call_data2 && _get_extension()->call_virtual_with_data) {\\ |
| 64 | + _gdvirtual_##$VARNAME = _get_extension()->get_virtual_call_data2(_get_extension()->class_userdata, &_gdvirtual_##$VARNAME##_sn, hash);\\ |
| 65 | + } else if (_get_extension()->get_virtual2) {\\ |
| 66 | + _gdvirtual_##$VARNAME = (void *)_get_extension()->get_virtual2(_get_extension()->class_userdata, &_gdvirtual_##$VARNAME##_sn, hash);\\ |
| 67 | + }\\ |
| 68 | + _GDVIRTUAL_GET_DEPRECATED(_gdvirtual_##$VARNAME, _gdvirtual_##$VARNAME##_sn, $COMPAT)\\ |
| 69 | + _GDVIRTUAL_TRACK(_gdvirtual_##$VARNAME);\\ |
| 70 | + if (_gdvirtual_##$VARNAME == nullptr) {\\ |
| 71 | + _gdvirtual_##$VARNAME = reinterpret_cast<void*>(_INVALID_GDVIRTUAL_FUNC_ADDR);\\ |
| 72 | + }\\ |
| 73 | + }\\ |
| 74 | + if (_gdvirtual_##$VARNAME != reinterpret_cast<void*>(_INVALID_GDVIRTUAL_FUNC_ADDR)) {\\ |
| 75 | + return true;\\ |
62 | 76 | }\\ |
63 | | - _GDVIRTUAL_GET_DEPRECATED(_gdvirtual_##$VARNAME, _gdvirtual_##$VARNAME##_sn, $COMPAT)\\ |
64 | | - _GDVIRTUAL_TRACK(_gdvirtual_##$VARNAME, _gdvirtual_##$VARNAME##_initialized);\\ |
65 | | - _gdvirtual_##$VARNAME##_initialized = true;\\ |
66 | | - }\\ |
67 | | - if (_gdvirtual_##$VARNAME) {\\ |
68 | | - return true;\\ |
69 | 77 | }\\ |
70 | 78 | return false;\\ |
71 | 79 | }\\ |
@@ -211,17 +219,18 @@ def run(target, source, env): |
211 | 219 |
|
212 | 220 | #include "core/object/script_instance.h" |
213 | 221 |
|
| 222 | +inline constexpr uintptr_t _INVALID_GDVIRTUAL_FUNC_ADDR = static_cast<uintptr_t>(-1); |
| 223 | +
|
214 | 224 | #ifdef TOOLS_ENABLED |
215 | | -#define _GDVIRTUAL_TRACK(m_virtual, m_initialized)\\ |
| 225 | +#define _GDVIRTUAL_TRACK(m_virtual)\\ |
216 | 226 | if (_get_extension()->reloadable) {\\ |
217 | 227 | VirtualMethodTracker *tracker = memnew(VirtualMethodTracker);\\ |
218 | 228 | tracker->method = (void **)&m_virtual;\\ |
219 | | - tracker->initialized = &m_initialized;\\ |
220 | 229 | tracker->next = virtual_method_list;\\ |
221 | 230 | virtual_method_list = tracker;\\ |
222 | 231 | } |
223 | 232 | #else |
224 | | -#define _GDVIRTUAL_TRACK(m_virtual, m_initialized) |
| 233 | +#define _GDVIRTUAL_TRACK(m_virtual) |
225 | 234 | #endif |
226 | 235 |
|
227 | 236 | #ifndef DISABLE_DEPRECATED |
|
0 commit comments