From 081305fab76ba6643136b44c2befd466584498cc Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Sat, 31 Dec 2022 13:23:36 +0100 Subject: [PATCH] Fix regression from 0ca8fe2f45ad7eae65af42427b2e2c68358c9300 for value types --- .../Bindings/BindingsGenerator.Cpp.cs | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs index fb641eb83..1bcfc7ff5 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs @@ -578,12 +578,12 @@ namespace Flax.Build.Bindings } } - private static string GenerateCppWrapperManagedToNative(BuildData buildData, TypeInfo typeInfo, ApiTypeInfo caller, out string type, FunctionInfo functionInfo, out bool needLocalVariable) + private static string GenerateCppWrapperManagedToNative(BuildData buildData, TypeInfo typeInfo, ApiTypeInfo caller, out string type, out ApiTypeInfo apiType, FunctionInfo functionInfo, out bool needLocalVariable) { needLocalVariable = false; // Register any API types usage - var apiType = FindApiTypeInfo(buildData, typeInfo, caller); + apiType = FindApiTypeInfo(buildData, typeInfo, caller); CppReferencesFiles.Add(apiType?.File); if (typeInfo.GenericArgs != null) { @@ -598,7 +598,7 @@ namespace Flax.Build.Bindings if (typeInfo.IsArray) { var arrayType = new TypeInfo { Type = "Array", GenericArgs = new List { new TypeInfo(typeInfo) { IsArray = false } } }; - var result = GenerateCppWrapperManagedToNative(buildData, arrayType, caller, out type, functionInfo, out needLocalVariable); + var result = GenerateCppWrapperManagedToNative(buildData, arrayType, caller, out type, out _, functionInfo, out needLocalVariable); return result + ".Get()"; } @@ -938,7 +938,7 @@ namespace Flax.Build.Bindings separator = true; CppParamsThatNeedConversion[i] = false; - CppParamsWrappersCache[i] = GenerateCppWrapperManagedToNative(buildData, parameterInfo.Type, caller, out var managedType, functionInfo, out CppParamsThatNeedLocalVariable[i]); + CppParamsWrappersCache[i] = GenerateCppWrapperManagedToNative(buildData, parameterInfo.Type, caller, out var managedType, out var apiType, functionInfo, out CppParamsThatNeedLocalVariable[i]); // Out parameters that need additional converting will be converted at the native side (eg. object reference) var isOutWithManagedConverter = parameterInfo.IsOut && !string.IsNullOrEmpty(GenerateCSharpManagedToNativeConverter(buildData, parameterInfo.Type, caller)); @@ -956,7 +956,6 @@ namespace Flax.Build.Bindings if (parameterInfo.IsOut || isRefOut) { bool convertOutputParameter = false; - var apiType = FindApiTypeInfo(buildData, parameterInfo.Type, caller); if (apiType != null) { // Non-POD structure passed as value (eg. it contains string or array inside) @@ -991,7 +990,7 @@ namespace Flax.Build.Bindings contents.Append(", "); separator = true; - GenerateCppWrapperManagedToNative(buildData, parameterInfo.Type, caller, out var managedType, functionInfo, out _); + GenerateCppWrapperManagedToNative(buildData, parameterInfo.Type, caller, out var managedType, out _, functionInfo, out _); contents.Append(managedType); if (parameterInfo.IsRef || parameterInfo.IsOut || UsePassByReference(buildData, parameterInfo.Type, caller)) contents.Append('*'); @@ -1666,10 +1665,10 @@ namespace Flax.Build.Bindings { // Convert value back from managed to native (could be modified there) paramType.IsRef = false; - var managedToNative = GenerateCppWrapperManagedToNative(buildData, paramType, classInfo, out var managedType, null, out _); + var managedToNative = GenerateCppWrapperManagedToNative(buildData, paramType, classInfo, out var managedType, out var apiType, null, out _); var passAsParamPtr = managedType.EndsWith("*"); - var useLocalVar = CppParamsThatNeedConversion[i]; - var paramValue = useLocalVar ? $"*({managedType}{(passAsParamPtr ? "" : "*")}*)params[{i}]" : $"({managedType}{(passAsParamPtr ? "" : "*")})params[{i}]"; + var useLocalVarPointer = CppParamsThatNeedConversion[i] && !apiType.IsValueType; + var paramValue = useLocalVarPointer ? $"*({managedType}{(passAsParamPtr ? "" : "*")}*)params[{i}]" : $"({managedType}{(passAsParamPtr ? "" : "*")})params[{i}]"; if (!string.IsNullOrEmpty(managedToNative)) { if (!passAsParamPtr) @@ -2562,7 +2561,7 @@ namespace Flax.Build.Bindings continue; CppNonPodTypesConvertingGeneration = true; - var wrapper = GenerateCppWrapperManagedToNative(buildData, fieldInfo.Type, apiType, out _, null, out _); + var wrapper = GenerateCppWrapperManagedToNative(buildData, fieldInfo.Type, apiType, out _, out _, null, out _); CppNonPodTypesConvertingGeneration = false; if (fieldInfo.Type.IsArray) @@ -2646,7 +2645,7 @@ namespace Flax.Build.Bindings continue; CppNonPodTypesConvertingGeneration = true; - var wrapper = GenerateCppWrapperManagedToNative(buildData, fieldInfo.Type, apiType, out _, null, out _); + var wrapper = GenerateCppWrapperManagedToNative(buildData, fieldInfo.Type, apiType, out _, out _, null, out _); CppNonPodTypesConvertingGeneration = false; if (fieldInfo.Type.IsArray)