From 06b83ee3fc93048119f10eff0ff70ec6d7a11a5e Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Sun, 8 Dec 2013 20:53:27 +0200 Subject: [PATCH] Changed the generation of method bodies to avoid duplication of local variables when a fixed instance is required. Signed-off-by: Dimitar Dobrev --- src/Generator/Generators/CSharp/CSharpTextTemplate.cs | 6 +++--- tests/Basic/Basic.Tests.cs | 10 ++++++++++ tests/Basic/Basic.cpp | 10 ++++++++++ tests/Basic/Basic.h | 1 + 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 398a97e2..dbd8c65d 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -1999,7 +1999,7 @@ namespace CppSharp.Generators.CSharp if (needsInstance) { names.Insert(0, needsFixedThis ? string.Format("new global::System.IntPtr(&{0})", - GeneratedIdentifier("instance")) : Helpers.InstanceIdentifier); + GeneratedIdentifier("fixedInstance")) : Helpers.InstanceIdentifier); } if (needsFixedThis) @@ -2007,7 +2007,7 @@ namespace CppSharp.Generators.CSharp //WriteLine("fixed({0}* {1} = &this)", @class.QualifiedName, // GeneratedIdentifier("instance")); //WriteStartBraceIndent(); - WriteLine("var {0} = ToInternal();", Generator.GeneratedIdentifier("instance")); + WriteLine("var {0} = ToInternal();", Generator.GeneratedIdentifier("fixedInstance")); } if (needsReturn && !originalFunction.HasIndirectReturnTypeParameter) @@ -2035,7 +2035,7 @@ namespace CppSharp.Generators.CSharp if (needsFixedThis) { // WriteCloseBraceIndent(); - WriteLine("FromInternal(&{0});", Generator.GeneratedIdentifier("instance")); + WriteLine("FromInternal(&{0});", Generator.GeneratedIdentifier("fixedInstance")); } if (needsReturn) diff --git a/tests/Basic/Basic.Tests.cs b/tests/Basic/Basic.Tests.cs index 7c51786e..81ac0426 100644 --- a/tests/Basic/Basic.Tests.cs +++ b/tests/Basic/Basic.Tests.cs @@ -129,6 +129,16 @@ public class BasicTests Assert.That(basic.test(new basic()), Is.EqualTo(5)); } + [Test] + public void TestMethodWithFixedInstance() + { + var bar = new Bar2 { A = 1, B = 2, C = 3 }; + Foo2 foo = bar.needFixedInstance(); + Assert.AreEqual(foo.A, 1); + Assert.AreEqual(foo.B, 2); + Assert.AreEqual(foo.C, 3); + } + [Test, Ignore] public void TestConversionOperator() { diff --git a/tests/Basic/Basic.cpp b/tests/Basic/Basic.cpp index b7df47d6..b6b15b1b 100644 --- a/tests/Basic/Basic.cpp +++ b/tests/Basic/Basic.cpp @@ -52,6 +52,16 @@ Bar2::operator Foo2() return f; } +Foo2 Bar2::needFixedInstance() const +{ + Foo2 f; + f.A = A; + f.B = B; + f.C = C; + + return f; +} + Hello::Hello () { //cout << "Ctor!" << "\n"; diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index 2fe34d12..859462a4 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -56,6 +56,7 @@ struct DLL_API Bar2 : public Bar operator int() const; operator Foo2(); + Foo2 needFixedInstance() const; typedef void *Bar2::*FunctionPointerResolvedAsVoidStar; operator FunctionPointerResolvedAsVoidStar() const { return 0; }