+ transition->checkOffsetConsistency();
+ return transition;
+}
+
+PropertyTable* Structure::takePropertyTableOrCloneIfPinned(VM& vm, Structure* owner)
+{
+ materializePropertyMapIfNecessaryForPinning(vm);
+ if (m_isPinnedPropertyTable)
+ return propertyTable()->copy(vm, owner, propertyTable()->size() + 1);
+ PropertyTable* takenPropertyTable = propertyTable().get();
+ propertyTable().clear();
+ return takenPropertyTable;
+}
+
+Structure* Structure::nonPropertyTransition(VM& vm, Structure* structure, NonPropertyTransition transitionKind)
+{
+ unsigned attributes = toAttributes(transitionKind);
+ IndexingType indexingType = newIndexingType(structure->indexingTypeIncludingHistory(), transitionKind);
+
+ if (JSGlobalObject* globalObject = structure->m_globalObject.get()) {
+ if (globalObject->isOriginalArrayStructure(structure)) {
+ Structure* result = globalObject->originalArrayStructureForIndexingType(indexingType);
+ if (result->indexingTypeIncludingHistory() == indexingType) {
+ structure->notifyTransitionFromThisStructure();
+ return result;
+ }
+ }
+ }
+
+ if (Structure* existingTransition = structure->m_transitionTable.get(0, attributes)) {
+ ASSERT(existingTransition->m_attributesInPrevious == attributes);
+ ASSERT(existingTransition->indexingTypeIncludingHistory() == indexingType);
+ return existingTransition;
+ }
+
+ Structure* transition = create(vm, structure);
+ transition->setPreviousID(vm, transition, structure);
+ transition->m_attributesInPrevious = attributes;
+ transition->m_indexingType = indexingType;
+ transition->propertyTable().set(vm, transition, structure->takePropertyTableOrCloneIfPinned(vm, transition));
+ transition->m_offset = structure->m_offset;
+ checkOffset(transition->m_offset, transition->inlineCapacity());
+
+ structure->m_transitionTable.add(vm, transition);
+ transition->checkOffsetConsistency();