Browse Source

Recursive Marshaling of value class fields

pull/1/head
marcos henrich 13 years ago
parent
commit
874ea01b0e
  1. 59
      src/Generator/Generators/CLI/CLIMarshal.cs

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

@ -541,34 +541,53 @@ namespace Cxxi.Generators.CLI @@ -541,34 +541,53 @@ namespace Cxxi.Generators.CLI
@class.QualifiedOriginalName);
SupportBefore.PushIndent();
foreach (var field in @class.Fields)
{
var fieldRef = string.Format("{0}.{1}", Context.Parameter.Name,
field.Name);
MarshalValueClassFields(@class, marshalVar);
var marshalCtx = new MarshalContext(Context.Driver)
{
ArgName = fieldRef,
ParameterIndex = Context.ParameterIndex++
};
Return.Write(marshalVar);
var marshal = new CLIMarshalManagedToNativePrinter(TypeMapDatabase,
marshalCtx);
field.Visit(marshal);
if (Context.Parameter.Type.IsPointer())
ArgumentPrefix.Write("&");
}
Context.ParameterIndex = marshalCtx.ParameterIndex;
private void MarshalValueClassFields(Class @class, string marshalVar)
{
foreach (var @base in @class.Bases)
{
if (!@base.IsClass || @base.Class.Ignore)
continue;
if (!string.IsNullOrWhiteSpace(marshal.SupportBefore))
SupportBefore.WriteLine(marshal.SupportBefore);
var baseClass = @base.Class;
MarshalValueClassFields(baseClass, marshalVar);
}
SupportBefore.WriteLine("{0}.{1} = {2};", marshalVar, field.OriginalName,
marshal.Return);
foreach (var field in @class.Fields)
{
MarshalValueClassField(field, marshalVar);
}
}
Return.Write(marshalVar);
private void MarshalValueClassField(Field field, string marshalVar)
{
var fieldRef = string.Format("{0}.{1}", Context.Parameter.Name,
field.Name);
if (Context.Parameter.Type.IsPointer())
ArgumentPrefix.Write("&");
var marshalCtx = new MarshalContext(Context.Driver)
{
ArgName = fieldRef,
ParameterIndex = Context.ParameterIndex++
};
var marshal = new CLIMarshalManagedToNativePrinter(TypeMapDatabase,
marshalCtx);
field.Visit(marshal);
Context.ParameterIndex = marshalCtx.ParameterIndex;
if (!string.IsNullOrWhiteSpace(marshal.SupportBefore))
SupportBefore.WriteLine(marshal.SupportBefore);
SupportBefore.WriteLine("{0}.{1} = {2};", marshalVar, field.OriginalName,
marshal.Return);
}
public bool VisitFieldDecl(Field field)

Loading…
Cancel
Save