From 874ea01b0e64368741c37b760e1e9f2c443cb210 Mon Sep 17 00:00:00 2001 From: marcos henrich Date: Fri, 22 Mar 2013 20:47:04 +0000 Subject: [PATCH] Recursive Marshaling of value class fields --- src/Generator/Generators/CLI/CLIMarshal.cs | 59 ++++++++++++++-------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/src/Generator/Generators/CLI/CLIMarshal.cs b/src/Generator/Generators/CLI/CLIMarshal.cs index 597f232b..6603b52a 100644 --- a/src/Generator/Generators/CLI/CLIMarshal.cs +++ b/src/Generator/Generators/CLI/CLIMarshal.cs @@ -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)