Browse Source

Fixed the generation of 'ToInternal' to check for null only fields of a ref type.

Part of the patch by @ddobrev.
pull/137/merge
triton 12 years ago
parent
commit
b5e947881b
  1. 27
      src/Generator/Generators/CLI/CLIMarshal.cs
  2. 18
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  3. 3
      tests/Basic/Basic.h

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

@ -3,6 +3,7 @@ using System.Text;
using CppSharp.AST; using CppSharp.AST;
using CppSharp.Types; using CppSharp.Types;
using Delegate = CppSharp.AST.Delegate; using Delegate = CppSharp.AST.Delegate;
using Type = CppSharp.AST.Type;
namespace CppSharp.Generators.CLI namespace CppSharp.Generators.CLI
{ {
@ -358,7 +359,7 @@ namespace CppSharp.Generators.CLI
public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals) public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals)
{ {
var pointee = pointer.Pointee; var pointee = pointer.Pointee.Desugar();
if ((pointee.IsPrimitiveType(PrimitiveType.Char) || if ((pointee.IsPrimitiveType(PrimitiveType.Char) ||
pointee.IsPrimitiveType(PrimitiveType.WideChar)) && pointee.IsPrimitiveType(PrimitiveType.WideChar)) &&
@ -382,8 +383,16 @@ namespace CppSharp.Generators.CLI
return VisitDelegateType(function, cppTypeName); return VisitDelegateType(function, cppTypeName);
} }
Class @class;
if (pointee.IsTagDecl(out @class) && @class.IsValueType)
{
if (Context.Function == null)
Context.Return.Write("&");
return pointee.Visit(this, quals);
}
PrimitiveType primitive; PrimitiveType primitive;
if (pointee.Desugar().IsPrimitiveType(out primitive)) if (pointee.IsPrimitiveType(out primitive))
{ {
var cppTypePrinter = new CppTypePrinter(Context.Driver.TypeDatabase); var cppTypePrinter = new CppTypePrinter(Context.Driver.TypeDatabase);
var cppTypeName = pointer.Visit(cppTypePrinter, quals); var cppTypeName = pointer.Visit(cppTypePrinter, quals);
@ -603,16 +612,22 @@ namespace CppSharp.Generators.CLI
if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore)) if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore))
Context.SupportBefore.Write(marshal.Context.SupportBefore); Context.SupportBefore.Write(marshal.Context.SupportBefore);
if(field.Type.IsPointer()) Type type;
Class @class;
var isRef = field.Type.IsPointerTo(out type) &&
!(type.IsTagDecl(out @class) && @class.IsValueType) &&
!type.IsPrimitiveType();
if (isRef)
{ {
Context.SupportBefore.WriteLine("if ({0} != nullptr)", fieldRef); Context.SupportBefore.WriteLine("if ({0} != nullptr)", fieldRef);
Context.SupportBefore.PushIndent(); Context.SupportBefore.PushIndent();
} }
Context.SupportBefore.WriteLine("{0}.{1} = {2};", marshalVar, field.OriginalName, Context.SupportBefore.WriteLine("{0}.{1} = {2};", marshalVar,
marshal.Context.Return); field.OriginalName, marshal.Context.Return);
if(field.Type.IsPointer()) if (isRef)
Context.SupportBefore.PopIndent(); Context.SupportBefore.PopIndent();
} }

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

@ -676,19 +676,25 @@ namespace CppSharp.Generators.CSharp
var marshal = new CSharpMarshalManagedToNativePrinter(marshalCtx); var marshal = new CSharpMarshalManagedToNativePrinter(marshalCtx);
field.Visit(marshal); field.Visit(marshal);
if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore)) Type type;
WriteLine(marshal.Context.SupportBefore); Class @class;
var isRef = field.Type.IsPointerTo(out type) &&
!(type.IsTagDecl(out @class) && @class.IsValueType) &&
!type.IsPrimitiveType();
if (field.Type.IsPointer()) if (isRef)
{ {
WriteLine("if ({0} != null)", field.Name); WriteLine("if ({0} != null)", field.Name);
PushIndent(); WriteStartBraceIndent();
} }
if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore))
WriteLine(marshal.Context.SupportBefore);
WriteLine("{0}.{1} = {2};", marshalVar, field.OriginalName, marshal.Context.Return); WriteLine("{0}.{1} = {2};", marshalVar, field.OriginalName, marshal.Context.Return);
if (field.Type.IsPointer()) if (isRef)
PopIndent(); WriteCloseBraceIndent();
} }
public bool ShouldGenerateClassNativeField(Class @class) public bool ShouldGenerateClassNativeField(Class @class)

3
tests/Basic/Basic.h

@ -64,6 +64,9 @@ struct DLL_API Bar2 : public Bar
operator FunctionPointerResolvedAsVoidStar() const { return 0; } operator FunctionPointerResolvedAsVoidStar() const { return 0; }
int C; int C;
Bar* pointerToStruct;
int* pointerToPrimitive;
Foo2* pointerToClass;
}; };
enum Enum enum Enum

Loading…
Cancel
Save