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 { @@ -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);

14
tests/InheritanceTests.cs

@ -112,6 +112,12 @@ namespace Tests { @@ -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 { @@ -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]

Loading…
Cancel
Save