| Index: Source/platform/heap/Heap.h
 | 
| diff --git a/Source/platform/heap/Heap.h b/Source/platform/heap/Heap.h
 | 
| index 0a00ff544a88991b8f4dfb8cd2c130ef9733b6ce..885aaa4dac2be96a332d1991774aeb1489c9ad9c 100644
 | 
| --- a/Source/platform/heap/Heap.h
 | 
| +++ b/Source/platform/heap/Heap.h
 | 
| @@ -1091,68 +1091,6 @@ struct HeapIndexTrait {
 | 
|  FOR_EACH_TYPED_HEAP(DEFINE_TYPED_HEAP_TRAIT)
 | 
|  #undef DEFINE_TYPED_HEAP_TRAIT
 | 
|  
 | 
| -template<typename T, typename Enabled = void>
 | 
| -class AllocateObjectTrait {
 | 
| -public:
 | 
| -    static Address allocate(size_t size)
 | 
| -    {
 | 
| -        ThreadState* state = ThreadStateFor<ThreadingTrait<T>::Affinity>::state();
 | 
| -        return Heap::allocateOnHeapIndex(state, size, HeapIndexTrait<T>::index(), GCInfoTrait<T>::index());
 | 
| -    }
 | 
| -
 | 
| -    static void constructor()
 | 
| -    {
 | 
| -    }
 | 
| -};
 | 
| -
 | 
| -template<typename T>
 | 
| -class AllocateObjectTrait<T, typename WTF::EnableIf<blink::IsGarbageCollectedMixin<T>::value>::Type> {
 | 
| -public:
 | 
| -    // An object which implements GarbageCollectedMixin is marked
 | 
| -    // and traced during GC by first adjusting object references to
 | 
| -    // it to refer to the leftmost base for the object (which would
 | 
| -    // be a GarbageCollected-derived class.) The prefixed object header
 | 
| -    // can be located after that adjustment and its trace() vtbl slot
 | 
| -    // will be used to fully trace the object, if not already marked.
 | 
| -    //
 | 
| -    // A C++ object's vptr will be initialized to its leftmost base's
 | 
| -    // vtable after the constructors of all its subclasses have run,
 | 
| -    // so if a subclass constructor tries to access any of the vtbl
 | 
| -    // entries of its leftmost base prematurely, it'll find an as-yet
 | 
| -    // incorrect vptr and fail. Which is exactly what a garbage collector
 | 
| -    // will try to do if it tries to access the leftmost base while one
 | 
| -    // of the subclass constructors of a GC mixin object triggers a GC.
 | 
| -    // It is consequently not safe to allow any GCs while these objects
 | 
| -    // are under (sub constructor) construction.
 | 
| -    //
 | 
| -    // To achieve that, the construction of mixins are handled in a
 | 
| -    // special manner:
 | 
| -    //
 | 
| -    //  - The initial allocation of the mixin object will enter a no GC scope.
 | 
| -    //  - The constructor for the leftmost base, which is when the mixin
 | 
| -    //    object is in a state ready for a GC, leaves that GC scope.
 | 
| -    //  - no-GC scope entering/leaving must support nesting.
 | 
| -    //
 | 
| -    static Address allocate(size_t size)
 | 
| -    {
 | 
| -        ThreadState* state = ThreadStateFor<ThreadingTrait<T>::Affinity>::state();
 | 
| -        Address object = Heap::allocateOnHeapIndex(state, size, HeapIndexTrait<T>::index(), GCInfoTrait<T>::index());
 | 
| -        state->enterGCForbiddenScope();
 | 
| -        return object;
 | 
| -    }
 | 
| -
 | 
| -    static void constructor()
 | 
| -    {
 | 
| -        // FIXME: if prompt conservative GCs are needed, forced GCs that
 | 
| -        // were denied while within this scope, could now be performed.
 | 
| -        // For now, assume the next out-of-line allocation request will
 | 
| -        // happen soon enough and take care of it. Mixin objects aren't
 | 
| -        // overly common.
 | 
| -        ThreadState* state = ThreadStateFor<ThreadingTrait<T>::Affinity>::state();
 | 
| -        state->leaveGCForbiddenScope();
 | 
| -    }
 | 
| -};
 | 
| -
 | 
|  // Base class for objects allocated in the Blink garbage-collected heap.
 | 
|  //
 | 
|  // Defines a 'new' operator that allocates the memory in the heap.  'delete'
 | 
| @@ -1201,7 +1139,6 @@ public:
 | 
|  protected:
 | 
|      GarbageCollected()
 | 
|      {
 | 
| -        AllocateObjectTrait<T>::constructor();
 | 
|      }
 | 
|  };
 | 
|  
 | 
| @@ -1490,7 +1427,8 @@ inline Address Heap::allocateOnHeapIndex(ThreadState* state, size_t size, int he
 | 
|  template<typename T>
 | 
|  Address Heap::allocate(size_t size)
 | 
|  {
 | 
| -    return AllocateObjectTrait<T>::allocate(size);
 | 
| +    ThreadState* state = ThreadStateFor<ThreadingTrait<T>::Affinity>::state();
 | 
| +    return Heap::allocateOnHeapIndex(state, size, HeapIndexTrait<T>::index(), GCInfoTrait<T>::index());
 | 
|  }
 | 
|  
 | 
|  template<typename T>
 | 
| 
 |