From 5e63406de082680bc5b3877edf3c1f7da104d850 Mon Sep 17 00:00:00 2001 From: Tom Spilman Date: Wed, 28 May 2014 21:10:40 -0500 Subject: [PATCH 1/4] Added tests for out enums. --- tests/Basic/Basic.Tests.cs | 22 ++++++++++++++++++++++ tests/Basic/Basic.cpp | 10 ++++++++++ tests/Basic/Basic.cs | 2 ++ tests/Basic/Basic.h | 3 +++ 4 files changed, 37 insertions(+) diff --git a/tests/Basic/Basic.Tests.cs b/tests/Basic/Basic.Tests.cs index dcf25e84..63011321 100644 --- a/tests/Basic/Basic.Tests.cs +++ b/tests/Basic/Basic.Tests.cs @@ -77,6 +77,28 @@ public class BasicTests : GeneratorTestFixture Assert.That(f, Is.EqualTo(10.0f)); } + [Test] + public void TestEnumOut() + { + var hello = new Hello(); + + int value = (int)Enum.C; + Enum e; + hello.EnumOut(value, out e); + Assert.That(e, Is.EqualTo(value)); + } + + [Test] + public void TestEnumOutRef() + { + var hello = new Hello(); + + int value = (int)Enum.C; + Enum e; + hello.EnumOutRef(value, out e); + Assert.That(e, Is.EqualTo(value)); + } + [Test] public void TestNullRef() { diff --git a/tests/Basic/Basic.cpp b/tests/Basic/Basic.cpp index 48547de4..b3e674fd 100644 --- a/tests/Basic/Basic.cpp +++ b/tests/Basic/Basic.cpp @@ -169,6 +169,16 @@ bool Hello::TestPrimitiveOutRef(CS_OUT float& f) return true; } +void Hello::EnumOut(int value, CS_OUT Enum* e) +{ + *e = (Enum)value; +} + +void Hello::EnumOutRef(int value, CS_OUT Enum& e) +{ + e = (Enum)value; +} + int unsafeFunction(const Bar& ret, char* testForString, void (*foo)(int)) { return ret.A; diff --git a/tests/Basic/Basic.cs b/tests/Basic/Basic.cs index fbf14581..e6615279 100644 --- a/tests/Basic/Basic.cs +++ b/tests/Basic/Basic.cs @@ -31,6 +31,8 @@ namespace CppSharp.Tests ctx.SetClassAsValueType("Bar2"); ctx.SetMethodParameterUsage("Hello", "TestPrimitiveOut", 1, ParameterUsage.Out); ctx.SetMethodParameterUsage("Hello", "TestPrimitiveOutRef", 1, ParameterUsage.Out); + ctx.SetMethodParameterUsage("Hello", "EnumOut", 2, ParameterUsage.Out); + ctx.SetMethodParameterUsage("Hello", "EnumOutRef", 2, ParameterUsage.Out); } public static void Main(string[] args) diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index cebe6778..746d0f33 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -123,6 +123,9 @@ public: bool TestPrimitiveOut(CS_OUT float* f); bool TestPrimitiveOutRef(CS_OUT float& f); + + void EnumOut(int value, CS_OUT Enum* e); + void EnumOutRef(int value, CS_OUT Enum& e); }; class DLL_API AbstractFoo From f60d2671686d1104cea69a3a8032c614f231ba00 Mon Sep 17 00:00:00 2001 From: Tom Spilman Date: Wed, 28 May 2014 21:14:44 -0500 Subject: [PATCH 2/4] This fixes out or in/out enum parameters to generate correctly. --- src/Generator/Generators/CSharp/CSharpMarshal.cs | 4 ++-- src/Generator/Generators/CSharp/CSharpTypePrinter.cs | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Generator/Generators/CSharp/CSharpMarshal.cs b/src/Generator/Generators/CSharp/CSharpMarshal.cs index da536cd2..19b2deae 100644 --- a/src/Generator/Generators/CSharp/CSharpMarshal.cs +++ b/src/Generator/Generators/CSharp/CSharpMarshal.cs @@ -149,7 +149,7 @@ namespace CppSharp.Generators.CSharp } PrimitiveType primitive; - if (pointee.IsPrimitiveType(out primitive)) + if (pointee.IsPrimitiveType(out primitive) || pointee.IsEnumType()) { var param = Context.Parameter; if (param != null && (param.IsOut || param.IsInOut)) @@ -462,7 +462,7 @@ namespace CppSharp.Generators.CSharp } PrimitiveType primitive; - if (pointee.IsPrimitiveType(out primitive)) + if (pointee.IsPrimitiveType(out primitive) || pointee.IsEnumType()) { var param = Context.Parameter; diff --git a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs index 2d2989ff..80a400b4 100644 --- a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs +++ b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs @@ -232,7 +232,13 @@ namespace CppSharp.Generators.CSharp Enumeration @enum; if (desugared.TryGetEnum(out @enum)) { - return @enum.Name + "*"; + // Skip one indirection if passed by reference + var param = Context.Parameter; + if (isManagedContext && param != null && (param.IsOut || param.IsInOut) + && pointee == finalPointee) + return pointee.Visit(this, quals); + + return pointee.Visit(this, quals) + "*"; } Class @class; From ba4eedd131503bc3f50b4d47b61a256c5aa2b957 Mon Sep 17 00:00:00 2001 From: Tom Spilman Date: Thu, 29 May 2014 17:56:50 -0500 Subject: [PATCH 3/4] Fixed CLI to support out/inout Enums. --- src/Generator/Generators/CLI/CLITypePrinter.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Generator/Generators/CLI/CLITypePrinter.cs b/src/Generator/Generators/CLI/CLITypePrinter.cs index efb7bee9..c4c7c4a1 100644 --- a/src/Generator/Generators/CLI/CLITypePrinter.cs +++ b/src/Generator/Generators/CLI/CLITypePrinter.cs @@ -107,6 +107,8 @@ namespace CppSharp.Generators.CLI var str = string.Empty; if(param.Usage == ParameterUsage.Out) str += "[System::Runtime::InteropServices::Out] "; + else if (param.Usage == ParameterUsage.InOut) + str += "[System::Runtime::InteropServices::In, System::Runtime::InteropServices::Out] "; str += type; @@ -164,6 +166,13 @@ namespace CppSharp.Generators.CLI if (pointee.TryGetEnum(out @enum)) { var typeName = @enum.Visit(this); + + // Skip one indirection if passed by reference + var param = Context.Parameter; + if (param != null && (param.IsOut || param.IsInOut) + && pointee == finalPointee) + return string.Format("{0}", typeName); + return string.Format("{0}*", typeName); } From ba8c29c1aca9eb98cebf0e347f2b6bc0769933b9 Mon Sep 17 00:00:00 2001 From: Tom Spilman Date: Thu, 29 May 2014 18:03:43 -0500 Subject: [PATCH 4/4] Fixed simple mistake in the EnumOut tests. --- tests/Basic/Basic.Tests.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tests/Basic/Basic.Tests.cs b/tests/Basic/Basic.Tests.cs index 2ae4e40d..f097b5e5 100644 --- a/tests/Basic/Basic.Tests.cs +++ b/tests/Basic/Basic.Tests.cs @@ -101,10 +101,9 @@ public class BasicTests : GeneratorTestFixture { var hello = new Hello(); - int value = (int)Enum.C; Enum e; - hello.EnumOut(value, out e); - Assert.That(e, Is.EqualTo(value)); + hello.EnumOut((int)Enum.C, out e); + Assert.That(e, Is.EqualTo(Enum.C)); } [Test] @@ -112,10 +111,9 @@ public class BasicTests : GeneratorTestFixture { var hello = new Hello(); - int value = (int)Enum.C; Enum e; - hello.EnumOutRef(value, out e); - Assert.That(e, Is.EqualTo(value)); + hello.EnumOutRef((int)Enum.C, out e); + Assert.That(e, Is.EqualTo(Enum.C)); } [Test]