Browse Source

Forgot to offset derived type's gchandle offset

pull/1/head
Alex Corrado 14 years ago
parent
commit
9b137abc10
  1. 11
      src/Mono.Cxxi/CppTypeInfo.cs
  2. 14
      tests/InheritanceTests.cs

11
src/Mono.Cxxi/CppTypeInfo.cs

@ -177,13 +177,16 @@ namespace Mono.Cxxi {
baseType = baseType.Clone (); baseType = baseType.Clone ();
baseType.IsPrimaryBase = false; baseType.IsPrimaryBase = false;
baseType.gchandle_offset_delta += native_size_without_padding + CountBases (b => !b.IsPrimaryBase) * IntPtr.Size; // offset all previously added bases
baseType.vt_overrides = baseType.vt_overrides.Clone (); // managed override tramps will be regenerated with correct gchandle offset
// now, offset all previously added bases
foreach (var previousBase in base_classes) { foreach (var previousBase in base_classes) {
previousBase.gchandle_offset_delta += baseType.NativeSize; 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); base_classes.Add (baseType);

14
tests/InheritanceTests.cs

@ -112,6 +112,12 @@ namespace Tests {
{ {
} }
public override int Number {
get {
return 25;
}
}
// override virtual member inherited from non-primary base // override virtual member inherited from non-primary base
protected override void MultiplierClass__Multiply (int n) protected override void MultiplierClass__Multiply (int n)
{ {
@ -123,12 +129,12 @@ namespace Tests {
public void TestManagedOverride2 () public void TestManagedOverride2 ()
{ {
var cls = new ManagedOverride2 (); var cls = new ManagedOverride2 ();
Assert.AreEqual (-25, cls.NegativeNumber, "#1");
cls.MultiplierClass.Multiply (7); cls.MultiplierClass.Multiply (7);
Assert.AreEqual (5, cls.Number, "#1"); Assert.AreEqual (30, ((MultiplierClass)cls).Number, "#3");
Assert.AreEqual (30, ((MultiplierClass)cls).Number, "#2");
cls.CallMultiply (2); cls.CallMultiply (2);
Assert.AreEqual (5, cls.Number, "#3"); Assert.AreEqual (25, cls.Number, "#2");
Assert.AreEqual (300, ((MultiplierClass)cls).Number, "#4"); Assert.AreEqual (300, ((MultiplierClass)cls).Number, "#5");
} }
[Test] [Test]

Loading…
Cancel
Save