From e2fbd83086bb10278ea134186d589c721c2c5408 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Mon, 30 Mar 2026 21:56:01 +0200 Subject: [PATCH] Optimize `VariantType` name allocs to use static type when possible --- Source/Engine/Scripting/BinaryModule.cpp | 1 - .../Bindings/BindingsGenerator.Cpp.cs | 21 ++++++++++++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Source/Engine/Scripting/BinaryModule.cpp b/Source/Engine/Scripting/BinaryModule.cpp index 1b254a0c6..02358fac0 100644 --- a/Source/Engine/Scripting/BinaryModule.cpp +++ b/Source/Engine/Scripting/BinaryModule.cpp @@ -17,7 +17,6 @@ #include "FlaxEngine.Gen.h" #include "Scripting.h" #include "Events.h" -#include "Internal/StdTypesContainer.h" Dictionary, void(*)(ScriptingObject*, void*, bool)> ScriptingEvents::EventsTable; Delegate, ScriptingTypeHandle, StringView> ScriptingEvents::Event; diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs index 8002c66a5..eb4ec604f 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs @@ -201,13 +201,15 @@ namespace Flax.Build.Bindings if (apiType.IsStruct && !apiType.IsPod && !CppUsedNonPodTypes.Contains(apiType)) CppUsedNonPodTypes.Add(apiType); + var fullname = apiType.FullNameManaged; if (apiType.IsEnum) - return $"Variant::Enum(VariantType(VariantType::Enum, StringAnsiView(\"{apiType.FullNameManaged}\", {apiType.FullNameManaged.Length})), {value})"; + return $"Variant::Enum(VariantType(VariantType::Enum, StringAnsiView(\"{fullname}\", {fullname.Length})), {value})"; if (apiType.IsStruct && !CppInBuildVariantStructures.Contains(apiType.Name)) - if (typeInfo.IsPtr) - return $"Variant::Structure(VariantType(VariantType::Structure, StringAnsiView(\"{apiType.FullNameManaged}\", {apiType.FullNameManaged.Length})), *{value})"; - else - return $"Variant::Structure(VariantType(VariantType::Structure, StringAnsiView(\"{apiType.FullNameManaged}\", {apiType.FullNameManaged.Length})), {value})"; + { + if (apiType.IsInBuild) + return $"Variant::Structure(VariantType(VariantType::Structure, StringAnsiView(\"{fullname}\", {fullname.Length})), {(typeInfo.IsPtr ? "*" + value : value)})"; + return $"Variant::Structure(VariantType(VariantType::Structure, {apiType.FullNameNative}::TypeInitializer.GetType()), {(typeInfo.IsPtr ? "*" + value : value)})"; + } } if (typeInfo.IsPtr && typeInfo.IsConst) @@ -276,14 +278,17 @@ namespace Flax.Build.Bindings var apiType = FindApiTypeInfo(buildData, typeInfo, caller); if (apiType != null) { - // TODO: optimize VariantType for explicitly defined types to use static name and less mem/allocs var fullname = apiType.FullNameManaged; if (apiType.IsEnum) return $"VariantType(VariantType::Enum, StringAnsiView(\"{fullname}\", {fullname.Length}))"; if (apiType.IsStruct) - return $"VariantType(VariantType::Structure, StringAnsiView(\"{fullname}\", {fullname.Length}))"; + { + if (apiType.IsInBuild) + return $"VariantType(VariantType::Structure, StringAnsiView(\"{fullname}\", {fullname.Length}))"; + return $"VariantType(VariantType::Structure, {apiType.FullNameNative}::TypeInitializer.GetType())"; + } if (apiType.IsClass) - return $"VariantType(VariantType::Object, StringAnsiView(\"{fullname}\", {fullname.Length}))"; + return $"VariantType(VariantType::Object, {apiType.FullNameNative}::TypeInitializer.GetType())"; } // Unknown