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
@class.QualifiedOriginalName); @class.QualifiedOriginalName);
SupportBefore.PushIndent(); SupportBefore.PushIndent();
foreach (var field in @class.Fields) MarshalValueClassFields(@class, marshalVar);
{
var fieldRef = string.Format("{0}.{1}", Context.Parameter.Name,
field.Name);
var marshalCtx = new MarshalContext(Context.Driver) Return.Write(marshalVar);
{
ArgName = fieldRef,
ParameterIndex = Context.ParameterIndex++
};
var marshal = new CLIMarshalManagedToNativePrinter(TypeMapDatabase, if (Context.Parameter.Type.IsPointer())
marshalCtx); ArgumentPrefix.Write("&");
field.Visit(marshal); }
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)) var baseClass = @base.Class;
SupportBefore.WriteLine(marshal.SupportBefore); MarshalValueClassFields(baseClass, marshalVar);
}
SupportBefore.WriteLine("{0}.{1} = {2};", marshalVar, field.OriginalName, foreach (var field in @class.Fields)
marshal.Return); {
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()) var marshalCtx = new MarshalContext(Context.Driver)
ArgumentPrefix.Write("&"); {
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) public bool VisitFieldDecl(Field field)

Loading…
Cancel
Save