From 40954f202bfd9d4cdefa58d2a488ea52f51ed711 Mon Sep 17 00:00:00 2001 From: marcos henrich Date: Tue, 26 Mar 2013 13:52:24 +0000 Subject: [PATCH] Added code generation support to out parameters --- .../Generators/CLI/CLISourcesTemplate.cs | 70 ++++++++++++++----- .../Generators/CLI/CLITypePrinter.cs | 14 +++- 2 files changed, 66 insertions(+), 18 deletions(-) diff --git a/src/Generator/Generators/CLI/CLISourcesTemplate.cs b/src/Generator/Generators/CLI/CLISourcesTemplate.cs index 692ab231..7a090b7a 100644 --- a/src/Generator/Generators/CLI/CLISourcesTemplate.cs +++ b/src/Generator/Generators/CLI/CLISourcesTemplate.cs @@ -668,6 +668,30 @@ namespace Cxxi.Generators.CLI GenerateFunctionParams(@params); WriteLine(");"); + foreach(var paramInfo in @params) + { + var param = paramInfo.Param; + if(param.Usage != ParameterUsage.Out && param.Usage != ParameterUsage.Ref) + continue; + + var nativeVarName = paramInfo.Name; + + var ctx = new MarshalContext(Driver) + { + ArgName = nativeVarName, + ReturnVarName = nativeVarName, + ReturnType = param.Type + }; + + var marshal = new CLIMarshalNativeToManagedPrinter(ctx); + param.Visit(marshal); + + if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore)) + Write(marshal.Context.SupportBefore); + + WriteLine("{0} = {1};",param.Name,marshal.Context.Return); + } + if (needsReturn) { var ctx = new MarshalContext(Driver) @@ -728,28 +752,42 @@ namespace Cxxi.Generators.CLI var argName = "arg" + paramIndex.ToString(CultureInfo.InvariantCulture); - var ctx = new MarshalContext(Driver) - { - Parameter = param, - ParameterIndex = paramIndex, - ArgName = argName, - Function = function - }; + if (param.Usage == ParameterUsage.Out) + { + var paramType = param.Type; + if (paramType.IsReference()) + paramType = (paramType as PointerType).Pointee; - var marshal = new CLIMarshalManagedToNativePrinter(ctx); + var typePrinter = new CppTypePrinter(Driver.TypeDatabase); + var type = paramType.Visit(typePrinter); - param.Visit(marshal); + WriteLine("{0} {1};", type, argName); + } + else + { + var ctx = new MarshalContext(Driver) + { + Parameter = param, + ParameterIndex = paramIndex, + ArgName = argName, + Function = function + }; - if (string.IsNullOrEmpty(marshal.Context.Return)) - throw new Exception("Cannot marshal argument of function"); + var marshal = new CLIMarshalManagedToNativePrinter(ctx); - if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore)) - Write(marshal.Context.SupportBefore); + param.Visit(marshal); + + if (string.IsNullOrEmpty(marshal.Context.Return)) + throw new Exception("Cannot marshal argument of function"); - WriteLine("auto {0}{1} = {2};", marshal.VarPrefix, argName, marshal.Context.Return); + if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore)) + Write(marshal.Context.SupportBefore); + + WriteLine("auto {0}{1} = {2};", marshal.VarPrefix, argName, marshal.Context.Return); + argName = marshal.ArgumentPrefix + argName; + } - var argText = marshal.ArgumentPrefix + argName; - return new ParamMarshal {Name = argText, Param = param}; + return new ParamMarshal {Name = argName, Param = param}; } public void GenerateFunctionParams(List @params) diff --git a/src/Generator/Generators/CLI/CLITypePrinter.cs b/src/Generator/Generators/CLI/CLITypePrinter.cs index 713df030..05b6852e 100644 --- a/src/Generator/Generators/CLI/CLITypePrinter.cs +++ b/src/Generator/Generators/CLI/CLITypePrinter.cs @@ -120,11 +120,21 @@ namespace Cxxi.Generators.CLI { var type = param.Type.Visit(this, param.QualifiedType.Qualifiers); var name = param.Name; + var str = ""; + if(param.Usage == ParameterUsage.Out) + str += "[System::Runtime::InteropServices::Out] "; + + str += type; + + if(param.Usage == ParameterUsage.Out || + param.Usage == ParameterUsage.Ref) + str += "%"; + if (hasName && !string.IsNullOrEmpty(name)) - return string.Format("{0} {1}", type, name); + str += " " + name; - return type; + return str; } public string VisitDelegate(FunctionType function)