use two CGCDescSeries, and fix incorrect size
authorLucas Meijer <lucas@unity3d.com>
Wed, 25 Feb 2015 21:57:14 +0000 (13:57 -0800)
committerLucas Meijer <lucas@unity3d.com>
Wed, 25 Feb 2015 21:57:14 +0000 (13:57 -0800)
src/gc/sample/GCSample.cpp

index 2a5890d..da890ac 100644 (file)
@@ -152,13 +152,15 @@ int main(int argc, char* argv[])
 
     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
@@ -166,13 +168,18 @@ int main(int argc, char* argv[])
     }
     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;
 
@@ -188,20 +195,20 @@ int main(int argc, char* argv[])
 
     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