From 1dbc76f134fea41065b29c0a79a6675b1c66f7c1 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Fri, 17 Oct 2014 16:42:00 +0300 Subject: [PATCH 1/2] Fixed a bug when a char parameter is assigned a default value of 0. Signed-off-by: Dimitar Dobrev --- src/Generator/Passes/HandleDefaultParamValuesPass.cs | 11 +++++++++++ tests/CSharpTemp/CSharpTemp.Tests.cs | 1 + tests/CSharpTemp/CSharpTemp.cpp | 4 ++++ tests/CSharpTemp/CSharpTemp.h | 1 + 4 files changed, 17 insertions(+) diff --git a/src/Generator/Passes/HandleDefaultParamValuesPass.cs b/src/Generator/Passes/HandleDefaultParamValuesPass.cs index 1d741c45..3489c2d5 100644 --- a/src/Generator/Passes/HandleDefaultParamValuesPass.cs +++ b/src/Generator/Passes/HandleDefaultParamValuesPass.cs @@ -44,6 +44,8 @@ namespace CppSharp.Passes continue; CheckForULongValue(parameter, desugared); + + CheckForDefaultEmptyChar(parameter, desugared); } GenerateOverloads(function, overloadIndices); @@ -146,6 +148,15 @@ namespace CppSharp.Passes parameter.DefaultArgument.String = value.ToString(CultureInfo.InvariantCulture); } + private void CheckForDefaultEmptyChar(Parameter parameter, Type desugared) + { + if (parameter.DefaultArgument.String == "0" && Driver.Options.MarshalCharAsManagedChar && + desugared.IsPrimitiveType(PrimitiveType.Char)) + { + parameter.DefaultArgument.String = "'\\0'"; + } + } + private static void GenerateOverloads(Function function, List overloadIndices) { foreach (var overloadIndex in overloadIndices) diff --git a/tests/CSharpTemp/CSharpTemp.Tests.cs b/tests/CSharpTemp/CSharpTemp.Tests.cs index 788f4f48..78b98e51 100644 --- a/tests/CSharpTemp/CSharpTemp.Tests.cs +++ b/tests/CSharpTemp/CSharpTemp.Tests.cs @@ -131,6 +131,7 @@ public class CSharpTempTests : GeneratorTestFixture { var methodsWithDefaultValues = new MethodsWithDefaultValues(); methodsWithDefaultValues.DefaultChar(); + methodsWithDefaultValues.DefaultEmptyChar(); methodsWithDefaultValues.DefaultPointer(); methodsWithDefaultValues.DefaultRefTypeAfterOthers(); methodsWithDefaultValues.DefaultRefTypeBeforeAndAfterOthers(5, new Foo()); diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index 3f022a7c..bde8ffcc 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -249,6 +249,10 @@ void MethodsWithDefaultValues::defaultChar(char c) { } +void MethodsWithDefaultValues::defaultEmptyChar(char c) +{ +} + void MethodsWithDefaultValues::defaultRefTypeBeforeOthers(Foo foo, int i, Bar::Items item) { } diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index 7df4f644..7a24bc37 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -219,6 +219,7 @@ public: void defaultPointer(Foo* ptr = 0); void defaultValueType(ValueType bar = ValueType()); void defaultChar(char c = 'a'); + void defaultEmptyChar(char c = 0); void defaultRefTypeBeforeOthers(Foo foo = Foo(), int i = 5, Bar::Items item = Bar::Item2); void defaultRefTypeAfterOthers(int i = 5, Bar::Items item = Bar::Item2, Foo foo = Foo()); void defaultRefTypeBeforeAndAfterOthers(int i = 5, Foo foo = Foo(), Bar::Items item = Bar::Item2, Baz baz = Baz()); From 2894999696f761e2b6d3ce8114618f1b1c822c17 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Fri, 17 Oct 2014 16:52:20 +0300 Subject: [PATCH 2/2] Fixed the generation of constructor overloads synthetised because of default arguments. Signed-off-by: Dimitar Dobrev --- .../Generators/CSharp/CSharpTextTemplate.cs | 29 ++++++++++++++----- tests/CSharpTemp/CSharpTemp.cpp | 4 +++ tests/CSharpTemp/CSharpTemp.h | 1 + 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 322f59ba..22263149 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -2072,6 +2072,16 @@ namespace CppSharp.Generators.CSharp Write(")"); + if (method.SynthKind == FunctionSynthKind.DefaultValueOverload && method.IsConstructor && + !(Driver.Options.GenerateAbstractImpls && method.IsPure)) + { + Write(" : this({0})", + string.Join(", ", + method.Parameters.Where( + p => p.Kind == ParameterKind.Regular).Select( + p => p.GenerationKind == GenerationKind.None ? p.DefaultArgument.String : p.Name))); + } + if (Driver.Options.GenerateAbstractImpls && method.IsPure) { Write(";"); @@ -2090,14 +2100,17 @@ namespace CppSharp.Generators.CSharp if (method.SynthKind == FunctionSynthKind.DefaultValueOverload) { - Type type = method.OriginalReturnType.Type; - WriteLine("{0}{1}({2});", - type.IsPrimitiveType(PrimitiveType.Void) ? string.Empty : "return ", - method.Name, - string.Join(", ", - method.Parameters.Where( - p => p.Kind == ParameterKind.Regular).Select( - p => p.GenerationKind == GenerationKind.None ? p.DefaultArgument.String : p.Name))); + if (!method.IsConstructor) + { + Type type = method.OriginalReturnType.Type; + this.WriteLine("{0}{1}({2});", + type.IsPrimitiveType(PrimitiveType.Void) ? string.Empty : "return ", + method.Name, + string.Join(", ", + method.Parameters.Where( + p => p.Kind == ParameterKind.Regular).Select( + p => p.GenerationKind == GenerationKind.None ? p.DefaultArgument.String : p.Name))); + } goto SkipImpl; } diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index bde8ffcc..52ab08c2 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -237,6 +237,10 @@ QGenericArgument::QGenericArgument(const char *name) _name = name; } +MethodsWithDefaultValues::MethodsWithDefaultValues(Foo foo) +{ +} + void MethodsWithDefaultValues::defaultPointer(Foo *ptr) { } diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index 7a24bc37..28b931ea 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -216,6 +216,7 @@ private: class DLL_API MethodsWithDefaultValues { public: + MethodsWithDefaultValues(Foo foo = Foo()); void defaultPointer(Foo* ptr = 0); void defaultValueType(ValueType bar = ValueType()); void defaultChar(char c = 'a');