From 8ffc86ef881d0c82ebea99111e19f71bbc243656 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 28 Nov 2023 11:20:07 +0100 Subject: [PATCH] Fix missing output parameters conversion when calling interface implementation in scripting #1992 --- .../Bindings/BindingsGenerator.Cpp.cs | 22 +++++++++++++------ Source/Tools/Flax.Build/Bindings/TypeInfo.cs | 11 +++++++--- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs index 63cf9d2f8..2c5d967f8 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs @@ -1532,9 +1532,7 @@ namespace Flax.Build.Bindings if (paramIsRef && !parameterInfo.Type.IsConst) { // Unbox from MObject* - parameterInfo.Type.IsRef = false; - contents.Append($" {parameterInfo.Name} = MUtils::Unbox<{parameterInfo.Type}>(*(MObject**)params[{i}]);").AppendLine(); - parameterInfo.Type.IsRef = true; + contents.Append($" {parameterInfo.Name} = MUtils::Unbox<{parameterInfo.Type.ToString(false)}>(*(MObject**)params[{i}]);").AppendLine(); } } } @@ -1559,8 +1557,7 @@ namespace Flax.Build.Bindings for (var i = 0; i < functionInfo.Parameters.Count; i++) { var parameterInfo = functionInfo.Parameters[i]; - var paramIsRef = parameterInfo.IsRef || parameterInfo.IsOut; - if (paramIsRef && !parameterInfo.Type.IsConst) + if (parameterInfo.IsRef || parameterInfo.IsOut && !parameterInfo.Type.IsConst) { // Direct value convert var managedToNative = GenerateCppWrapperManagedToNative(buildData, parameterInfo.Type, classInfo, out var managedType, out var apiType, null, out _); @@ -2007,8 +2004,7 @@ namespace Flax.Build.Bindings for (var i = 0; i < paramsCount; i++) { var paramType = eventInfo.Type.GenericArgs[i]; - var paramIsRef = paramType.IsRef && !paramType.IsConst; - if (paramIsRef) + if (paramType.IsRef && !paramType.IsConst) { // Convert value back from managed to native (could be modified there) paramType.IsRef = false; @@ -2569,6 +2565,18 @@ namespace Flax.Build.Bindings contents.AppendLine(" {"); contents.AppendLine(" Variant __result;"); contents.AppendLine($" typeHandle.Module->InvokeMethod(method, Object, Span(parameters, {functionInfo.Parameters.Count}), __result);"); + + // Convert parameter values back from scripting to native (could be modified there) + for (var i = 0; i < functionInfo.Parameters.Count; i++) + { + var parameterInfo = functionInfo.Parameters[i]; + var paramIsRef = parameterInfo.IsRef || parameterInfo.IsOut; + if (paramIsRef && !parameterInfo.Type.IsConst) + { + contents.AppendLine($" {parameterInfo.Name} = {GenerateCppWrapperVariantToNative(buildData, parameterInfo.Type, interfaceInfo, $"parameters[{i}]")};"); + } + } + if (functionInfo.ReturnType.IsVoid) contents.AppendLine(" return;"); else diff --git a/Source/Tools/Flax.Build/Bindings/TypeInfo.cs b/Source/Tools/Flax.Build/Bindings/TypeInfo.cs index e3bbfb6a1..cdf293085 100644 --- a/Source/Tools/Flax.Build/Bindings/TypeInfo.cs +++ b/Source/Tools/Flax.Build/Bindings/TypeInfo.cs @@ -180,7 +180,7 @@ namespace Flax.Build.Bindings return sb.ToString(); } - public override string ToString() + public string ToString(bool canRef = true) { var sb = new StringBuilder(64); if (IsConst) @@ -199,13 +199,18 @@ namespace Flax.Build.Bindings } if (IsPtr) sb.Append('*'); - if (IsRef) + if (IsRef && canRef) sb.Append('&'); - if (IsMoveRef) + if (IsMoveRef && canRef) sb.Append('&'); return sb.ToString(); } + public override string ToString() + { + return ToString(true); + } + public static bool Equals(List a, List b) { if (a == null && b == null)