From d807e9bfe066cfb092e1701a82581ab9c288d52d Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 10 Jan 2024 11:48:08 +0100 Subject: [PATCH] Fix crash when setting maanaged structure data via `Variant` #2163 --- Source/Engine/Core/Types/Variant.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/Source/Engine/Core/Types/Variant.cpp b/Source/Engine/Core/Types/Variant.cpp index 952e648e6..66e17b0a2 100644 --- a/Source/Engine/Core/Types/Variant.cpp +++ b/Source/Engine/Core/Types/Variant.cpp @@ -3985,15 +3985,32 @@ void Variant::CopyStructure(void* src) { if (AsBlob.Data && src) { - const ScriptingTypeHandle typeHandle = Scripting::FindScriptingType(StringAnsiView(Type.TypeName)); + const StringAnsiView typeName(Type.TypeName); + const ScriptingTypeHandle typeHandle = Scripting::FindScriptingType(typeName); if (typeHandle) { auto& type = typeHandle.GetType(); type.Struct.Copy(AsBlob.Data, src); } +#if USE_CSHARP + else if (const auto mclass = Scripting::FindClass(typeName)) + { + // Fallback to C#-only types + MCore::Thread::Attach(); + if (MANAGED_GC_HANDLE && mclass->IsValueType()) + { + MObject* instance = MCore::GCHandle::GetTarget(MANAGED_GC_HANDLE); + void* data = MCore::Object::Unbox(instance); + Platform::MemoryCopy(data, src, mclass->GetInstanceSize()); + } + } +#endif else { - Platform::MemoryCopy(AsBlob.Data, src, AsBlob.Length); + if (typeName.Length() != 0) + { + LOG(Warning, "Missing scripting type \'{0}\'", String(typeName)); + } } } }