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
} }
else else
{ {
//if (!Context.Parameter.Type.IsPointer()) SupportAfter.PushIndent();
// Return = "*";
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); Return.Write("::{0}()", @class.QualifiedOriginalName);
if (Context.Parameter.Type.IsPointer())
ArgumentPrefix.Write("&");
} }
} }
else else
@ -427,7 +444,12 @@ namespace Cxxi.Generators.CLI
public bool VisitFieldDecl(Field field) 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) public bool VisitFunctionDecl(Function function)

Loading…
Cancel
Save