| 1737 | } |
| 1738 | |
| 1739 | MClass* GetOrCreateClass(MType* typeHandle) |
| 1740 | { |
| 1741 | if (!typeHandle) |
| 1742 | return nullptr; |
| 1743 | PROFILE_MEM(ScriptingCSharp); |
| 1744 | ScopeLock lock(BinaryModule::Locker); |
| 1745 | MClass* klass; |
| 1746 | if (!CachedClassHandles.TryGet(typeHandle, klass)) |
| 1747 | { |
| 1748 | NativeClassDefinitions classInfo; |
| 1749 | void* assemblyHandle; |
| 1750 | static void* GetManagedClassFromTypePtr = GetStaticMethodPointer(TEXT("GetManagedClassFromType")); |
| 1751 | CallStaticMethod<void, void*, void*>(GetManagedClassFromTypePtr, typeHandle, &classInfo, &assemblyHandle); |
| 1752 | MAssembly* assembly = GetAssembly(assemblyHandle); |
| 1753 | klass = assembly->Memory.New<MClass>(assembly, classInfo.typeHandle, classInfo.name, classInfo.fullname, classInfo.namespace_, classInfo.typeAttributes); |
| 1754 | if (assembly != nullptr) |
| 1755 | { |
| 1756 | auto& classes = assembly->GetTypeClasses(); |
| 1757 | if (classes.ContainsKey(klass->GetFullName())) |
| 1758 | { |
| 1759 | LOG(Warning, "Class '{0}' was already added to assembly '{1}'", String(klass->GetFullName()), String(assembly->GetName())); |
| 1760 | } |
| 1761 | classes[klass->GetFullName()] = klass; |
| 1762 | } |
| 1763 | |
| 1764 | if (typeHandle != classInfo.typeHandle) |
| 1765 | CallStaticMethod<void, void*, void*>(GetManagedClassFromTypePtr, typeHandle, &classInfo); |
| 1766 | |
| 1767 | MCore::GC::FreeMemory((void*)classInfo.name); |
| 1768 | MCore::GC::FreeMemory((void*)classInfo.fullname); |
| 1769 | MCore::GC::FreeMemory((void*)classInfo.namespace_); |
| 1770 | } |
| 1771 | ASSERT(klass != nullptr); |
| 1772 | return klass; |
| 1773 | } |
| 1774 | |
| 1775 | MType* GetObjectType(MObject* obj) |
| 1776 | { |
no test coverage detected