diff --git a/src/Generator/Generators/CLI/CLIMarshal.cs b/src/Generator/Generators/CLI/CLIMarshal.cs index 03cc8609..2a9329ac 100644 --- a/src/Generator/Generators/CLI/CLIMarshal.cs +++ b/src/Generator/Generators/CLI/CLIMarshal.cs @@ -413,58 +413,69 @@ namespace Cxxi.Generators.CLI { if (@class.IsValueType) { - if (Context.Parameter.Type.IsReference()) - { - var argName = string.Format("_{0}", Context.ArgName); - SupportBefore.Write("auto {0} = (::{1}*)&{2};", - argName, @class.OriginalName, - Context.Parameter.Name); - Return.Write("*{0}", argName); - } - else - { - SupportAfter.PushIndent(); - - foreach (var field in @class.Fields) - { - SupportAfter.Write("{0}.{1} = ", Context.ArgName, - field.OriginalName); + MarshalValueClass(@class); + } + else + { + if (MarshalRefClass()) return true; + } - var fieldRef = string.Format("{0}.{1}", Context.Parameter.Name, - field.Name); + return true; + } - var marshalCtx = new MarshalContext() { ArgName = fieldRef }; - var marshal = new CLIMarshalManagedToNativePrinter(TypeMapDatabase, - marshalCtx); - field.Visit(marshal); + private bool MarshalRefClass() + { + if (!Context.Parameter.Type.IsPointer()) + Return.Write("*"); - SupportAfter.WriteLine("{0};", marshal.Return); - } + var method = Context.Function as Method; + if (method != null + && method.Conversion == MethodConversionKind.FunctionToInstanceMethod + && Context.ParameterIndex == 0) + { + Return.Write("NativePtr"); + return true; + } - Return.Write("::{0}()", @class.QualifiedOriginalName); + Return.Write("{0}->NativePtr", Context.Parameter.Name); + return false; + } - if (Context.Parameter.Type.IsPointer()) - ArgumentPrefix.Write("&"); - } + private void MarshalValueClass(Class @class) + { + if (Context.Parameter.Type.IsReference()) + { + var argName = string.Format("_{0}", Context.ArgName); + SupportBefore.Write("auto {0} = (::{1}*)&{2};", + argName, @class.OriginalName, + Context.Parameter.Name); + Return.Write("*{0}", argName); } else { - if (!Context.Parameter.Type.IsPointer()) - Return.Write("*"); + SupportAfter.PushIndent(); - var method = Context.Function as Method; - if (method != null - && method.Conversion == MethodConversionKind.FunctionToInstanceMethod - && Context.ParameterIndex == 0) + foreach (var field in @class.Fields) { - Return.Write("NativePtr"); - return true; + 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(TypeMapDatabase, + marshalCtx); + field.Visit(marshal); + + SupportAfter.WriteLine("{0};", marshal.Return); } - Return.Write("{0}->NativePtr", Context.Parameter.Name); - } + Return.Write("::{0}()", @class.QualifiedOriginalName); - return true; + if (Context.Parameter.Type.IsPointer()) + ArgumentPrefix.Write("&"); + } } public bool VisitFieldDecl(Field field)