From 9b137abc109725ff9d45d7a74edfda219519ebc4 Mon Sep 17 00:00:00 2001 From: Alex Corrado Date: Sun, 17 Jul 2011 18:28:20 -0400 Subject: [PATCH] Forgot to offset derived type's gchandle offset --- src/Mono.Cxxi/CppTypeInfo.cs | 11 +++++++---- tests/InheritanceTests.cs | 14 ++++++++++---- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/Mono.Cxxi/CppTypeInfo.cs b/src/Mono.Cxxi/CppTypeInfo.cs index 0fdbedc4..64b53c10 100644 --- a/src/Mono.Cxxi/CppTypeInfo.cs +++ b/src/Mono.Cxxi/CppTypeInfo.cs @@ -177,13 +177,16 @@ namespace Mono.Cxxi { baseType = baseType.Clone (); baseType.IsPrimaryBase = false; - baseType.gchandle_offset_delta += native_size_without_padding + CountBases (b => !b.IsPrimaryBase) * IntPtr.Size; - baseType.vt_overrides = baseType.vt_overrides.Clone (); // managed override tramps will be regenerated with correct gchandle offset - - // now, offset all previously added bases + // offset all previously added bases foreach (var previousBase in base_classes) { previousBase.gchandle_offset_delta += baseType.NativeSize; } + + // offset derived (this) type's gchandle + gchandle_offset_delta += baseType.GCHandleOffset; + + baseType.gchandle_offset_delta += native_size_without_padding + CountBases (b => !b.IsPrimaryBase) * IntPtr.Size; + baseType.vt_overrides = baseType.vt_overrides.Clone (); // managed override tramps will be regenerated with correct gchandle offset } base_classes.Add (baseType); diff --git a/tests/InheritanceTests.cs b/tests/InheritanceTests.cs index ee89dfdd..b39294ac 100644 --- a/tests/InheritanceTests.cs +++ b/tests/InheritanceTests.cs @@ -112,6 +112,12 @@ namespace Tests { { } + public override int Number { + get { + return 25; + } + } + // override virtual member inherited from non-primary base protected override void MultiplierClass__Multiply (int n) { @@ -123,12 +129,12 @@ namespace Tests { public void TestManagedOverride2 () { var cls = new ManagedOverride2 (); + Assert.AreEqual (-25, cls.NegativeNumber, "#1"); cls.MultiplierClass.Multiply (7); - Assert.AreEqual (5, cls.Number, "#1"); - Assert.AreEqual (30, ((MultiplierClass)cls).Number, "#2"); + Assert.AreEqual (30, ((MultiplierClass)cls).Number, "#3"); cls.CallMultiply (2); - Assert.AreEqual (5, cls.Number, "#3"); - Assert.AreEqual (300, ((MultiplierClass)cls).Number, "#4"); + Assert.AreEqual (25, cls.Number, "#2"); + Assert.AreEqual (300, ((MultiplierClass)cls).Number, "#5"); } [Test]