#include "il2cpp-config.h" #include "il2cpp-class-internals.h" #include "Il2CppTypeHash.h" #include "utils/StringUtils.h" #include "utils/HashUtils.h" using il2cpp::utils::HashUtils; using il2cpp::utils::StringUtils; namespace il2cpp { namespace metadata { size_t Il2CppTypeHash::operator()(const Il2CppType* t1) const { return Hash(t1); } size_t Il2CppTypeHash::Hash(const Il2CppType* t1) { size_t hash = t1->type; hash = HashUtils::Combine(hash, t1->byref); switch (t1->type) { case IL2CPP_TYPE_VALUETYPE: case IL2CPP_TYPE_CLASS: { return HashUtils::Combine(hash, (size_t)t1->data.typeHandle); } case IL2CPP_TYPE_SZARRAY: case IL2CPP_TYPE_PTR: { return HashUtils::Combine(hash, Hash(t1->data.type)); } case IL2CPP_TYPE_GENERICINST: { const Il2CppGenericInst *inst = t1->data.generic_class->context.class_inst; hash = HashUtils::Combine(hash, (size_t)t1->data.generic_class->type->data.typeHandle); for (uint32_t i = 0; i < inst->type_argc; ++i) { hash = HashUtils::Combine(hash, Hash(inst->type_argv[i])); } return hash; } default: return hash; } return hash; } } /* namespace vm */ } /* namespace il2cpp */