diff --git a/Source/Engine/Scripting/BinaryModule.cpp b/Source/Engine/Scripting/BinaryModule.cpp index d4fcdf249..d0b971aab 100644 --- a/Source/Engine/Scripting/BinaryModule.cpp +++ b/Source/Engine/Scripting/BinaryModule.cpp @@ -600,6 +600,24 @@ MMethod* ManagedBinaryModule::FindMethod(MClass* mclass, const ScriptingTypeMeth return nullptr; } +ManagedBinaryModule* ManagedBinaryModule::FindModule(MonoClass* klass) +{ + // TODO: consider caching lookup table MonoImage* -> ManagedBinaryModule* + ManagedBinaryModule* module = nullptr; + MonoImage* mImage = mono_class_get_image(klass); + auto& modules = BinaryModule::GetModules(); + for (auto e : modules) + { + auto managedModule = dynamic_cast(e); + if (managedModule && managedModule->Assembly->GetMonoImage() == mImage) + { + module = managedModule; + break; + } + } + return module; +} + void ManagedBinaryModule::OnLoading(MAssembly* assembly) { PROFILE_CPU(); diff --git a/Source/Engine/Scripting/BinaryModule.h b/Source/Engine/Scripting/BinaryModule.h index 1cf32200a..d76d46c5a 100644 --- a/Source/Engine/Scripting/BinaryModule.h +++ b/Source/Engine/Scripting/BinaryModule.h @@ -297,6 +297,7 @@ public: static ScriptingObject* ManagedObjectSpawn(const ScriptingObjectSpawnParams& params); static MMethod* FindMethod(MClass* mclass, const ScriptingTypeMethodSignature& signature); + static ManagedBinaryModule* FindModule(MonoClass* klass); private: diff --git a/Source/Engine/Scripting/ScriptingObject.cpp b/Source/Engine/Scripting/ScriptingObject.cpp index c221b066f..e00694ee4 100644 --- a/Source/Engine/Scripting/ScriptingObject.cpp +++ b/Source/Engine/Scripting/ScriptingObject.cpp @@ -367,19 +367,7 @@ public: } // Get the assembly with that class - // TODO: consider caching lookup table MonoImage* -> ManagedBinaryModule* - ManagedBinaryModule* module = nullptr; - MonoImage* mImage = mono_class_get_image(typeClass); - auto& modules = BinaryModule::GetModules(); - for (auto e : modules) - { - auto managedModule = dynamic_cast(e); - if (managedModule && managedModule->Assembly->GetMonoImage() == mImage) - { - module = managedModule; - break; - } - } + auto module = ManagedBinaryModule::FindModule(typeClass); if (module == nullptr) { LOG(Error, "Cannot find scripting assembly for type \'{0}.{1}\'.", String(mono_class_get_namespace(typeClass)), String(mono_class_get_name(typeClass))); @@ -464,19 +452,7 @@ public: MonoClass* typeClass = mono_object_get_class(managedInstance); // Get the assembly with that class - // TODO: consider caching lookup table MonoImage* -> ManagedBinaryModule* - ManagedBinaryModule* module = nullptr; - MonoImage* mimage = mono_class_get_image(typeClass); - auto& modules = BinaryModule::GetModules(); - for (auto e : modules) - { - auto managedModule = dynamic_cast(e); - if (managedModule && managedModule->Assembly->GetMonoImage() == mimage) - { - module = managedModule; - break; - } - } + auto module = ManagedBinaryModule::FindModule(typeClass); if (module == nullptr) { LOG(Error, "Cannot find scripting assembly for type \'{0}.{1}\'.", String(mono_class_get_namespace(typeClass)), String(mono_class_get_name(typeClass)));