Browse Source

Simplified the marshaling code by just calling generated methods to do the marshaling instead of doing full marshaling in each instance.

pull/1/head
triton 12 years ago
parent
commit
c6995fed90
  1. 62
      src/Generator/Generators/CSharp/CSharpMarshal.cs
  2. 73
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs

62
src/Generator/Generators/CSharp/CSharpMarshal.cs

@ -391,67 +391,7 @@ namespace CppSharp.Generators.CSharp @@ -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)

73
src/Generator/Generators/CSharp/CSharpTextTemplate.cs

@ -376,6 +376,61 @@ namespace CppSharp.Generators.CSharp @@ -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 @@ -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)

Loading…
Cancel
Save