You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +00:00
Optimize gdvirtual layout.
Co-authored-by: David Snopek <dsnopek@gmail.com>
This commit is contained in:
@@ -15,12 +15,12 @@ script_has_method = """ScriptInstance *_script_instance = ((Object *)(this))->ge
|
|||||||
}"""
|
}"""
|
||||||
|
|
||||||
proto = """#define GDVIRTUAL$VER($ALIAS $RET m_name $ARG)\\
|
proto = """#define GDVIRTUAL$VER($ALIAS $RET m_name $ARG)\\
|
||||||
StringName _gdvirtual_##$VARNAME##_sn = #m_name;\\
|
|
||||||
mutable bool _gdvirtual_##$VARNAME##_initialized = false;\\
|
|
||||||
mutable void *_gdvirtual_##$VARNAME = nullptr;\\
|
mutable void *_gdvirtual_##$VARNAME = nullptr;\\
|
||||||
_FORCE_INLINE_ bool _gdvirtual_##$VARNAME##_call($CALLARGS) $CONST {\\
|
_FORCE_INLINE_ bool _gdvirtual_##$VARNAME##_call($CALLARGS) $CONST {\\
|
||||||
|
static const StringName _gdvirtual_##$VARNAME##_sn = _scs_create(#m_name, true);\\
|
||||||
$SCRIPTCALL\\
|
$SCRIPTCALL\\
|
||||||
if (unlikely(_get_extension() && !_gdvirtual_##$VARNAME##_initialized)) {\\
|
if (_get_extension()) {\\
|
||||||
|
if (unlikely(!_gdvirtual_##$VARNAME)) {\\
|
||||||
MethodInfo mi = _gdvirtual_##$VARNAME##_get_method_info();\\
|
MethodInfo mi = _gdvirtual_##$VARNAME##_get_method_info();\\
|
||||||
uint32_t hash = mi.get_compatibility_hash();\\
|
uint32_t hash = mi.get_compatibility_hash();\\
|
||||||
_gdvirtual_##$VARNAME = nullptr;\\
|
_gdvirtual_##$VARNAME = nullptr;\\
|
||||||
@@ -30,10 +30,12 @@ proto = """#define GDVIRTUAL$VER($ALIAS $RET m_name $ARG)\\
|
|||||||
_gdvirtual_##$VARNAME = (void *)_get_extension()->get_virtual2(_get_extension()->class_userdata, &_gdvirtual_##$VARNAME##_sn, hash);\\
|
_gdvirtual_##$VARNAME = (void *)_get_extension()->get_virtual2(_get_extension()->class_userdata, &_gdvirtual_##$VARNAME##_sn, hash);\\
|
||||||
}\\
|
}\\
|
||||||
_GDVIRTUAL_GET_DEPRECATED(_gdvirtual_##$VARNAME, _gdvirtual_##$VARNAME##_sn, $COMPAT)\\
|
_GDVIRTUAL_GET_DEPRECATED(_gdvirtual_##$VARNAME, _gdvirtual_##$VARNAME##_sn, $COMPAT)\\
|
||||||
_GDVIRTUAL_TRACK(_gdvirtual_##$VARNAME, _gdvirtual_##$VARNAME##_initialized);\\
|
_GDVIRTUAL_TRACK(_gdvirtual_##$VARNAME);\\
|
||||||
_gdvirtual_##$VARNAME##_initialized = true;\\
|
if (_gdvirtual_##$VARNAME == nullptr) {\\
|
||||||
|
_gdvirtual_##$VARNAME = reinterpret_cast<void*>(_INVALID_GDVIRTUAL_FUNC_ADDR);\\
|
||||||
}\\
|
}\\
|
||||||
if (_gdvirtual_##$VARNAME) {\\
|
}\\
|
||||||
|
if (_gdvirtual_##$VARNAME != reinterpret_cast<void*>(_INVALID_GDVIRTUAL_FUNC_ADDR)) {\\
|
||||||
$CALLPTRARGS\\
|
$CALLPTRARGS\\
|
||||||
$CALLPTRRETDEF\\
|
$CALLPTRRETDEF\\
|
||||||
if (_get_extension()->call_virtual_with_data) {\\
|
if (_get_extension()->call_virtual_with_data) {\\
|
||||||
@@ -45,13 +47,16 @@ proto = """#define GDVIRTUAL$VER($ALIAS $RET m_name $ARG)\\
|
|||||||
}\\
|
}\\
|
||||||
return true;\\
|
return true;\\
|
||||||
}\\
|
}\\
|
||||||
|
}\\
|
||||||
$REQCHECK\\
|
$REQCHECK\\
|
||||||
$RVOID\\
|
$RVOID\\
|
||||||
return false;\\
|
return false;\\
|
||||||
}\\
|
}\\
|
||||||
_FORCE_INLINE_ bool _gdvirtual_##$VARNAME##_overridden() const {\\
|
_FORCE_INLINE_ bool _gdvirtual_##$VARNAME##_overridden() const {\\
|
||||||
|
static const StringName _gdvirtual_##$VARNAME##_sn = _scs_create(#m_name, true);\\
|
||||||
$SCRIPTHASMETHOD\\
|
$SCRIPTHASMETHOD\\
|
||||||
if (unlikely(_get_extension() && !_gdvirtual_##$VARNAME##_initialized)) {\\
|
if (_get_extension()) {\\
|
||||||
|
if (unlikely(!_gdvirtual_##$VARNAME)) {\\
|
||||||
MethodInfo mi = _gdvirtual_##$VARNAME##_get_method_info();\\
|
MethodInfo mi = _gdvirtual_##$VARNAME##_get_method_info();\\
|
||||||
uint32_t hash = mi.get_compatibility_hash();\\
|
uint32_t hash = mi.get_compatibility_hash();\\
|
||||||
_gdvirtual_##$VARNAME = nullptr;\\
|
_gdvirtual_##$VARNAME = nullptr;\\
|
||||||
@@ -61,12 +66,15 @@ proto = """#define GDVIRTUAL$VER($ALIAS $RET m_name $ARG)\\
|
|||||||
_gdvirtual_##$VARNAME = (void *)_get_extension()->get_virtual2(_get_extension()->class_userdata, &_gdvirtual_##$VARNAME##_sn, hash);\\
|
_gdvirtual_##$VARNAME = (void *)_get_extension()->get_virtual2(_get_extension()->class_userdata, &_gdvirtual_##$VARNAME##_sn, hash);\\
|
||||||
}\\
|
}\\
|
||||||
_GDVIRTUAL_GET_DEPRECATED(_gdvirtual_##$VARNAME, _gdvirtual_##$VARNAME##_sn, $COMPAT)\\
|
_GDVIRTUAL_GET_DEPRECATED(_gdvirtual_##$VARNAME, _gdvirtual_##$VARNAME##_sn, $COMPAT)\\
|
||||||
_GDVIRTUAL_TRACK(_gdvirtual_##$VARNAME, _gdvirtual_##$VARNAME##_initialized);\\
|
_GDVIRTUAL_TRACK(_gdvirtual_##$VARNAME);\\
|
||||||
_gdvirtual_##$VARNAME##_initialized = true;\\
|
if (_gdvirtual_##$VARNAME == nullptr) {\\
|
||||||
|
_gdvirtual_##$VARNAME = reinterpret_cast<void*>(_INVALID_GDVIRTUAL_FUNC_ADDR);\\
|
||||||
}\\
|
}\\
|
||||||
if (_gdvirtual_##$VARNAME) {\\
|
}\\
|
||||||
|
if (_gdvirtual_##$VARNAME != reinterpret_cast<void*>(_INVALID_GDVIRTUAL_FUNC_ADDR)) {\\
|
||||||
return true;\\
|
return true;\\
|
||||||
}\\
|
}\\
|
||||||
|
}\\
|
||||||
return false;\\
|
return false;\\
|
||||||
}\\
|
}\\
|
||||||
_FORCE_INLINE_ static MethodInfo _gdvirtual_##$VARNAME##_get_method_info() {\\
|
_FORCE_INLINE_ static MethodInfo _gdvirtual_##$VARNAME##_get_method_info() {\\
|
||||||
@@ -211,17 +219,18 @@ def run(target, source, env):
|
|||||||
|
|
||||||
#include "core/object/script_instance.h"
|
#include "core/object/script_instance.h"
|
||||||
|
|
||||||
|
inline constexpr uintptr_t _INVALID_GDVIRTUAL_FUNC_ADDR = static_cast<uintptr_t>(-1);
|
||||||
|
|
||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
#define _GDVIRTUAL_TRACK(m_virtual, m_initialized)\\
|
#define _GDVIRTUAL_TRACK(m_virtual)\\
|
||||||
if (_get_extension()->reloadable) {\\
|
if (_get_extension()->reloadable) {\\
|
||||||
VirtualMethodTracker *tracker = memnew(VirtualMethodTracker);\\
|
VirtualMethodTracker *tracker = memnew(VirtualMethodTracker);\\
|
||||||
tracker->method = (void **)&m_virtual;\\
|
tracker->method = (void **)&m_virtual;\\
|
||||||
tracker->initialized = &m_initialized;\\
|
|
||||||
tracker->next = virtual_method_list;\\
|
tracker->next = virtual_method_list;\\
|
||||||
virtual_method_list = tracker;\\
|
virtual_method_list = tracker;\\
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define _GDVIRTUAL_TRACK(m_virtual, m_initialized)
|
#define _GDVIRTUAL_TRACK(m_virtual)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DISABLE_DEPRECATED
|
#ifndef DISABLE_DEPRECATED
|
||||||
|
|||||||
@@ -2108,7 +2108,6 @@ void Object::clear_internal_extension() {
|
|||||||
// Clear the virtual methods.
|
// Clear the virtual methods.
|
||||||
while (virtual_method_list) {
|
while (virtual_method_list) {
|
||||||
(*virtual_method_list->method) = nullptr;
|
(*virtual_method_list->method) = nullptr;
|
||||||
(*virtual_method_list->initialized) = false;
|
|
||||||
virtual_method_list = virtual_method_list->next;
|
virtual_method_list = virtual_method_list->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -764,7 +764,6 @@ protected:
|
|||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
struct VirtualMethodTracker {
|
struct VirtualMethodTracker {
|
||||||
void **method;
|
void **method;
|
||||||
bool *initialized;
|
|
||||||
VirtualMethodTracker *next;
|
VirtualMethodTracker *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user