class My : Object {
public:
- Object * m_pOther;
+ Object * m_pOther1;
+ int dummy_inbetween;
+ Object * m_pOther2;
};
static struct My_MethodTable
{
// GCDesc
- CGCDescSeries m_series[1];
+ CGCDescSeries m_series[2];
size_t m_numSeries;
// The actual methodtable
}
My_MethodTable;
- My_MethodTable.m_numSeries = 1;
- My_MethodTable.m_series[0].SetSeriesOffset(offsetof(My, m_pOther));
+ My_MethodTable.m_MT.m_baseSize = sizeof(My) + sizeof(void*); //My contains the MethodTable*, the extra void* is for ObjHeader
+ My_MethodTable.m_MT.m_componentSize = 0; // Array component size
+ My_MethodTable.m_MT.m_flags = MTFlag_ContainsPointers;
+
+ My_MethodTable.m_numSeries = 2;
+ My_MethodTable.m_series[0].SetSeriesOffset(offsetof(My, m_pOther2));
My_MethodTable.m_series[0].SetSeriesCount(1);
+ My_MethodTable.m_series[0].seriessize -= My_MethodTable.m_MT.m_baseSize;
- My_MethodTable.m_MT.m_baseSize = 3 * sizeof(void *);
- My_MethodTable.m_MT.m_componentSize = 0; // Array component size
- My_MethodTable.m_MT.m_flags = MTFlag_ContainsPointers;
+ My_MethodTable.m_series[1].SetSeriesOffset(offsetof(My, m_pOther1));
+ My_MethodTable.m_series[1].SetSeriesCount(1);
+ My_MethodTable.m_series[1].seriessize -= My_MethodTable.m_MT.m_baseSize;
MethodTable * pMyMethodTable = &My_MethodTable.m_MT;
for (int i = 0; i < 1000000; i++)
{
- Object * pBefore = ((My *)ObjectFromHandle(oh))->m_pOther;
+ Object * pBefore = ((My *)ObjectFromHandle(oh))->m_pOther1;
// Allocate more instances of the same object
Object * p = AllocateObject(pMyMethodTable);
if (p == nullptr)
return -1;
- Object * pAfter = ((My *)ObjectFromHandle(oh))->m_pOther;
+ Object * pAfter = ((My *)ObjectFromHandle(oh))->m_pOther1;
// Uncomment this assert to see how GC triggered inside AllocateObject moved objects around
// assert(pBefore == pAfter);
// Store the newly allocated object into a field using WriteBarrier
- WriteBarrier(&(((My *)ObjectFromHandle(oh))->m_pOther), p);
+ WriteBarrier(&(((My *)ObjectFromHandle(oh))->m_pOther1), p);
}
// Create weak handle that points to our object