Skip to content

Commit 36991ab

Browse files
committed
Merge pull request #104264 from YYF233333/layout/gdvirtual
Optimize gdvirtual function layout
2 parents 86ff668 + 057858a commit 36991ab

File tree

3 files changed

+50
-43
lines changed

3 files changed

+50
-43
lines changed

core/object/make_virtuals.py

Lines changed: 50 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -15,57 +15,65 @@
1515
}"""
1616

1717
proto = """#define GDVIRTUAL$VER($ALIAS $RET m_name $ARG)\\
18-
StringName _gdvirtual_##$VARNAME##_sn = #m_name;\\
19-
mutable bool _gdvirtual_##$VARNAME##_initialized = false;\\
2018
mutable void *_gdvirtual_##$VARNAME = nullptr;\\
2119
_FORCE_INLINE_ bool _gdvirtual_##$VARNAME##_call($CALLARGS) $CONST {\\
20+
static const StringName _gdvirtual_##$VARNAME##_sn = _scs_create(#m_name, true);\\
2221
$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+
}\\
3137
}\\
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;\\
4549
}\\
46-
return true;\\
4750
}\\
4851
$REQCHECK\\
4952
$RVOID\\
5053
return false;\\
5154
}\\
5255
_FORCE_INLINE_ bool _gdvirtual_##$VARNAME##_overridden() const {\\
56+
static const StringName _gdvirtual_##$VARNAME##_sn = _scs_create(#m_name, true);\\
5357
$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;\\
6276
}\\
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;\\
6977
}\\
7078
return false;\\
7179
}\\
@@ -211,17 +219,18 @@ def run(target, source, env):
211219
212220
#include "core/object/script_instance.h"
213221
222+
inline constexpr uintptr_t _INVALID_GDVIRTUAL_FUNC_ADDR = static_cast<uintptr_t>(-1);
223+
214224
#ifdef TOOLS_ENABLED
215-
#define _GDVIRTUAL_TRACK(m_virtual, m_initialized)\\
225+
#define _GDVIRTUAL_TRACK(m_virtual)\\
216226
if (_get_extension()->reloadable) {\\
217227
VirtualMethodTracker *tracker = memnew(VirtualMethodTracker);\\
218228
tracker->method = (void **)&m_virtual;\\
219-
tracker->initialized = &m_initialized;\\
220229
tracker->next = virtual_method_list;\\
221230
virtual_method_list = tracker;\\
222231
}
223232
#else
224-
#define _GDVIRTUAL_TRACK(m_virtual, m_initialized)
233+
#define _GDVIRTUAL_TRACK(m_virtual)
225234
#endif
226235
227236
#ifndef DISABLE_DEPRECATED

core/object/object.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2130,7 +2130,6 @@ void Object::clear_internal_extension() {
21302130
// Clear the virtual methods.
21312131
while (virtual_method_list) {
21322132
(*virtual_method_list->method) = nullptr;
2133-
(*virtual_method_list->initialized) = false;
21342133
virtual_method_list = virtual_method_list->next;
21352134
}
21362135
}

core/object/object.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,6 @@ class Object {
763763
#ifdef TOOLS_ENABLED
764764
struct VirtualMethodTracker {
765765
void **method;
766-
bool *initialized;
767766
VirtualMethodTracker *next;
768767
};
769768

0 commit comments

Comments
 (0)