- ASSERT(!structure->isDictionary());
- ASSERT(structure->typeInfo().type() == ObjectType);
- ASSERT(!Structure::addPropertyTransitionToExistingStructure(structure, propertyName, attributes, specificValue, offset));
-
- if (structure->m_specificFunctionThrashCount == maxSpecificFunctionThrashCount)
- specificValue = 0;
-
- if (structure->transitionCount() > s_maxTransitionLength) {
- RefPtr<Structure> transition = toCacheableDictionaryTransition(structure);
- ASSERT(structure != transition);
- offset = transition->put(propertyName, attributes, specificValue);
- ASSERT(offset >= structure->m_anonymousSlotCount);
- ASSERT(structure->m_anonymousSlotCount == transition->m_anonymousSlotCount);
- if (transition->propertyStorageSize() > transition->propertyStorageCapacity())
- transition->growPropertyStorageCapacity();
- return transition.release();
- }
-
- RefPtr<Structure> transition = create(structure->m_prototype, structure->typeInfo(), structure->anonymousSlotCount());
-
- transition->m_cachedPrototypeChain = structure->m_cachedPrototypeChain;
- transition->m_previous = structure;
- transition->m_nameInPrevious = propertyName.ustring().rep();
- transition->m_attributesInPrevious = attributes;
- transition->m_specificValueInPrevious = specificValue;
- transition->m_propertyStorageCapacity = structure->m_propertyStorageCapacity;
- transition->m_hasGetterSetterProperties = structure->m_hasGetterSetterProperties;
- transition->m_hasNonEnumerableProperties = structure->m_hasNonEnumerableProperties;
- transition->m_specificFunctionThrashCount = structure->m_specificFunctionThrashCount;
-
- if (structure->m_propertyTable) {
- if (structure->m_isPinnedPropertyTable)
- transition->m_propertyTable = structure->copyPropertyTable();
- else {
- transition->m_propertyTable = structure->m_propertyTable;
- structure->m_propertyTable = 0;
- }
- } else {
- if (structure->m_previous)
- transition->materializePropertyMap();
- else
- transition->createPropertyMapHashTable();
+ DeferGC deferGC(vm.heap);
+ if (!structure->isUncacheableDictionary()) {
+ Structure* transition = create(vm, structure);
+
+ structure->materializePropertyMapIfNecessary(vm, deferGC);
+ transition->propertyTable().set(vm, transition, structure->copyPropertyTableForPinning(vm));
+ transition->m_offset = structure->m_offset;
+ transition->pin();
+
+ structure = transition;