diff --git a/Source/Engine/Scripting/Scripting.cpp b/Source/Engine/Scripting/Scripting.cpp index ee2922754..c8c8184bd 100644 --- a/Source/Engine/Scripting/Scripting.cpp +++ b/Source/Engine/Scripting/Scripting.cpp @@ -495,7 +495,7 @@ void Scripting::Release() { auto obj = i->Value; #if USE_OBJECTS_DISPOSE_CRASHES_DEBUGGING - LOG(Info, "[OnScriptingDispose] obj = 0x{0:x}, {1}", (uint32)obj.Ptr, String(obj.TypeName)); + LOG(Info, "[OnScriptingDispose] obj = 0x{0:x}, {1}", (uint64)obj.Ptr, String(obj.TypeName)); #endif obj->OnScriptingDispose(); } @@ -589,6 +589,24 @@ void Scripting::Reload(bool canTriggerSceneReload) MCore::GC::Collect(); MCore::GC::WaitForPendingFinalizers(); + // Destroy objects from game assemblies (eg. not released objects that might crash if persist in memory after reload) + _objectsLocker.Lock(); + { + const auto flaxModule = GetBinaryModuleFlaxEngine(); + for (auto i = _objectsDictionary.Begin(); i.IsNotEnd(); ++i) + { + auto obj = i->Value; + if (obj->GetTypeHandle().Module == flaxModule) + continue; + +#if USE_OBJECTS_DISPOSE_CRASHES_DEBUGGING + LOG(Info, "[OnScriptingDispose] obj = 0x{0:x}, {1}", (uint64)obj.Ptr, String(obj.TypeName)); +#endif + obj->OnScriptingDispose(); + } + } + _objectsLocker.Unlock(); + // Unload all game modules LOG(Info, "Unloading game binary modules"); auto modules = BinaryModule::GetModules(); @@ -821,7 +839,7 @@ void Scripting::OnManagedInstanceDeleted(ScriptingObject* obj) if (_objectsDictionary.ContainsValue(obj)) { #if USE_OBJECTS_DISPOSE_CRASHES_DEBUGGING - LOG(Info, "[OnManagedInstanceDeleted] obj = 0x{0:x}, {1}", (uint32)obj, String(ScriptingObjectData(obj).TypeName)); + LOG(Info, "[OnManagedInstanceDeleted] obj = 0x{0:x}, {1}", (uint64)obj, String(ScriptingObjectData(obj).TypeName)); #endif obj->OnManagedInstanceDeleted(); } @@ -877,7 +895,7 @@ void Scripting::RegisterObject(ScriptingObject* obj) #endif #if USE_OBJECTS_DISPOSE_CRASHES_DEBUGGING - LOG(Info, "[RegisterObject] obj = 0x{0:x}, {1}", (uint32)obj, String(ScriptingObjectData(obj).TypeName)); + LOG(Info, "[RegisterObject] obj = 0x{0:x}, {1}", (uint64)obj, String(ScriptingObjectData(obj).TypeName)); #endif _objectsDictionary.Add(obj->GetID(), obj); } @@ -889,7 +907,7 @@ void Scripting::UnregisterObject(ScriptingObject* obj) //ASSERT(!obj->_id.IsValid() || _objectsDictionary.ContainsValue(obj)); #if USE_OBJECTS_DISPOSE_CRASHES_DEBUGGING - LOG(Info, "[UnregisterObject] obj = 0x{0:x}, {1}", (uint32)obj, String(ScriptingObjectData(obj).TypeName)); + LOG(Info, "[UnregisterObject] obj = 0x{0:x}, {1}", (uint64)obj, String(ScriptingObjectData(obj).TypeName)); #endif _objectsDictionary.Remove(obj->GetID()); } diff --git a/Source/Engine/Scripting/ScriptingObject.cpp b/Source/Engine/Scripting/ScriptingObject.cpp index 9d2320d7f..dd9cf57a8 100644 --- a/Source/Engine/Scripting/ScriptingObject.cpp +++ b/Source/Engine/Scripting/ScriptingObject.cpp @@ -276,10 +276,6 @@ void PersistentScriptingObject::OnManagedInstanceDeleted() _gcHandle = 0; } - // Unregister object - if (IsRegistered()) - UnregisterObject(); - // But do not delete itself }