mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-05-21 10:25:08 -04:00
kern: devirtualize KAutoObjectWithList::GetId()
This commit is contained in:
parent
3e4acc62f3
commit
8a661cee6e
8 changed files with 351 additions and 97 deletions
|
@ -21,6 +21,35 @@ namespace ams::kern {
|
|||
|
||||
class KAutoObject;
|
||||
|
||||
#define FOR_EACH_K_CLASS_TOKEN_OBJECT_TYPE(HANDLER) \
|
||||
HANDLER(KAutoObject) \
|
||||
\
|
||||
HANDLER(KSynchronizationObject) \
|
||||
HANDLER(KReadableEvent) \
|
||||
\
|
||||
HANDLER(KInterruptEvent) \
|
||||
HANDLER(KDebug) \
|
||||
HANDLER(KThread) \
|
||||
HANDLER(KServerPort) \
|
||||
HANDLER(KServerSession) \
|
||||
HANDLER(KClientPort) \
|
||||
HANDLER(KClientSession) \
|
||||
HANDLER(KProcess) \
|
||||
HANDLER(KResourceLimit) \
|
||||
HANDLER(KLightSession) \
|
||||
HANDLER(KPort) \
|
||||
HANDLER(KSession) \
|
||||
HANDLER(KSharedMemory) \
|
||||
HANDLER(KEvent) \
|
||||
HANDLER(KLightClientSession) \
|
||||
HANDLER(KLightServerSession) \
|
||||
HANDLER(KTransferMemory) \
|
||||
HANDLER(KDeviceAddressSpace) \
|
||||
HANDLER(KSessionRequest) \
|
||||
HANDLER(KCodeMemory) \
|
||||
HANDLER(KIoPool) \
|
||||
HANDLER(KIoRegion)
|
||||
|
||||
class KClassTokenGenerator {
|
||||
public:
|
||||
using TokenBaseType = u16;
|
||||
|
@ -113,8 +142,11 @@ namespace ams::kern {
|
|||
KIoPool,
|
||||
KIoRegion,
|
||||
|
||||
FinalClassesLast,
|
||||
|
||||
FinalClassesEnd = FinalClassesStart + NumFinalClasses,
|
||||
};
|
||||
static_assert(ObjectType::FinalClassesLast <= ObjectType::FinalClassesEnd);
|
||||
|
||||
template<typename T>
|
||||
static constexpr inline TokenBaseType ClassToken = GetClassToken<T>();
|
||||
|
@ -125,4 +157,37 @@ namespace ams::kern {
|
|||
template<typename T>
|
||||
static constexpr inline ClassTokenType ClassToken = KClassTokenGenerator::ClassToken<T>;
|
||||
|
||||
namespace impl {
|
||||
|
||||
consteval bool IsKClassTokenGeneratorForEachMacroValid() {
|
||||
auto IsObjectTypeIncludedByMacro = [](KClassTokenGenerator::ObjectType object_type) -> bool {
|
||||
#define CLASS_TOKEN_HANDLER(CLASSNAME) if (object_type == KClassTokenGenerator::ObjectType::CLASSNAME) { return true; }
|
||||
FOR_EACH_K_CLASS_TOKEN_OBJECT_TYPE(CLASS_TOKEN_HANDLER)
|
||||
#undef CLASS_TOKEN_HANDLER
|
||||
return false;
|
||||
};
|
||||
|
||||
if (!IsObjectTypeIncludedByMacro(KClassTokenGenerator::ObjectType::KAutoObject)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (auto base = util::ToUnderlying(KClassTokenGenerator::ObjectType::BaseClassesStart); base < util::ToUnderlying(KClassTokenGenerator::ObjectType::BaseClassesEnd); ++base) {
|
||||
if (!IsObjectTypeIncludedByMacro(static_cast<KClassTokenGenerator::ObjectType>(base))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
for (auto fin = util::ToUnderlying(KClassTokenGenerator::ObjectType::FinalClassesStart); fin < util::ToUnderlying(KClassTokenGenerator::ObjectType::FinalClassesLast); ++fin) {
|
||||
if (!IsObjectTypeIncludedByMacro(static_cast<KClassTokenGenerator::ObjectType>(fin))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static_assert(IsKClassTokenGeneratorForEachMacroValid());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue