mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-11-17 17:41:18 +01:00
kern: Nintendo now also devirtualizes KAutoObject::DynamicCast
This commit is contained in:
parent
e36051359c
commit
418fde40a8
@ -47,13 +47,6 @@
|
|||||||
/* re-enabled by toggling this define. */
|
/* re-enabled by toggling this define. */
|
||||||
//#define MESOSPHERE_ENABLE_PROCESS_CREATION_TIME
|
//#define MESOSPHERE_ENABLE_PROCESS_CREATION_TIME
|
||||||
|
|
||||||
/* NOTE: This enables fast class token storage using a class member. */
|
|
||||||
/* This saves a virtual call when doing KAutoObject->DynCast<>(), */
|
|
||||||
/* at the cost of storing class tokens inside the class object. */
|
|
||||||
/* However, as of (10/16/2021) KAutoObject has an unused class member */
|
|
||||||
/* of the right side, and so this does not actually cost any space. */
|
|
||||||
#define MESOSPHERE_ENABLE_DEVIRTUALIZED_DYNAMIC_CAST
|
|
||||||
|
|
||||||
/* NOTE: This enables usage of KDebug handles as parameter for svc::GetInfo */
|
/* NOTE: This enables usage of KDebug handles as parameter for svc::GetInfo */
|
||||||
/* calls which require a process parameter. This enables a debugger to obtain */
|
/* calls which require a process parameter. This enables a debugger to obtain */
|
||||||
/* address space/layout information, for example. However, it changes abi, and so */
|
/* address space/layout information, for example. However, it changes abi, and so */
|
||||||
|
|||||||
@ -121,14 +121,9 @@ namespace ams::kern {
|
|||||||
private:
|
private:
|
||||||
KAutoObject *m_next_closed_object;
|
KAutoObject *m_next_closed_object;
|
||||||
ReferenceCount m_ref_count;
|
ReferenceCount m_ref_count;
|
||||||
#if defined(MESOSPHERE_ENABLE_DEVIRTUALIZED_DYNAMIC_CAST)
|
|
||||||
ClassTokenType m_class_token;
|
ClassTokenType m_class_token;
|
||||||
#endif
|
|
||||||
public:
|
public:
|
||||||
constexpr ALWAYS_INLINE explicit KAutoObject(util::ConstantInitializeTag) : m_next_closed_object(nullptr), m_ref_count(0)
|
constexpr ALWAYS_INLINE explicit KAutoObject(util::ConstantInitializeTag) : m_next_closed_object(nullptr), m_ref_count(0), m_class_token(0)
|
||||||
#if defined(MESOSPHERE_ENABLE_DEVIRTUALIZED_DYNAMIC_CAST)
|
|
||||||
, m_class_token(0)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
MESOSPHERE_ASSERT_THIS();
|
MESOSPHERE_ASSERT_THIS();
|
||||||
}
|
}
|
||||||
@ -151,19 +146,11 @@ namespace ams::kern {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ALWAYS_INLINE bool IsDerivedFrom(const TypeObj &rhs) const {
|
ALWAYS_INLINE bool IsDerivedFrom(const TypeObj &rhs) const {
|
||||||
#if defined(MESOSPHERE_ENABLE_DEVIRTUALIZED_DYNAMIC_CAST)
|
|
||||||
return TypeObj::IsClassTokenDerivedFrom(m_class_token, rhs.GetClassToken());
|
return TypeObj::IsClassTokenDerivedFrom(m_class_token, rhs.GetClassToken());
|
||||||
#else
|
|
||||||
return this->GetTypeObj().IsDerivedFrom(rhs);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ALWAYS_INLINE bool IsDerivedFrom(const KAutoObject &rhs) const {
|
ALWAYS_INLINE bool IsDerivedFrom(const KAutoObject &rhs) const {
|
||||||
#if defined(MESOSPHERE_ENABLE_DEVIRTUALIZED_DYNAMIC_CAST)
|
|
||||||
return TypeObj::IsClassTokenDerivedFrom(m_class_token, rhs.m_class_token);
|
return TypeObj::IsClassTokenDerivedFrom(m_class_token, rhs.m_class_token);
|
||||||
#else
|
|
||||||
return this->IsDerivedFrom(rhs.GetTypeObj());
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
@ -218,12 +205,10 @@ namespace ams::kern {
|
|||||||
KAutoObject &auto_object = *static_cast<KAutoObject *>(obj);
|
KAutoObject &auto_object = *static_cast<KAutoObject *>(obj);
|
||||||
|
|
||||||
/* If we should, set our class token. */
|
/* If we should, set our class token. */
|
||||||
#if defined(MESOSPHERE_ENABLE_DEVIRTUALIZED_DYNAMIC_CAST)
|
|
||||||
{
|
{
|
||||||
constexpr auto Token = Derived::GetStaticTypeObj().GetClassToken();
|
constexpr auto Token = Derived::GetStaticTypeObj().GetClassToken();
|
||||||
auto_object.m_class_token = Token;
|
auto_object.m_class_token = Token;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Initialize reference count to 1. */
|
/* Initialize reference count to 1. */
|
||||||
auto_object.m_ref_count = 1;
|
auto_object.m_ref_count = 1;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user