Browse Source

Changed the generation of method bodies to avoid duplication of local variables when a fixed instance is required.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/132/head
Dimitar Dobrev 12 years ago
parent
commit
06b83ee3fc
  1. 6
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  2. 10
      tests/Basic/Basic.Tests.cs
  3. 10
      tests/Basic/Basic.cpp
  4. 1
      tests/Basic/Basic.h

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

@ -1999,7 +1999,7 @@ namespace CppSharp.Generators.CSharp @@ -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 @@ -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 @@ -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)

10
tests/Basic/Basic.Tests.cs

@ -129,6 +129,16 @@ public class BasicTests @@ -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()
{

10
tests/Basic/Basic.cpp

@ -52,6 +52,16 @@ Bar2::operator Foo2() @@ -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";

1
tests/Basic/Basic.h

@ -56,6 +56,7 @@ struct DLL_API Bar2 : public Bar @@ -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; }

Loading…
Cancel
Save