diff --git a/Source/Engine/Scripting/BinaryModule.cpp b/Source/Engine/Scripting/BinaryModule.cpp
index 69033f7b6..2f9a42bbc 100644
--- a/Source/Engine/Scripting/BinaryModule.cpp
+++ b/Source/Engine/Scripting/BinaryModule.cpp
@@ -647,6 +647,8 @@ ScriptingTypeInitializer::ScriptingTypeInitializer(BinaryModule* module, const S
module->TypeNameToTypeIndex[fullname] = TypeIndex;
}
+CriticalSection BinaryModule::Locker;
+
BinaryModule::BinaryModulesList& BinaryModule::GetModules()
{
static BinaryModulesList modules;
diff --git a/Source/Engine/Scripting/BinaryModule.h b/Source/Engine/Scripting/BinaryModule.h
index 36e90acdf..5328f9bbb 100644
--- a/Source/Engine/Scripting/BinaryModule.h
+++ b/Source/Engine/Scripting/BinaryModule.h
@@ -60,6 +60,9 @@ public:
/// The found binary module or null if missing.
static BinaryModule* GetModule(const StringAnsiView& name);
+ // Global scripting locker for cached data.
+ static CriticalSection Locker;
+
protected:
///
diff --git a/Source/Engine/Scripting/ManagedCLR/MAssembly.h b/Source/Engine/Scripting/ManagedCLR/MAssembly.h
index 3436df567..3862627d0 100644
--- a/Source/Engine/Scripting/ManagedCLR/MAssembly.h
+++ b/Source/Engine/Scripting/ManagedCLR/MAssembly.h
@@ -35,7 +35,6 @@ private:
mutable int32 _hasCachedClasses : 1;
mutable ClassesDictionary _classes;
- CriticalSection _locker;
int32 _reloadCount;
StringAnsi _name;
diff --git a/Source/Engine/Scripting/Runtime/DotNet.cpp b/Source/Engine/Scripting/Runtime/DotNet.cpp
index 1d01a8ea3..7f82f8dfc 100644
--- a/Source/Engine/Scripting/Runtime/DotNet.cpp
+++ b/Source/Engine/Scripting/Runtime/DotNet.cpp
@@ -25,6 +25,7 @@
#include "Engine/Scripting/ManagedCLR/MException.h"
#include "Engine/Scripting/ManagedCLR/MUtils.h"
#include "Engine/Scripting/Scripting.h"
+#include "Engine/Scripting/BinaryModule.h"
#include "Engine/Engine/Globals.h"
#include "Engine/Profiler/ProfilerCPU.h"
#include "Engine/Threading/Threading.h"
@@ -636,7 +637,7 @@ const MAssembly::ClassesDictionary& MAssembly::GetClasses() const
#if TRACY_ENABLE
ZoneText(*_name, _name.Length());
#endif
- ScopeLock lock(_locker);
+ ScopeLock lock(BinaryModule::Locker);
if (_hasCachedClasses)
return _classes;
ASSERT(_classes.IsEmpty());
@@ -939,6 +940,9 @@ MMethod* MClass::GetMethod(const char* name, int32 numParams) const
const Array& MClass::GetMethods() const
{
+ if (_hasCachedMethods)
+ return _methods;
+ ScopeLock lock(BinaryModule::Locker);
if (_hasCachedMethods)
return _methods;
@@ -972,6 +976,9 @@ MField* MClass::GetField(const char* name) const
const Array& MClass::GetFields() const
{
+ if (_hasCachedFields)
+ return _fields;
+ ScopeLock lock(BinaryModule::Locker);
if (_hasCachedFields)
return _fields;
@@ -1016,6 +1023,9 @@ MProperty* MClass::GetProperty(const char* name) const
const Array& MClass::GetProperties() const
{
+ if (_hasCachedProperties)
+ return _properties;
+ ScopeLock lock(BinaryModule::Locker);
if (_hasCachedProperties)
return _properties;
@@ -1038,6 +1048,9 @@ const Array& MClass::GetProperties() const
const Array& MClass::GetInterfaces() const
{
+ if (_hasCachedInterfaces)
+ return _interfaces;
+ ScopeLock lock(BinaryModule::Locker);
if (_hasCachedInterfaces)
return _interfaces;
@@ -1073,6 +1086,9 @@ MObject* MClass::GetAttribute(const MClass* monoClass) const
const Array& MClass::GetAttributes() const
{
+ if (_hasCachedAttributes)
+ return _attributes;
+ ScopeLock lock(BinaryModule::Locker);
if (_hasCachedAttributes)
return _attributes;
diff --git a/Source/Engine/Scripting/Runtime/Mono.cpp b/Source/Engine/Scripting/Runtime/Mono.cpp
index 676453c21..ef0c42818 100644
--- a/Source/Engine/Scripting/Runtime/Mono.cpp
+++ b/Source/Engine/Scripting/Runtime/Mono.cpp
@@ -1044,7 +1044,7 @@ const MAssembly::ClassesDictionary& MAssembly::GetClasses() const
const StringAnsiView monoImageName(mono_image_get_name(_monoImage));
ZoneText(*monoImageName, monoImageName.Length());
#endif
- ScopeLock lock(_locker);
+ ScopeLock lock(BinaryModule::Locker);
if (_hasCachedClasses)
return _classes;
ASSERT(_classes.IsEmpty());