+ addBaseCheck(indexInBlock, node, baseValue, variant.oldStructure());
+
+ childEdge.setUseKind(KnownCellUse);
+
+ Transition* transition = 0;
+ if (variant.kind() == PutByIdVariant::Transition) {
+ transition = m_graph.m_transitions.add(
+ variant.oldStructureForTransition(), variant.newStructure());
+ }
+
+ Edge propertyStorage;
+
+ if (isInlineOffset(variant.offset()))
+ propertyStorage = childEdge;
+ else if (!variant.reallocatesStorage()) {
+ propertyStorage = Edge(m_insertionSet.insertNode(
+ indexInBlock, SpecNone, GetButterfly, origin, childEdge));
+ } else if (!variant.oldStructureForTransition()->outOfLineCapacity()) {
+ ASSERT(variant.newStructure()->outOfLineCapacity());
+ ASSERT(!isInlineOffset(variant.offset()));
+ Node* allocatePropertyStorage = m_insertionSet.insertNode(
+ indexInBlock, SpecNone, AllocatePropertyStorage,
+ origin, OpInfo(transition), childEdge);
+ propertyStorage = Edge(allocatePropertyStorage);
+ } else {
+ ASSERT(variant.oldStructureForTransition()->outOfLineCapacity());
+ ASSERT(variant.newStructure()->outOfLineCapacity() > variant.oldStructureForTransition()->outOfLineCapacity());
+ ASSERT(!isInlineOffset(variant.offset()));
+
+ Node* reallocatePropertyStorage = m_insertionSet.insertNode(
+ indexInBlock, SpecNone, ReallocatePropertyStorage, origin,
+ OpInfo(transition), childEdge,
+ Edge(m_insertionSet.insertNode(
+ indexInBlock, SpecNone, GetButterfly, origin, childEdge)));
+ propertyStorage = Edge(reallocatePropertyStorage);
+ }
+
+ StorageAccessData& data = *m_graph.m_storageAccessData.add();
+ data.offset = variant.offset();
+ data.identifierNumber = identifierNumber;
+
+ node->convertToPutByOffset(data, propertyStorage);
+
+ if (variant.kind() == PutByIdVariant::Transition) {
+ // FIXME: PutStructure goes last until we fix either
+ // https://bugs.webkit.org/show_bug.cgi?id=142921 or
+ // https://bugs.webkit.org/show_bug.cgi?id=142924.