diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index 65fa1c6f7..d3d6eb0f6 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -583,8 +583,9 @@ namespace Flax.Build.Bindings var useCustomDelegateSignature = false; for (var i = 0; i < paramsCount; i++) { - var result = GenerateCSharpNativeToManaged(buildData, eventInfo.Type.GenericArgs[i], classInfo); - if (result[result.Length - 1] == '*') + var paramType = eventInfo.Type.GenericArgs[i]; + var result = GenerateCSharpNativeToManaged(buildData, paramType, classInfo); + if ((paramType.IsRef && !paramType.IsConst && paramType.IsPod(buildData, classInfo)) || result[result.Length - 1] == '*') useCustomDelegateSignature = true; CppParamsWrappersCache[i] = result; } @@ -596,8 +597,11 @@ namespace Flax.Build.Bindings contents.Append(indent).Append("public delegate void ").Append(eventInfo.Name).Append("Delegate("); for (var i = 0; i < paramsCount; i++) { + var paramType = eventInfo.Type.GenericArgs[i]; if (i != 0) contents.Append(", "); + if (paramType.IsRef && !paramType.IsConst && paramType.IsPod(buildData, classInfo)) + contents.Append("ref "); contents.Append(CppParamsWrappersCache[i]).Append(" arg").Append(i); } contents.Append(");").AppendLine().AppendLine(); @@ -668,9 +672,12 @@ namespace Flax.Build.Bindings contents.Append($"void Internal_{eventInfo.Name}_Invoke("); for (var i = 0; i < paramsCount; i++) { + var paramType = eventInfo.Type.GenericArgs[i]; if (i != 0) contents.Append(", "); contents.Append(CppParamsWrappersCache[i]); + if (paramType.IsRef && !paramType.IsConst && paramType.IsPod(buildData, classInfo)) + contents.Append("*"); contents.Append(" arg").Append(i); } contents.Append(')').AppendLine(); @@ -679,8 +686,11 @@ namespace Flax.Build.Bindings contents.Append('('); for (var i = 0; i < paramsCount; i++) { + var paramType = eventInfo.Type.GenericArgs[i]; if (i != 0) contents.Append(", "); + if (paramType.IsRef && !paramType.IsConst && paramType.IsPod(buildData, classInfo)) + contents.Append("ref *"); contents.Append("arg").Append(i); } contents.Append(");").AppendLine(); diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs index 721e58347..16ef34de8 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs @@ -73,7 +73,7 @@ namespace Flax.Build.Bindings return sb.ToString(); } - private static string GenerateCppWrapperNativeToManagedParam(BuildData buildData, StringBuilder contents, TypeInfo paramType, string paramName, ApiTypeInfo caller) + private static string GenerateCppWrapperNativeToManagedParam(BuildData buildData, StringBuilder contents, TypeInfo paramType, string paramName, ApiTypeInfo caller, bool isOut) { var nativeToManaged = GenerateCppWrapperNativeToManaged(buildData, paramType, caller, out var managedTypeAsNative, null); string result; @@ -96,7 +96,12 @@ namespace Flax.Build.Bindings else { result = paramName; - if (paramType.IsPtr || managedTypeAsNative[managedTypeAsNative.Length - 1] == '*') + if (paramType.IsRef && !paramType.IsConst && !isOut) + { + // Pass reference as a pointer + result = '&' + result; + } + else if (paramType.IsPtr || managedTypeAsNative[managedTypeAsNative.Length - 1] == '*') { // Pass pointer value } @@ -1038,7 +1043,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); + var paramValue = GenerateCppWrapperNativeToManagedParam(buildData, contents, parameterInfo.Type, parameterInfo.Name, classInfo, parameterInfo.IsOut); contents.Append($" params[{i}] = {paramValue};").AppendLine(); } @@ -1295,7 +1300,7 @@ namespace Flax.Build.Bindings { var paramType = eventInfo.Type.GenericArgs[i]; var paramName = "arg" + i; - var paramValue = GenerateCppWrapperNativeToManagedParam(buildData, contents, paramType, paramName, classInfo); + var paramValue = GenerateCppWrapperNativeToManagedParam(buildData, contents, paramType, paramName, classInfo, false); contents.Append($" params[{i}] = {paramValue};").AppendLine(); } if (eventInfo.IsStatic)