Browse Source

Extract the logic of managed to native marshaling of classes into methods.

pull/1/head
triton 13 years ago
parent
commit
f7c2275b59
  1. 89
      src/Generator/Generators/CLI/CLIMarshal.cs

89
src/Generator/Generators/CLI/CLIMarshal.cs

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

Loading…
Cancel
Save