From 1387b636e212df18db258762be1f89bc7a997ad5 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Thu, 4 Sep 2014 22:44:16 +0300 Subject: [PATCH] Replaced the usage of memcpy with a simple dereference assignment. Signed-off-by: Dimitar Dobrev --- src/Generator/Generators/CSharp/CSharpTextTemplate.cs | 3 +-- tests/Basic/Basic.Tests.cs | 11 +++++++++++ tests/Basic/Basic.cpp | 6 +++--- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index cd38d486..87aab5b4 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -1981,8 +1981,7 @@ namespace CppSharp.Generators.CSharp else { WriteLine("global::System.IntPtr ret = Marshal.AllocHGlobal({0});", @class.Layout.Size); - WriteLine("CppSharp.Runtime.Helpers.memcpy(ret, new IntPtr(&native), new UIntPtr({0}));", - @class.Layout.Size); + WriteLine("*({0}.Internal*) ret = native;", className); WriteLine("return ret;"); } WriteCloseBraceIndent(); diff --git a/tests/Basic/Basic.Tests.cs b/tests/Basic/Basic.Tests.cs index 78b0ac27..cfde0225 100644 --- a/tests/Basic/Basic.Tests.cs +++ b/tests/Basic/Basic.Tests.cs @@ -407,5 +407,16 @@ public class BasicTests : GeneratorTestFixture var ret = basic.TestNullPtrTypeRet(); Assert.AreEqual(IntPtr.Zero, new IntPtr(ret)); } + + [Test] + public void TestCtorByValue() + { + var bar = new Bar { A = 4, B = 5.5f }; + var foo2 = new Foo2 { C = 4, valueTypeField = bar }; + var result = foo2 << 2; + Assert.AreEqual(foo2.C << 2, result.C); + Assert.AreEqual(bar.A << 2, result.valueTypeField.A); + Assert.AreEqual(bar.B, result.valueTypeField.B); + } } \ No newline at end of file diff --git a/tests/Basic/Basic.cpp b/tests/Basic/Basic.cpp index 2601760a..3bca418b 100644 --- a/tests/Basic/Basic.cpp +++ b/tests/Basic/Basic.cpp @@ -25,14 +25,14 @@ Foo2 Foo2::operator<<(signed int i) { Foo2 foo; foo.C = C << i; + foo.valueTypeField = valueTypeField; + foo.valueTypeField.A <<= i; return foo; } Foo2 Foo2::operator<<(signed long l) { - Foo2 foo; - foo.C = C << l; - return foo; + return *this << (signed int) l; } char Foo2::testCharMarshalling(char c)