From 0ca8fe2f45ad7eae65af42427b2e2c68358c9300 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Sat, 31 Dec 2022 00:22:04 +0100 Subject: [PATCH] Fix passing reference types back to the native code from scripting event --- .../Bindings/BindingsGenerator.Cpp.cs | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs index 0fd5ead49..fb641eb83 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs @@ -99,14 +99,15 @@ namespace Flax.Build.Bindings return sb.ToString(); } - private static string GenerateCppWrapperNativeToManagedParam(BuildData buildData, StringBuilder contents, TypeInfo paramType, string paramName, ApiTypeInfo caller, bool isOut) + private static string GenerateCppWrapperNativeToManagedParam(BuildData buildData, StringBuilder contents, TypeInfo paramType, string paramName, ApiTypeInfo caller, bool isOut, out bool useLocalVar) { + useLocalVar = false; var nativeToManaged = GenerateCppWrapperNativeToManaged(buildData, paramType, caller, out var managedTypeAsNative, null); string result; if (!string.IsNullOrEmpty(nativeToManaged)) { result = string.Format(nativeToManaged, paramName); - if (managedTypeAsNative[managedTypeAsNative.Length - 1] == '*') + if (managedTypeAsNative[managedTypeAsNative.Length - 1] == '*' && !isOut) { // Pass pointer value } @@ -117,6 +118,7 @@ namespace Flax.Build.Bindings result = string.Format(nativeToManaged, '*' + paramName); contents.Append($" auto __param_{paramName} = {result};").AppendLine(); result = $"&__param_{paramName}"; + useLocalVar = true; } } else @@ -1253,7 +1255,7 @@ namespace Flax.Build.Bindings for (var i = 0; i < functionInfo.Parameters.Count; i++) { var parameterInfo = functionInfo.Parameters[i]; - var paramValue = GenerateCppWrapperNativeToManagedParam(buildData, contents, parameterInfo.Type, parameterInfo.Name, classInfo, parameterInfo.IsOut); + var paramValue = GenerateCppWrapperNativeToManagedParam(buildData, contents, parameterInfo.Type, parameterInfo.Name, classInfo, parameterInfo.IsOut, out _); contents.Append($" params[{i}] = {paramValue};").AppendLine(); } @@ -1645,7 +1647,8 @@ namespace Flax.Build.Bindings { var paramType = eventInfo.Type.GenericArgs[i]; var paramName = "arg" + i; - var paramValue = GenerateCppWrapperNativeToManagedParam(buildData, contents, paramType, paramName, classInfo, false); + var paramIsOut = paramType.IsRef && !paramType.IsConst; + var paramValue = GenerateCppWrapperNativeToManagedParam(buildData, contents, paramType, paramName, classInfo, paramIsOut, out CppParamsThatNeedConversion[i]); contents.Append($" params[{i}] = {paramValue};").AppendLine(); } if (eventInfo.IsStatic) @@ -1658,13 +1661,15 @@ namespace Flax.Build.Bindings for (var i = 0; i < paramsCount; i++) { var paramType = eventInfo.Type.GenericArgs[i]; - if (paramType.IsRef && !paramType.IsConst) + var paramIsOut = paramType.IsRef && !paramType.IsConst; + if (paramIsOut) { // 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 passAsParamPtr = managedType.EndsWith("*"); - var paramValue = $"({managedType}{(passAsParamPtr ? "" : "*")})params[{i}]"; + var useLocalVar = CppParamsThatNeedConversion[i]; + var paramValue = useLocalVar ? $"*({managedType}{(passAsParamPtr ? "" : "*")}*)params[{i}]" : $"({managedType}{(passAsParamPtr ? "" : "*")})params[{i}]"; if (!string.IsNullOrEmpty(managedToNative)) { if (!passAsParamPtr) @@ -2379,7 +2384,7 @@ namespace Flax.Build.Bindings if (typeInfo.IsArray) { typeInfo.IsArray = false; - header.Append($"{GenerateCppWrapperNativeToVariantMethodName(typeInfo)}Array(const {typeInfo}* v, const int32 length)").AppendLine(); + header.Append($"{GenerateCppWrapperNativeToVariantMethodName(typeInfo)}Array({(typeInfo.IsConst ? "const " : "")}{typeInfo}* v, const int32 length)").AppendLine(); header.Append('{').AppendLine(); header.Append(" Variant result;").AppendLine(); header.Append(" result.SetType(VariantType(VariantType::Array));").AppendLine(); @@ -2392,7 +2397,7 @@ namespace Flax.Build.Bindings else if (typeInfo.Type == "Array" && typeInfo.GenericArgs != null) { var valueType = typeInfo.GenericArgs[0]; - header.Append($"{GenerateCppWrapperNativeToVariantMethodName(valueType)}Array(const {valueType}* v, const int32 length)").AppendLine(); + header.Append($"{GenerateCppWrapperNativeToVariantMethodName(valueType)}Array({(typeInfo.IsConst ? "const " : "")}{valueType}* v, const int32 length)").AppendLine(); header.Append('{').AppendLine(); header.Append(" Variant result;").AppendLine(); header.Append(" result.SetType(VariantType(VariantType::Array));").AppendLine();