From 5f49a53636950bdb6d58af651f6c17fa945f6008 Mon Sep 17 00:00:00 2001 From: triton Date: Wed, 23 Jan 2013 15:21:10 +0000 Subject: [PATCH] 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. --- src/Generator/Generators/CLI/CLIMarshal.cs | 28 +++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/Generator/Generators/CLI/CLIMarshal.cs b/src/Generator/Generators/CLI/CLIMarshal.cs index d2a15a55..8a801f3c 100644 --- a/src/Generator/Generators/CLI/CLIMarshal.cs +++ b/src/Generator/Generators/CLI/CLIMarshal.cs @@ -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 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)