From f10dab59de00190f3adf40052cb0949090b178eb Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Mon, 28 Apr 2025 23:03:36 +0300 Subject: [PATCH] _tomanagedarray temp objects allocations --- Source/Engine/Scripting/ManagedCLR/MUtils.cpp | 2 + Source/Engine/Scripting/ManagedCLR/MUtils.h | 83 +++++++++++++------ 2 files changed, 58 insertions(+), 27 deletions(-) diff --git a/Source/Engine/Scripting/ManagedCLR/MUtils.cpp b/Source/Engine/Scripting/ManagedCLR/MUtils.cpp index a52d55f67..c8ea8bad1 100644 --- a/Source/Engine/Scripting/ManagedCLR/MUtils.cpp +++ b/Source/Engine/Scripting/ManagedCLR/MUtils.cpp @@ -40,6 +40,8 @@ namespace valueClass = Scripting::FindClass(valueTypename); } } +extern Array MUtils::ObjectsTemp; + StringView MUtils::ToString(MString* str) { diff --git a/Source/Engine/Scripting/ManagedCLR/MUtils.h b/Source/Engine/Scripting/ManagedCLR/MUtils.h index 73094230b..4cdec0806 100644 --- a/Source/Engine/Scripting/ManagedCLR/MUtils.h +++ b/Source/Engine/Scripting/ManagedCLR/MUtils.h @@ -41,6 +41,8 @@ namespace MUtils extern FLAXENGINE_API MTypeObject* BoxVariantType(const VariantType& value); extern FLAXENGINE_API Variant UnboxVariant(MObject* value); extern FLAXENGINE_API MObject* BoxVariant(const Variant& value); + + extern Array ObjectsTemp; } // Converter for data of type T between managed and unmanaged world @@ -107,11 +109,14 @@ struct MConverter { if (data.Length() == 0) return; - MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + //MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + static Array objects; + //objects.Clear(); + objects.Resize(data.Length()); for (int32 i = 0; i < data.Length(); i++) objects[i] = (MObject*)MUtils::ToString(data.Get()[i]); - MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); - Allocator::Free(objects); + MCore::GC::WriteArrayRef(result, Span(objects.Get(), data.Length())); + //Allocator::Free(objects); } void ToNativeArray(Span& result, const MArray* data) @@ -140,11 +145,14 @@ struct MConverter { if (data.Length() == 0) return; - auto* objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + //auto* objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + static Array objects; + //objects.Clear(); + objects.Resize(data.Length()); for (int32 i = 0; i < data.Length(); i++) objects[i] = (MObject*)MUtils::ToString(data.Get()[i]); - MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); - Allocator::Free(objects); + MCore::GC::WriteArrayRef(result, Span(objects.Get(), data.Length())); + //Allocator::Free(objects); } void ToNativeArray(Span& result, const MArray* data) @@ -173,11 +181,14 @@ struct MConverter { if (data.Length() == 0) return; - MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + //MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + static Array objects; + //objects.Clear(); + objects.Resize(data.Length()); for (int32 i = 0; i < data.Length(); i++) objects[i] = (MObject*)MUtils::ToString(data.Get()[i]); - MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); - Allocator::Free(objects); + MCore::GC::WriteArrayRef(result, Span(objects.Get(), data.Length())); + //Allocator::Free(objects); } void ToNativeArray(Span& result, const MArray* data) @@ -206,11 +217,14 @@ struct MConverter { if (data.Length() == 0) return; - MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + //MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + static Array objects; + //objects.Clear(); + objects.Resize(data.Length()); for (int32 i = 0; i < data.Length(); i++) objects[i] = MUtils::BoxVariant(data[i]); - MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); - Allocator::Free(objects); + MCore::GC::WriteArrayRef(result, Span(objects.Get(), data.Length())); + //Allocator::Free(objects); } void ToNativeArray(Span& result, const MArray* data) @@ -239,11 +253,14 @@ struct MConverter::Va { if (data.Length() == 0) return; - MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + //MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + static Array objects; + //objects.Clear(); + objects.Resize(data.Length()); for (int32 i = 0; i < data.Length(); i++) objects[i] = data.Get()[i] ? data.Get()[i]->GetOrCreateManagedInstance() : nullptr; - MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); - Allocator::Free(objects); + MCore::GC::WriteArrayRef(result, Span(objects.Get(), data.Length())); + //Allocator::Free(objects); } void ToNativeArray(Span& result, const MArray* data) @@ -267,11 +284,14 @@ struct MConverter::Val { if (data.Length() == 0) return; - MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + //MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + static Array objects; + //objects.Clear(); + objects.Resize(data.Length()); for (int32 i = 0; i < data.Length(); i++) objects[i] = data.Get()[i].GetOrCreateManagedInstance(); - MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); - Allocator::Free(objects); + MCore::GC::WriteArrayRef(result, Span(objects.Get(), data.Length())); + //Allocator::Free(objects); } }; @@ -296,11 +316,14 @@ struct MConverter> { if (data.Length() == 0) return; - MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + //MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + static Array objects; + //objects.Clear(); + objects.Resize(data.Length()); for (int32 i = 0; i < data.Length(); i++) objects[i] = data[i].GetManagedInstance(); - MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); - Allocator::Free(objects); + MCore::GC::WriteArrayRef(result, Span(objects.Get(), data.Length())); + //Allocator::Free(objects); } void ToNativeArray(Span>& result, const MArray* data) @@ -332,11 +355,14 @@ struct MConverter> { if (data.Length() == 0) return; - MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + //MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + static Array objects; + //objects.Clear(); + objects.Resize(data.Length()); for (int32 i = 0; i < data.Length(); i++) objects[i] = data[i].GetManagedInstance(); - MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); - Allocator::Free(objects); + MCore::GC::WriteArrayRef(result, Span(objects.Get(), data.Length())); + //Allocator::Free(objects); } void ToNativeArray(Span>& result, const MArray* data) @@ -357,11 +383,14 @@ struct MConverter> { if (data.Length() == 0) return; - MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + //MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); + static Array objects; + //objects.Clear(); + objects.Resize(data.Length()); for (int32 i = 0; i < data.Length(); i++) objects[i] = data[i].GetManagedInstance(); - MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); - Allocator::Free(objects); + MCore::GC::WriteArrayRef(result, Span(objects.Get(), data.Length())); + //Allocator::Free(objects); } void ToNativeArray(Span>& result, const MArray* data)