diff --git a/src/Generator/Generators/CLI/CLISourcesTemplate.cs b/src/Generator/Generators/CLI/CLISourcesTemplate.cs index e7634702..2708e309 100644 --- a/src/Generator/Generators/CLI/CLISourcesTemplate.cs +++ b/src/Generator/Generators/CLI/CLISourcesTemplate.cs @@ -180,6 +180,11 @@ namespace Cxxi.Generators.CLI GenerateFunctionCall(method); } } + else if (@class.IsValueType) + { + if (method.Kind != CXXMethodKind.Constructor) + GenerateFunctionCall(method, @class); + } PopIndent(); WriteLine("}"); @@ -213,30 +218,56 @@ namespace Cxxi.Generators.CLI WriteLine("}"); } - public void GenerateFunctionCall(Function function) + public void GenerateFunctionCall(Function function, Class @class = null) { var retType = function.ReturnType; var needsReturn = !retType.IsPrimitiveType(PrimitiveType.Void); + var isValueType = @class != null && @class.IsValueType; + if (isValueType) + { + WriteLine("auto this0 = (::{0}*) 0;", @class.QualifiedOriginalName); + } + var @params = GenerateFunctionParamsMarshal(function); if (needsReturn) Write("auto ret = "); - if (function is Method) - Write("NativePtr->"); + if (function.ReturnType.IsReference() && !isValueType) + { + Write("&"); + } + + if (isValueType) + { + Write("this0->"); + Write("{0}(", function.QualifiedOriginalName); + GenerateFunctionParams(function, @params); + WriteLine(");"); + } else - Write("::"); + { + if (function is Method) + Write("NativePtr->"); + else + Write("::"); - Write("{0}(", function.QualifiedOriginalName); - GenerateFunctionParams(function, @params); - WriteLine(");"); + Write("{0}(", function.QualifiedOriginalName); + GenerateFunctionParams(function, @params); + WriteLine(");"); + } if (needsReturn) { Write("return "); - var ctx = new MarshalContext() { ReturnVarName = "ret" }; + var ctx = new MarshalContext() + { + ReturnVarName = "ret", + ReturnType = retType + }; + var marshal = new CLIMarshalNativeToManagedPrinter(Generator, ctx); function.ReturnType.Visit(marshal); @@ -244,18 +275,24 @@ namespace Cxxi.Generators.CLI } } - public List GenerateFunctionParamsMarshal(Function function) + public struct ParamMarshal { - var @params = new List(); + public string Name; + public Parameter Param; + } - // Do marshalling of parameters + public List GenerateFunctionParamsMarshal(Function function) + { + var @params = new List(); + + // Do marshaling of parameters for (var i = 0; i < function.Parameters.Count; ++i) { var param = function.Parameters[i]; if (param.Type is BuiltinType) { - @params.Add(param.Name); + @params.Add(new ParamMarshal {Name = param.Name, Param = param}); } else { @@ -270,20 +307,23 @@ namespace Cxxi.Generators.CLI if (!string.IsNullOrWhiteSpace(marshal.Support)) WriteLine(marshal.Support); - WriteLine("auto {0} = {1};", argName, marshal.Return); - @params.Add(argName); + Write("auto {0} = ", argName); + WriteLine("{0};", marshal.Return); + + @params.Add(new ParamMarshal { Name = argName, Param = param }); } } return @params; } - public void GenerateFunctionParams(Function function, List @params) + public void GenerateFunctionParams(Function function, List @params) { for (var i = 0; i < @params.Count; ++i) { var param = @params[i]; - Write(param); + + Write(param.Name); if (i < @params.Count - 1) Write(", ");