Browse Source

Added proper wrapping of value type method calls in the CLI backend.

pull/1/head
triton 12 years ago
parent
commit
6f7e7908e8
  1. 5
      src/Generator/Generators/CLI/CLIMarshal.cs
  2. 34
      src/Generator/Generators/CLI/CLISourcesTemplate.cs

5
src/Generator/Generators/CLI/CLIMarshal.cs

@ -503,9 +503,8 @@ namespace Cxxi.Generators.CLI @@ -503,9 +503,8 @@ namespace Cxxi.Generators.CLI
Context.Return.Write("{0}->NativePtr", Context.Parameter.Name);
}
private void MarshalValueClass(Class @class)
public void MarshalValueClass(Class @class)
{
var marshalVar = "_marshal" + Context.ParameterIndex++;
Context.SupportBefore.WriteLine("auto {0} = ::{1}();", marshalVar,
@ -519,7 +518,7 @@ namespace Cxxi.Generators.CLI @@ -519,7 +518,7 @@ namespace Cxxi.Generators.CLI
ArgumentPrefix.Write("&");
}
private void MarshalValueClassFields(Class @class, string marshalVar)
public void MarshalValueClassFields(Class @class, string marshalVar)
{
foreach (var @base in @class.Bases)
{

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

@ -447,19 +447,14 @@ namespace Cxxi.Generators.CLI @@ -447,19 +447,14 @@ namespace Cxxi.Generators.CLI
}
else
{
GenerateStructMarshaling(@class, nativePtr);
GenerateStructMarshaling(@class, nativePtr + "->");
}
WriteCloseBraceIndent();
NewLine();
}
private void GenerateStructMarshaling(Class @class, string nativePointer)
{
GenerateStructMarshalingFields(@class, nativePointer);
}
private void GenerateStructMarshalingFields(Class @class, string nativePointer)
private void GenerateStructMarshaling(Class @class, string nativeVar)
{
foreach (var @base in @class.Bases)
{
@ -467,15 +462,15 @@ namespace Cxxi.Generators.CLI @@ -467,15 +462,15 @@ namespace Cxxi.Generators.CLI
continue;
var baseClass = @base.Class;
GenerateStructMarshalingFields(baseClass, nativePointer);
GenerateStructMarshaling(baseClass, nativeVar);
}
foreach (var field in @class.Fields)
{
if (CheckIgnoreField(@class, field)) continue;
var nativeField = string.Format("{0}->{1}",
nativePointer, field.OriginalName);
var nativeField = string.Format("{0}{1}",
nativeVar, field.OriginalName);
var ctx = new MarshalContext(Driver)
{
@ -653,10 +648,20 @@ namespace Cxxi.Generators.CLI @@ -653,10 +648,20 @@ namespace Cxxi.Generators.CLI
var retType = function.ReturnType;
var needsReturn = !retType.IsPrimitiveType(PrimitiveType.Void);
const string valueMarshalName = "_this0";
var isValueType = @class != null && @class.IsValueType;
if (isValueType)
{
WriteLine("auto this0 = (::{0}*) 0;", @class.QualifiedOriginalName);
WriteLine("auto {0} = ::{1}();", valueMarshalName, @class.QualifiedOriginalName);
var param = new Parameter() { Name = "(*this)" };
var ctx = new MarshalContext(Driver) { Parameter = param };
var marshal = new CLIMarshalManagedToNativePrinter(ctx);
marshal.MarshalValueClassFields(@class, valueMarshalName);
if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore))
Write(marshal.Context.SupportBefore);
}
var @params = GenerateFunctionParamsMarshal(function.Parameters, function);
@ -666,7 +671,7 @@ namespace Cxxi.Generators.CLI @@ -666,7 +671,7 @@ namespace Cxxi.Generators.CLI
if (isValueType)
{
Write("this0->");
Write("{0}.", valueMarshalName);
}
else if (IsInstanceFunction(function))
{
@ -710,6 +715,11 @@ namespace Cxxi.Generators.CLI @@ -710,6 +715,11 @@ namespace Cxxi.Generators.CLI
WriteLine("{0} = {1};",param.Name,marshal.Context.Return);
}
if (isValueType)
{
GenerateStructMarshaling(@class, valueMarshalName + ".");
}
if (needsReturn)
{
var ctx = new MarshalContext(Driver)

Loading…
Cancel
Save