From 279c9c83cf316e90f04a0d6c59472a61581bf092 Mon Sep 17 00:00:00 2001 From: triton Date: Mon, 2 Sep 2013 21:14:35 +0100 Subject: [PATCH] Fixed wrapping of null pointers to actually return null CLR references. --- src/Generator/Generators/CLI/CLISourcesTemplate.cs | 10 ++++++++++ .../Generators/CSharp/CSharpTextTemplate.cs | 12 ++++++++++++ tests/Basic/Basic.cpp | 5 +++++ tests/Basic/Basic.h | 1 + 4 files changed, 28 insertions(+) diff --git a/src/Generator/Generators/CLI/CLISourcesTemplate.cs b/src/Generator/Generators/CLI/CLISourcesTemplate.cs index 6625d2a6..13ddc025 100644 --- a/src/Generator/Generators/CLI/CLISourcesTemplate.cs +++ b/src/Generator/Generators/CLI/CLISourcesTemplate.cs @@ -809,6 +809,16 @@ namespace CppSharp.Generators.CLI 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) { ArgName = Generator.GeneratedIdentifier("ret"), diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 9b0e70ff..d4eb1dbd 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -1672,6 +1672,18 @@ namespace CppSharp.Generators.CSharp 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) { ArgName = GeneratedIdentifier("ret"), diff --git a/tests/Basic/Basic.cpp b/tests/Basic/Basic.cpp index 74fcfd40..c40f65b5 100644 --- a/tests/Basic/Basic.cpp +++ b/tests/Basic/Basic.cpp @@ -85,6 +85,11 @@ int Hello::RetEnum(Enum e) return (int)e; } +Hello* Hello::RetNull() +{ + return 0; +} + int unsafeFunction(const Bar& ret, char* testForString, void (*foo)(int)) { return ret.A; diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index bf48e043..4228e2fd 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -77,6 +77,7 @@ public: int AddBar2(Bar2); int RetEnum(Enum); + Hello* RetNull(); }; DLL_API Bar operator-(const Bar &);