From c6995fed90d30e7f8d8a10c57f1dba97155fb651 Mon Sep 17 00:00:00 2001 From: triton Date: Sun, 26 May 2013 18:00:44 +0100 Subject: [PATCH] Simplified the marshaling code by just calling generated methods to do the marshaling instead of doing full marshaling in each instance. --- .../Generators/CSharp/CSharpMarshal.cs | 62 +--------------- .../Generators/CSharp/CSharpTextTemplate.cs | 73 +++++++++++++++++++ 2 files changed, 74 insertions(+), 61 deletions(-) diff --git a/src/Generator/Generators/CSharp/CSharpMarshal.cs b/src/Generator/Generators/CSharp/CSharpMarshal.cs index f618595f..8a556b31 100644 --- a/src/Generator/Generators/CSharp/CSharpMarshal.cs +++ b/src/Generator/Generators/CSharp/CSharpMarshal.cs @@ -391,67 +391,7 @@ namespace CppSharp.Generators.CSharp private void MarshalValueClass(Class @class) { - var marshalVar = Helpers.GeneratedIdentifier("marshal") - + Context.ParameterIndex++; - - Context.SupportBefore.WriteLine("var {0} = new {1}.Internal();", marshalVar, - @class.Name); - - MarshalValueClassFields(@class, marshalVar); - - Context.Return.Write(marshalVar); - } - - private void MarshalValueClassFields(Class @class, string marshalVar) - { - foreach (var @base in @class.Bases) - { - if (!@base.IsClass || @base.Class.Ignore) - continue; - - var baseClass = @base.Class; - MarshalValueClassFields(baseClass, marshalVar); - } - - foreach (var field in @class.Fields) - { - if (field.Ignore) - continue; - - MarshalValueClassField(field, marshalVar); - } - } - - private void MarshalValueClassField(Field field, string marshalVar) - { - var fieldRef = string.Format("{0}.{1}", Context.Parameter.Name, - field.Name); - - var marshalCtx = new CSharpMarshalContext(Context.Driver) - { - ArgName = fieldRef, - ParameterIndex = Context.ParameterIndex++ - }; - - var marshal = new CSharpMarshalManagedToNativePrinter(marshalCtx); - field.Visit(marshal); - - Context.ParameterIndex = marshalCtx.ParameterIndex; - - if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore)) - Context.SupportBefore.Write(marshal.Context.SupportBefore); - - if (field.Type.IsPointer()) - { - Context.SupportBefore.WriteLine("if ({0} != nullptr)", fieldRef); - Context.SupportBefore.PushIndent(); - } - - Context.SupportBefore.WriteLine("{0}.{1} = {2};", marshalVar, - field.OriginalName, marshal.Context.Return); - - if (field.Type.IsPointer()) - Context.SupportBefore.PopIndent(); + Context.Return.Write("{0}.ToInternal()", Helpers.SafeIdentifier(Context.Parameter.Name)); } public override bool VisitFieldDecl(Field field) diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 6133bb75..5eefa12d 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -376,6 +376,61 @@ namespace CppSharp.Generators.CSharp } } + private void GenerateStructInternalMarshaling(Class @class) + { + var marshalVar = Helpers.GeneratedIdentifier("native"); + + WriteLine("var {0} = new {1}.Internal();", marshalVar, @class.Name); + GenerateStructInternalMarshalingFields(@class, marshalVar); + + WriteLine("return {0};", marshalVar); + } + + private void GenerateStructInternalMarshalingFields(Class @class, string marshalVar) + { + foreach (var @base in @class.Bases) + { + if (!@base.IsClass || @base.Class.Ignore) + continue; + + var baseClass = @base.Class; + GenerateStructInternalMarshalingFields(baseClass, marshalVar); + } + + foreach (var field in @class.Fields) + { + if (field.Ignore) + continue; + + GenerateStructInternalMarshalingField(field, marshalVar); + } + } + + private void GenerateStructInternalMarshalingField(Field field, string marshalVar) + { + var marshalCtx = new CSharpMarshalContext(Driver) + { + ArgName = field.Name, + }; + + var marshal = new CSharpMarshalManagedToNativePrinter(marshalCtx); + field.Visit(marshal); + + if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore)) + WriteLine(marshal.Context.SupportBefore); + + if (field.Type.IsPointer()) + { + WriteLine("if ({0} != null)", field.Name); + PushIndent(); + } + + WriteLine("{0}.{1} = {2};", marshalVar, field.OriginalName, marshal.Context.Return); + + if (field.Type.IsPointer()) + PopIndent(); + } + public bool ShouldGenerateClassNativeField(Class @class) { if (!@class.IsRefType) @@ -806,6 +861,24 @@ namespace CppSharp.Generators.CSharp } WriteCloseBraceIndent(); + NeedNewLine(); + + if (@class.IsValueType) + { + NewLineIfNeeded(); + WriteLine("internal Internal ToInternal()"); + WriteStartBraceIndent(); + GenerateStructInternalMarshaling(@class); + WriteCloseBraceIndent(); + NewLine(); + + WriteLine("internal void FromInternal(Internal* native)"); + WriteStartBraceIndent(); + WriteLine("var {0} = {1};", Helpers.GeneratedIdentifier("ptr"), "native"); + GenerateStructMarshalingFields(@class); + WriteCloseBraceIndent(); + NeedNewLine(); + } } private bool GenerateClassConstructorBase(Class @class, Method method)