Browse Source

Fixed wrapping of null pointers to actually return null CLR references.

pull/53/merge
triton 13 years ago
parent
commit
279c9c83cf
  1. 10
      src/Generator/Generators/CLI/CLISourcesTemplate.cs
  2. 12
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  3. 5
      tests/Basic/Basic.cpp
  4. 1
      tests/Basic/Basic.h

10
src/Generator/Generators/CLI/CLISourcesTemplate.cs

@ -809,6 +809,16 @@ namespace CppSharp.Generators.CLI
if (needsReturn) if (needsReturn)
{ {
var retTypeName = retType.Visit(TypePrinter);
var isIntPtr = retTypeName.Contains("IntPtr");
if (retType.Type.IsPointer() && (isIntPtr || retTypeName.EndsWith("^")))
{
WriteLine("if ({0} == nullptr) return {1};",
Generator.GeneratedIdentifier("ret"),
isIntPtr ? "System::IntPtr()" : "nullptr");
}
var ctx = new MarshalContext(Driver) var ctx = new MarshalContext(Driver)
{ {
ArgName = Generator.GeneratedIdentifier("ret"), ArgName = Generator.GeneratedIdentifier("ret"),

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

@ -1672,6 +1672,18 @@ namespace CppSharp.Generators.CSharp
if (needsReturn) if (needsReturn)
{ {
TypePrinter.PushContext(CSharpTypePrinterContextKind.Native);
var retTypeName = retType.CSharpType(TypePrinter).Type;
TypePrinter.PopContext();
var isIntPtr = retTypeName.Contains("IntPtr");
if (retType.Type.IsPointer() && isIntPtr)
{
WriteLine("if ({0} == global::System.IntPtr.Zero) return null;",
Generator.GeneratedIdentifier("ret"));
}
var ctx = new CSharpMarshalContext(Driver) var ctx = new CSharpMarshalContext(Driver)
{ {
ArgName = GeneratedIdentifier("ret"), ArgName = GeneratedIdentifier("ret"),

5
tests/Basic/Basic.cpp

@ -85,6 +85,11 @@ int Hello::RetEnum(Enum e)
return (int)e; return (int)e;
} }
Hello* Hello::RetNull()
{
return 0;
}
int unsafeFunction(const Bar& ret, char* testForString, void (*foo)(int)) int unsafeFunction(const Bar& ret, char* testForString, void (*foo)(int))
{ {
return ret.A; return ret.A;

1
tests/Basic/Basic.h

@ -77,6 +77,7 @@ public:
int AddBar2(Bar2); int AddBar2(Bar2);
int RetEnum(Enum); int RetEnum(Enum);
Hello* RetNull();
}; };
DLL_API Bar operator-(const Bar &); DLL_API Bar operator-(const Bar &);

Loading…
Cancel
Save