Browse Source

Rework how the struct marshaling from managed to native is done. Now we marshal each field explicitly instead of assuming the struct is made of blittable types.

pull/1/head
triton 13 years ago
parent
commit
5f49a53636
  1. 28
      src/Generator/Generators/CLI/CLIMarshal.cs

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

@ -407,11 +407,28 @@ namespace Cxxi.Generators.CLI @@ -407,11 +407,28 @@ namespace Cxxi.Generators.CLI
}
else
{
//if (!Context.Parameter.Type.IsPointer())
// Return = "*";
SupportAfter.PushIndent();
foreach (var field in @class.Fields)
{
SupportAfter.Write("{0}.{1} = ", Context.ArgName,
field.OriginalName);
var fieldRef = string.Format("{0}.{1}", Context.Parameter.Name,
field.Name);
var marshalCtx = new MarshalContext() { ArgName = fieldRef };
var marshal = new CLIMarshalManagedToNativePrinter(Generator,
marshalCtx);
field.Visit(marshal);
SupportAfter.WriteLine("{0};", marshal.Return);
}
Return.Write("::{0}()", @class.QualifiedOriginalName);
if (Context.Parameter.Type.IsPointer())
ArgumentPrefix.Write("&");
}
}
else
@ -427,7 +444,12 @@ namespace Cxxi.Generators.CLI @@ -427,7 +444,12 @@ namespace Cxxi.Generators.CLI
public bool VisitFieldDecl(Field field)
{
throw new NotImplementedException();
Context.Parameter = new Parameter
{
Name = Context.ArgName, Type = field.Type
};
return field.Type.Visit(this);
}
public bool VisitFunctionDecl(Function function)

Loading…
Cancel
Save