Browse Source

Improved the marshaling of value class method parameters.

pull/1/head
triton 13 years ago
parent
commit
2d4f09f171
  1. 72
      src/Generator/Generators/CLI/CLISourcesTemplate.cs

72
src/Generator/Generators/CLI/CLISourcesTemplate.cs

@ -180,6 +180,11 @@ namespace Cxxi.Generators.CLI @@ -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 @@ -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 @@ -244,18 +275,24 @@ namespace Cxxi.Generators.CLI
}
}
public List<string> GenerateFunctionParamsMarshal(Function function)
public struct ParamMarshal
{
var @params = new List<string>();
public string Name;
public Parameter Param;
}
// Do marshalling of parameters
public List<ParamMarshal> GenerateFunctionParamsMarshal(Function function)
{
var @params = new List<ParamMarshal>();
// 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 @@ -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<string> @params)
public void GenerateFunctionParams(Function function, List<ParamMarshal> @params)
{
for (var i = 0; i < @params.Count; ++i)
{
var param = @params[i];
Write(param);
Write(param.Name);
if (i < @params.Count - 1)
Write(", ");

Loading…
Cancel
Save