Changeset 254760 in webkit


Ignore:
Timestamp:
Jan 17, 2020 12:38:08 PM (4 years ago)
Author:
Justin Michaud
Message:

Separate storage of Structure::m_offset into transition and max offset
https://bugs.webkit.org/show_bug.cgi?id=206365

Reviewed by Saam Barati.

Right now, deleteProperty/removePropertyTransition causes a structure transition to uncacheable dictionary. Other transitions
assume that the transition offset (m_offset) is monotonically increasing. In order to support structure transitions for deletion that
do not involve turning into a dictionary (<https://bugs.webkit.org/show_bug.cgi?id=206430>), we first need to separate the transition
offset (the offset of the property that was added/deleted) from the maximum offset.

For example, suppose we have the following operations:

Structure 1 (pinned property table, transitionOffset = _, maxOffset = 2): x y z (delete y, assuming that deletion transitions have been added)
Structure 2 (transitionOffset = 1, maxOffset = 2): x _ z (add w)
Structure 3 (transitionOffset = 1, maxOffset = 2): x w z

Note that without splitting the two, Structures 2/3 would be impossible to represent.

This change:

We split the existing Structure::m_offset into two 16-bit fields, transitionOffset and maxOffset, and put them in 32-bit rare data fields if they overflow. We also rename _inPrevious fields to
transition_ and lastOffset to maxOffset to make the code more clear.

  • runtime/ClonedArguments.cpp:

(JSC::ClonedArguments::createStructure):

  • runtime/JSObject.cpp:

(JSC::JSObject::markAuxiliaryAndVisitOutOfLineProperties):
(JSC::JSObject::visitButterflyImpl):

  • runtime/JSObject.h:
  • runtime/JSObjectInlines.h:

(JSC::JSObject::prepareToPutDirectWithoutTransition):

  • runtime/ObjectInitializationScope.cpp:

(JSC::ObjectInitializationScope::verifyPropertiesAreInitialized):

  • runtime/PropertyOffset.h:

(JSC::numberOfOutOfLineSlotsForMaxOffset):
(JSC::numberOfSlotsForMaxOffset):
(JSC::numberOfOutOfLineSlotsForLastOffset): Deleted.
(JSC::numberOfSlotsForLastOffset): Deleted.

  • runtime/Structure.cpp:

(JSC::StructureTransitionTable::contains const):
(JSC::StructureTransitionTable::get const):
(JSC::StructureTransitionTable::add):
(JSC::Structure::Structure):
(JSC::Structure::create):
(JSC::Structure::materializePropertyTable):
(JSC::Structure::addPropertyTransitionToExistingStructureImpl):
(JSC::Structure::addNewPropertyTransition):
(JSC::Structure::changePrototypeTransition):
(JSC::Structure::attributeChangeTransition):
(JSC::Structure::toDictionaryTransition):
(JSC::Structure::nonPropertyTransitionSlow):
(JSC::Structure::flattenDictionaryStructure):
(JSC::Structure::pin):
(JSC::Structure::pinForCaching):
(JSC::Structure::add):

  • runtime/Structure.h:
  • runtime/StructureInlines.h:

(JSC::Structure::forEachPropertyConcurrently):
(JSC::Structure::checkOffsetConsistency const):
(JSC::Structure::add):

  • runtime/StructureRareData.cpp:

(JSC::StructureRareData::StructureRareData):

  • runtime/StructureRareData.h:
Location:
trunk/Source/JavaScriptCore
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r254757 r254760  
     12020-01-17  Justin Michaud  <justin_michaud@apple.com>
     2
     3        Separate storage of Structure::m_offset into transition and max offset
     4        https://bugs.webkit.org/show_bug.cgi?id=206365
     5
     6        Reviewed by Saam Barati.
     7
     8        Right now, deleteProperty/removePropertyTransition causes a structure transition to uncacheable dictionary. Other transitions
     9        assume that the transition offset (m_offset) is monotonically increasing. In order to support structure transitions for deletion that
     10        do not involve turning into a dictionary (<https://bugs.webkit.org/show_bug.cgi?id=206430>), we first need to separate the transition
     11        offset (the offset of the property that was added/deleted) from the maximum offset.
     12
     13        For example, suppose we have the following operations:
     14          Structure 1 (pinned property table, transitionOffset = _, maxOffset = 2): x y z (delete y, assuming that deletion transitions have been added)
     15          Structure 2 (transitionOffset = 1, maxOffset = 2):                        x _ z (add w)
     16          Structure 3 (transitionOffset = 1, maxOffset = 2):                        x w z
     17
     18        Note that without splitting the two, Structures 2/3 would be impossible to represent.
     19
     20        This change:
     21
     22        We split the existing Structure::m_offset into two 16-bit fields, transitionOffset and maxOffset, and put them in 32-bit rare data fields if they overflow. We also rename _inPrevious fields to
     23        transition_ and lastOffset to maxOffset to make the code more clear.
     24
     25        * runtime/ClonedArguments.cpp:
     26        (JSC::ClonedArguments::createStructure):
     27        * runtime/JSObject.cpp:
     28        (JSC::JSObject::markAuxiliaryAndVisitOutOfLineProperties):
     29        (JSC::JSObject::visitButterflyImpl):
     30        * runtime/JSObject.h:
     31        * runtime/JSObjectInlines.h:
     32        (JSC::JSObject::prepareToPutDirectWithoutTransition):
     33        * runtime/ObjectInitializationScope.cpp:
     34        (JSC::ObjectInitializationScope::verifyPropertiesAreInitialized):
     35        * runtime/PropertyOffset.h:
     36        (JSC::numberOfOutOfLineSlotsForMaxOffset):
     37        (JSC::numberOfSlotsForMaxOffset):
     38        (JSC::numberOfOutOfLineSlotsForLastOffset): Deleted.
     39        (JSC::numberOfSlotsForLastOffset): Deleted.
     40        * runtime/Structure.cpp:
     41        (JSC::StructureTransitionTable::contains const):
     42        (JSC::StructureTransitionTable::get const):
     43        (JSC::StructureTransitionTable::add):
     44        (JSC::Structure::Structure):
     45        (JSC::Structure::create):
     46        (JSC::Structure::materializePropertyTable):
     47        (JSC::Structure::addPropertyTransitionToExistingStructureImpl):
     48        (JSC::Structure::addNewPropertyTransition):
     49        (JSC::Structure::changePrototypeTransition):
     50        (JSC::Structure::attributeChangeTransition):
     51        (JSC::Structure::toDictionaryTransition):
     52        (JSC::Structure::nonPropertyTransitionSlow):
     53        (JSC::Structure::flattenDictionaryStructure):
     54        (JSC::Structure::pin):
     55        (JSC::Structure::pinForCaching):
     56        (JSC::Structure::add):
     57        * runtime/Structure.h:
     58        * runtime/StructureInlines.h:
     59        (JSC::Structure::forEachPropertyConcurrently):
     60        (JSC::Structure::checkOffsetConsistency const):
     61        (JSC::Structure::add):
     62        * runtime/StructureRareData.cpp:
     63        (JSC::StructureRareData::StructureRareData):
     64        * runtime/StructureRareData.h:
     65
    1662020-01-17  Alexey Shvayka  <shvaikalesh@gmail.com>
    267
  • trunk/Source/JavaScriptCore/runtime/ClonedArguments.cpp

    r251425 r254760  
    154154    structure->addPropertyWithoutTransition(
    155155        vm, vm.propertyNames->length, static_cast<unsigned>(PropertyAttribute::DontEnum),
    156         [&] (const GCSafeConcurrentJSLocker&, PropertyOffset offset, PropertyOffset newLastOffset) {
     156        [&] (const GCSafeConcurrentJSLocker&, PropertyOffset offset, PropertyOffset newMaxOffset) {
    157157            RELEASE_ASSERT(offset == clonedArgumentsLengthPropertyOffset);
    158             structure->setLastOffset(newLastOffset);
     158            structure->setMaxOffset(vm, newMaxOffset);
    159159        });
    160160    return structure;
  • trunk/Source/JavaScriptCore/runtime/JSObject.cpp

    r254087 r254760  
    9393}
    9494
    95 ALWAYS_INLINE void JSObject::markAuxiliaryAndVisitOutOfLineProperties(SlotVisitor& visitor, Butterfly* butterfly, Structure* structure, PropertyOffset lastOffset)
     95ALWAYS_INLINE void JSObject::markAuxiliaryAndVisitOutOfLineProperties(SlotVisitor& visitor, Butterfly* butterfly, Structure* structure, PropertyOffset maxOffset)
    9696{
    9797    // We call this when we found everything without races.
     
    114114   
    115115    HeapCell* base = bitwise_cast<HeapCell*>(
    116         butterfly->base(preCapacity, Structure::outOfLineCapacity(lastOffset)));
     116        butterfly->base(preCapacity, Structure::outOfLineCapacity(maxOffset)));
    117117   
    118118    ASSERT(Heap::heap(base) == visitor.heap());
     
    120120    visitor.markAuxiliary(base);
    121121   
    122     unsigned outOfLineSize = Structure::outOfLineSize(lastOffset);
     122    unsigned outOfLineSize = Structure::outOfLineSize(maxOffset);
    123123    visitor.appendValuesHidden(butterfly->propertyStorage() - outOfLineSize, outOfLineSize);
    124124}
     
    139139    Butterfly* butterfly;
    140140    Structure* structure;
    141     PropertyOffset lastOffset;
     141    PropertyOffset maxOffset;
    142142
    143143    auto visitElements = [&] (IndexingType indexingMode) {
     
    160160        butterfly = this->butterfly();
    161161        structure = this->structure(vm);
    162         lastOffset = structure->lastOffset();
    163        
    164         markAuxiliaryAndVisitOutOfLineProperties(visitor, butterfly, structure, lastOffset);
     162        maxOffset = structure->maxOffset();
     163       
     164        markAuxiliaryAndVisitOutOfLineProperties(visitor, butterfly, structure, maxOffset);
    165165        visitElements(structure->indexingMode());
    166166
     
    175175    //     object->structure = nuke(object->structure)
    176176    //     object->butterfly = newButterfly
    177     //     structure->m_offset = newLastOffset
     177    //     structure->m_offset = newMaxOffset
    178178    //     object->structure = newStructure
    179179    //
     
    231231    // mutator changing the size without changing the structure:
    232232    //
    233     //     NukeStructure ChangeButterfly ChangeLastOffset RestoreStructure
     233    //     NukeStructure ChangeButterfly ChangeMaxOffset RestoreStructure
    234234    //
    235235    // Meanwhile the collector does:
    236236    //
    237     //     ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate
     237    //     ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate
    238238    //
    239239    // The collector can detect races by not only comparing the early structure to the late structure
    240240    // (which will be the same before and after the algorithm runs) but also by comparing the early and
    241     // late lastOffsets. Note: the IGNORE proofs do not cite all of the reasons why the collector will
     241    // late maxOffsets. Note: the IGNORE proofs do not cite all of the reasons why the collector will
    242242    // ignore the case, since we only need to identify one to say that we're in the ignore case.
    243243    //
    244     // NukeStructure ChangeButterfly ChangeLastOffset RestoreStructure ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate: AFTER, trivially
    245     // NukeStructure ChangeButterfly ChangeLastOffset ReadStructureEarly RestoreStructure ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    246     // NukeStructure ChangeButterfly ChangeLastOffset ReadStructureEarly ReadLastOffsetEarly RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    247     // NukeStructure ChangeButterfly ChangeLastOffset ReadStructureEarly ReadLastOffsetEarly ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    248     // NukeStructure ChangeButterfly ChangeLastOffset ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early
    249     // NukeStructure ChangeButterfly ChangeLastOffset ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early
    250     // NukeStructure ChangeButterfly ReadStructureEarly ChangeLastOffset RestoreStructure ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    251     // NukeStructure ChangeButterfly ReadStructureEarly ChangeLastOffset ReadLastOffsetEarly RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    252     // NukeStructure ChangeButterfly ReadStructureEarly ChangeLastOffset ReadLastOffsetEarly ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    253     // NukeStructure ChangeButterfly ReadStructureEarly ChangeLastOffset ReadLastOffsetEarly ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early
    254     // NukeStructure ChangeButterfly ReadStructureEarly ChangeLastOffset ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early
    255     // NukeStructure ChangeButterfly ReadStructureEarly ReadLastOffsetEarly ChangeLastOffset RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    256     // NukeStructure ChangeButterfly ReadStructureEarly ReadLastOffsetEarly ChangeLastOffset ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    257     // NukeStructure ChangeButterfly ReadStructureEarly ReadLastOffsetEarly ChangeLastOffset ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early
    258     // NukeStructure ChangeButterfly ReadStructureEarly ReadLastOffsetEarly ChangeLastOffset ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early
    259     // NukeStructure ChangeButterfly ReadStructureEarly ReadLastOffsetEarly ReadButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    260     // NukeStructure ChangeButterfly ReadStructureEarly ReadLastOffsetEarly ReadButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early
    261     // NukeStructure ChangeButterfly ReadStructureEarly ReadLastOffsetEarly ReadButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early
    262     // NukeStructure ChangeButterfly ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early
    263     // NukeStructure ChangeButterfly ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early
    264     // NukeStructure ChangeButterfly ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure early
    265     // NukeStructure ReadStructureEarly ChangeButterfly ChangeLastOffset RestoreStructure ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    266     // NukeStructure ReadStructureEarly ChangeButterfly ChangeLastOffset ReadLastOffsetEarly RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    267     // NukeStructure ReadStructureEarly ChangeButterfly ChangeLastOffset ReadLastOffsetEarly ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    268     // NukeStructure ReadStructureEarly ChangeButterfly ChangeLastOffset ReadLastOffsetEarly ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early
    269     // NukeStructure ReadStructureEarly ChangeButterfly ChangeLastOffset ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early
    270     // NukeStructure ReadStructureEarly ChangeButterfly ReadLastOffsetEarly ChangeLastOffset RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    271     // NukeStructure ReadStructureEarly ChangeButterfly ReadLastOffsetEarly ChangeLastOffset ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    272     // NukeStructure ReadStructureEarly ChangeButterfly ReadLastOffsetEarly ChangeLastOffset ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early
    273     // NukeStructure ReadStructureEarly ChangeButterfly ReadLastOffsetEarly ChangeLastOffset ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early
    274     // NukeStructure ReadStructureEarly ChangeButterfly ReadLastOffsetEarly ReadButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    275     // NukeStructure ReadStructureEarly ChangeButterfly ReadLastOffsetEarly ReadButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early
    276     // NukeStructure ReadStructureEarly ChangeButterfly ReadLastOffsetEarly ReadButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early
    277     // NukeStructure ReadStructureEarly ChangeButterfly ReadLastOffsetEarly ReadButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early
    278     // NukeStructure ReadStructureEarly ChangeButterfly ReadLastOffsetEarly ReadButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early
    279     // NukeStructure ReadStructureEarly ChangeButterfly ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure early
    280     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ChangeButterfly ChangeLastOffset RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    281     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ChangeButterfly ChangeLastOffset ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    282     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ChangeButterfly ChangeLastOffset ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early
    283     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ChangeButterfly ChangeLastOffset ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early
    284     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ChangeButterfly ReadButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    285     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ChangeButterfly ReadButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early
    286     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ChangeButterfly ReadButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early
    287     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early
    288     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early
    289     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure early
    290     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ReadButterfly ChangeButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early
    291     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ReadButterfly ChangeButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early
    292     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ReadButterfly ChangeButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early
    293     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early
    294     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early
    295     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure early
    296     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early
    297     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early
    298     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure early
    299     // NukeStructure ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeButterfly ChangeLastOffset RestoreStructure: IGNORE, read nuked structure early
    300     // ReadStructureEarly NukeStructure ChangeButterfly ChangeLastOffset RestoreStructure ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate: AFTER, the ReadStructureEarly sees the same structure as after and everything else runs after.
    301     // ReadStructureEarly NukeStructure ChangeButterfly ChangeLastOffset ReadLastOffsetEarly RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: AFTER, as above and the ReadLastOffsetEarly sees the lastOffset after.
    302     // ReadStructureEarly NukeStructure ChangeButterfly ChangeLastOffset ReadLastOffsetEarly ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: AFTER, as above and the ReadButterfly sees the right butterfly after.
    303     // ReadStructureEarly NukeStructure ChangeButterfly ChangeLastOffset ReadLastOffsetEarly ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure late
    304     // ReadStructureEarly NukeStructure ChangeButterfly ChangeLastOffset ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure late
    305     // ReadStructureEarly NukeStructure ChangeButterfly ReadLastOffsetEarly ChangeLastOffset RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets
    306     // ReadStructureEarly NukeStructure ChangeButterfly ReadLastOffsetEarly ChangeLastOffset ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets
    307     // ReadStructureEarly NukeStructure ChangeButterfly ReadLastOffsetEarly ChangeLastOffset ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    308     // ReadStructureEarly NukeStructure ChangeButterfly ReadLastOffsetEarly ChangeLastOffset ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets
    309     // ReadStructureEarly NukeStructure ChangeButterfly ReadLastOffsetEarly ReadButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets
    310     // ReadStructureEarly NukeStructure ChangeButterfly ReadLastOffsetEarly ReadButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    311     // ReadStructureEarly NukeStructure ChangeButterfly ReadLastOffsetEarly ReadButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets
    312     // ReadStructureEarly NukeStructure ChangeButterfly ReadLastOffsetEarly ReadButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    313     // ReadStructureEarly NukeStructure ChangeButterfly ReadLastOffsetEarly ReadButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets
    314     // ReadStructureEarly NukeStructure ChangeButterfly ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late
    315     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ChangeButterfly ChangeLastOffset RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets
    316     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ChangeButterfly ChangeLastOffset ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets
    317     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ChangeButterfly ChangeLastOffset ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    318     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ChangeButterfly ChangeLastOffset ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets
    319     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ChangeButterfly ReadButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets
    320     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ChangeButterfly ReadButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    321     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ChangeButterfly ReadButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets
    322     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    323     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets
    324     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late
    325     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ReadButterfly ChangeButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets
    326     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ReadButterfly ChangeButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    327     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ReadButterfly ChangeButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets
    328     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    329     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets
    330     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late
    331     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    332     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets
    333     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late
    334     // ReadStructureEarly NukeStructure ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeButterfly ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late
    335     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ChangeButterfly ChangeLastOffset RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets
    336     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ChangeButterfly ChangeLastOffset ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets
    337     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ChangeButterfly ChangeLastOffset ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure late
    338     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ChangeButterfly ChangeLastOffset ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure late
    339     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ChangeButterfly ReadButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets
    340     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ChangeButterfly ReadButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    341     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ChangeButterfly ReadButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets
    342     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ChangeButterfly ReadButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    343     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ChangeButterfly ReadButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets
    344     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ChangeButterfly ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late
    345     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ReadButterfly ChangeButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets
    346     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ReadButterfly ChangeButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    347     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ReadButterfly ChangeButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets
    348     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ReadButterfly ChangeButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    349     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ReadButterfly ChangeButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets
    350     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ReadButterfly ChangeButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late
    351     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ReadButterfly ReadStructureLate ChangeButterfly ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    352     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ReadButterfly ReadStructureLate ChangeButterfly ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure late
    353     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ReadButterfly ReadStructureLate ChangeButterfly ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late
    354     // ReadStructureEarly ReadLastOffsetEarly NukeStructure ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeButterfly ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late
    355     // ReadStructureEarly ReadLastOffsetEarly ReadButterfly NukeStructure ChangeButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets
    356     // ReadStructureEarly ReadLastOffsetEarly ReadButterfly NukeStructure ChangeButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    357     // ReadStructureEarly ReadLastOffsetEarly ReadButterfly NukeStructure ChangeButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets
    358     // ReadStructureEarly ReadLastOffsetEarly ReadButterfly NukeStructure ChangeButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    359     // ReadStructureEarly ReadLastOffsetEarly ReadButterfly NukeStructure ChangeButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets
    360     // ReadStructureEarly ReadLastOffsetEarly ReadButterfly NukeStructure ChangeButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late
    361     // ReadStructureEarly ReadLastOffsetEarly ReadButterfly NukeStructure ReadStructureLate ChangeButterfly ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure late
    362     // ReadStructureEarly ReadLastOffsetEarly ReadButterfly NukeStructure ReadStructureLate ChangeButterfly ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure late
    363     // ReadStructureEarly ReadLastOffsetEarly ReadButterfly NukeStructure ReadStructureLate ChangeButterfly ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late
    364     // ReadStructureEarly ReadLastOffsetEarly ReadButterfly NukeStructure ReadStructureLate ReadLastOffsetLate ChangeButterfly ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late
    365     // ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate NukeStructure ChangeButterfly ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets
    366     // ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate NukeStructure ChangeButterfly ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets
    367     // ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate NukeStructure ChangeButterfly ReadLastOffsetLate ChangeLastOffset RestoreStructure: BEFORE, reads the offset before, everything else happens before
    368     // ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate NukeStructure ReadLastOffsetLate ChangeButterfly ChangeLastOffset RestoreStructure: BEFORE, reads the offset before, everything else happens before
    369     // ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate NukeStructure ChangeButterfly ChangeLastOffset RestoreStructure: BEFORE, trivially
     244    // NukeStructure ChangeButterfly ChangeMaxOffset RestoreStructure ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate: AFTER, trivially
     245    // NukeStructure ChangeButterfly ChangeMaxOffset ReadStructureEarly RestoreStructure ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     246    // NukeStructure ChangeButterfly ChangeMaxOffset ReadStructureEarly ReadMaxOffsetEarly RestoreStructure ReadButterfly ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     247    // NukeStructure ChangeButterfly ChangeMaxOffset ReadStructureEarly ReadMaxOffsetEarly ReadButterfly RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     248    // NukeStructure ChangeButterfly ChangeMaxOffset ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure early
     249    // NukeStructure ChangeButterfly ChangeMaxOffset ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure early
     250    // NukeStructure ChangeButterfly ReadStructureEarly ChangeMaxOffset RestoreStructure ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     251    // NukeStructure ChangeButterfly ReadStructureEarly ChangeMaxOffset ReadMaxOffsetEarly RestoreStructure ReadButterfly ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     252    // NukeStructure ChangeButterfly ReadStructureEarly ChangeMaxOffset ReadMaxOffsetEarly ReadButterfly RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     253    // NukeStructure ChangeButterfly ReadStructureEarly ChangeMaxOffset ReadMaxOffsetEarly ReadButterfly ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure early
     254    // NukeStructure ChangeButterfly ReadStructureEarly ChangeMaxOffset ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure early
     255    // NukeStructure ChangeButterfly ReadStructureEarly ReadMaxOffsetEarly ChangeMaxOffset RestoreStructure ReadButterfly ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     256    // NukeStructure ChangeButterfly ReadStructureEarly ReadMaxOffsetEarly ChangeMaxOffset ReadButterfly RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     257    // NukeStructure ChangeButterfly ReadStructureEarly ReadMaxOffsetEarly ChangeMaxOffset ReadButterfly ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure early
     258    // NukeStructure ChangeButterfly ReadStructureEarly ReadMaxOffsetEarly ChangeMaxOffset ReadButterfly ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure early
     259    // NukeStructure ChangeButterfly ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ChangeMaxOffset RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     260    // NukeStructure ChangeButterfly ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ChangeMaxOffset ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure early
     261    // NukeStructure ChangeButterfly ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ChangeMaxOffset ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure early
     262    // NukeStructure ChangeButterfly ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ChangeMaxOffset RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure early
     263    // NukeStructure ChangeButterfly ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ChangeMaxOffset ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure early
     264    // NukeStructure ChangeButterfly ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure early
     265    // NukeStructure ReadStructureEarly ChangeButterfly ChangeMaxOffset RestoreStructure ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     266    // NukeStructure ReadStructureEarly ChangeButterfly ChangeMaxOffset ReadMaxOffsetEarly RestoreStructure ReadButterfly ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     267    // NukeStructure ReadStructureEarly ChangeButterfly ChangeMaxOffset ReadMaxOffsetEarly ReadButterfly RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     268    // NukeStructure ReadStructureEarly ChangeButterfly ChangeMaxOffset ReadMaxOffsetEarly ReadButterfly ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure early
     269    // NukeStructure ReadStructureEarly ChangeButterfly ChangeMaxOffset ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure early
     270    // NukeStructure ReadStructureEarly ChangeButterfly ReadMaxOffsetEarly ChangeMaxOffset RestoreStructure ReadButterfly ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     271    // NukeStructure ReadStructureEarly ChangeButterfly ReadMaxOffsetEarly ChangeMaxOffset ReadButterfly RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     272    // NukeStructure ReadStructureEarly ChangeButterfly ReadMaxOffsetEarly ChangeMaxOffset ReadButterfly ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure early
     273    // NukeStructure ReadStructureEarly ChangeButterfly ReadMaxOffsetEarly ChangeMaxOffset ReadButterfly ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure early
     274    // NukeStructure ReadStructureEarly ChangeButterfly ReadMaxOffsetEarly ReadButterfly ChangeMaxOffset RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     275    // NukeStructure ReadStructureEarly ChangeButterfly ReadMaxOffsetEarly ReadButterfly ChangeMaxOffset ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure early
     276    // NukeStructure ReadStructureEarly ChangeButterfly ReadMaxOffsetEarly ReadButterfly ChangeMaxOffset ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure early
     277    // NukeStructure ReadStructureEarly ChangeButterfly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ChangeMaxOffset RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure early
     278    // NukeStructure ReadStructureEarly ChangeButterfly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ChangeMaxOffset ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure early
     279    // NukeStructure ReadStructureEarly ChangeButterfly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure early
     280    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ChangeButterfly ChangeMaxOffset RestoreStructure ReadButterfly ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     281    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ChangeButterfly ChangeMaxOffset ReadButterfly RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     282    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ChangeButterfly ChangeMaxOffset ReadButterfly ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure early
     283    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ChangeButterfly ChangeMaxOffset ReadButterfly ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure early
     284    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ChangeButterfly ReadButterfly ChangeMaxOffset RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     285    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ChangeButterfly ReadButterfly ChangeMaxOffset ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure early
     286    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ChangeButterfly ReadButterfly ChangeMaxOffset ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure early
     287    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ChangeMaxOffset RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure early
     288    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ChangeMaxOffset ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure early
     289    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ReadMaxOffsetLate ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure early
     290    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ChangeButterfly ChangeMaxOffset RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read nuked structure early
     291    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ChangeButterfly ChangeMaxOffset ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure early
     292    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ChangeButterfly ChangeMaxOffset ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure early
     293    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ChangeMaxOffset RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure early
     294    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ChangeMaxOffset ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure early
     295    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ReadMaxOffsetLate ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure early
     296    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ChangeMaxOffset RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure early
     297    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ChangeMaxOffset ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure early
     298    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ReadMaxOffsetLate ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure early
     299    // NukeStructure ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate ChangeButterfly ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure early
     300    // ReadStructureEarly NukeStructure ChangeButterfly ChangeMaxOffset RestoreStructure ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate: AFTER, the ReadStructureEarly sees the same structure as after and everything else runs after.
     301    // ReadStructureEarly NukeStructure ChangeButterfly ChangeMaxOffset ReadMaxOffsetEarly RestoreStructure ReadButterfly ReadStructureLate ReadMaxOffsetLate: AFTER, as above and the ReadMaxOffsetEarly sees the maxOffset after.
     302    // ReadStructureEarly NukeStructure ChangeButterfly ChangeMaxOffset ReadMaxOffsetEarly ReadButterfly RestoreStructure ReadStructureLate ReadMaxOffsetLate: AFTER, as above and the ReadButterfly sees the right butterfly after.
     303    // ReadStructureEarly NukeStructure ChangeButterfly ChangeMaxOffset ReadMaxOffsetEarly ReadButterfly ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure late
     304    // ReadStructureEarly NukeStructure ChangeButterfly ChangeMaxOffset ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure late
     305    // ReadStructureEarly NukeStructure ChangeButterfly ReadMaxOffsetEarly ChangeMaxOffset RestoreStructure ReadButterfly ReadStructureLate ReadMaxOffsetLate: IGNORE, read different offsets
     306    // ReadStructureEarly NukeStructure ChangeButterfly ReadMaxOffsetEarly ChangeMaxOffset ReadButterfly RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read different offsets
     307    // ReadStructureEarly NukeStructure ChangeButterfly ReadMaxOffsetEarly ChangeMaxOffset ReadButterfly ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     308    // ReadStructureEarly NukeStructure ChangeButterfly ReadMaxOffsetEarly ChangeMaxOffset ReadButterfly ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read different offsets
     309    // ReadStructureEarly NukeStructure ChangeButterfly ReadMaxOffsetEarly ReadButterfly ChangeMaxOffset RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read different offsets
     310    // ReadStructureEarly NukeStructure ChangeButterfly ReadMaxOffsetEarly ReadButterfly ChangeMaxOffset ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     311    // ReadStructureEarly NukeStructure ChangeButterfly ReadMaxOffsetEarly ReadButterfly ChangeMaxOffset ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read different offsets
     312    // ReadStructureEarly NukeStructure ChangeButterfly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ChangeMaxOffset RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     313    // ReadStructureEarly NukeStructure ChangeButterfly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ChangeMaxOffset ReadMaxOffsetLate RestoreStructure: IGNORE, read different offsets
     314    // ReadStructureEarly NukeStructure ChangeButterfly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure late
     315    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ChangeButterfly ChangeMaxOffset RestoreStructure ReadButterfly ReadStructureLate ReadMaxOffsetLate: IGNORE, read different offsets
     316    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ChangeButterfly ChangeMaxOffset ReadButterfly RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read different offsets
     317    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ChangeButterfly ChangeMaxOffset ReadButterfly ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     318    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ChangeButterfly ChangeMaxOffset ReadButterfly ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read different offsets
     319    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ChangeButterfly ReadButterfly ChangeMaxOffset RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read different offsets
     320    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ChangeButterfly ReadButterfly ChangeMaxOffset ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     321    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ChangeButterfly ReadButterfly ChangeMaxOffset ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read different offsets
     322    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ChangeMaxOffset RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     323    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ChangeMaxOffset ReadMaxOffsetLate RestoreStructure: IGNORE, read different offsets
     324    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ReadMaxOffsetLate ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure late
     325    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ReadButterfly ChangeButterfly ChangeMaxOffset RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read different offsets
     326    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ReadButterfly ChangeButterfly ChangeMaxOffset ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     327    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ReadButterfly ChangeButterfly ChangeMaxOffset ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read different offsets
     328    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ChangeMaxOffset RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     329    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ChangeMaxOffset ReadMaxOffsetLate RestoreStructure: IGNORE, read different offsets
     330    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ReadMaxOffsetLate ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure late
     331    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ChangeMaxOffset RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     332    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ChangeMaxOffset ReadMaxOffsetLate RestoreStructure: IGNORE, read different offsets
     333    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ReadMaxOffsetLate ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure late
     334    // ReadStructureEarly NukeStructure ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate ChangeButterfly ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure late
     335    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ChangeButterfly ChangeMaxOffset RestoreStructure ReadButterfly ReadStructureLate ReadMaxOffsetLate: IGNORE, read different offsets
     336    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ChangeButterfly ChangeMaxOffset ReadButterfly RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read different offsets
     337    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ChangeButterfly ChangeMaxOffset ReadButterfly ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure late
     338    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ChangeButterfly ChangeMaxOffset ReadButterfly ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure late
     339    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ChangeButterfly ReadButterfly ChangeMaxOffset RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read different offsets
     340    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ChangeButterfly ReadButterfly ChangeMaxOffset ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     341    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ChangeButterfly ReadButterfly ChangeMaxOffset ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read different offsets
     342    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ChangeButterfly ReadButterfly ReadStructureLate ChangeMaxOffset RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     343    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ChangeButterfly ReadButterfly ReadStructureLate ChangeMaxOffset ReadMaxOffsetLate RestoreStructure: IGNORE, read different offsets
     344    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ChangeButterfly ReadButterfly ReadStructureLate ReadMaxOffsetLate ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure late
     345    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ReadButterfly ChangeButterfly ChangeMaxOffset RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read different offsets
     346    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ReadButterfly ChangeButterfly ChangeMaxOffset ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     347    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ReadButterfly ChangeButterfly ChangeMaxOffset ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read different offsets
     348    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ReadButterfly ChangeButterfly ReadStructureLate ChangeMaxOffset RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     349    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ReadButterfly ChangeButterfly ReadStructureLate ChangeMaxOffset ReadMaxOffsetLate RestoreStructure: IGNORE, read different offsets
     350    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ReadButterfly ChangeButterfly ReadStructureLate ReadMaxOffsetLate ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure late
     351    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ReadButterfly ReadStructureLate ChangeButterfly ChangeMaxOffset RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     352    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ReadButterfly ReadStructureLate ChangeButterfly ChangeMaxOffset ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure late
     353    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ReadButterfly ReadStructureLate ChangeButterfly ReadMaxOffsetLate ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure late
     354    // ReadStructureEarly ReadMaxOffsetEarly NukeStructure ReadButterfly ReadStructureLate ReadMaxOffsetLate ChangeButterfly ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure late
     355    // ReadStructureEarly ReadMaxOffsetEarly ReadButterfly NukeStructure ChangeButterfly ChangeMaxOffset RestoreStructure ReadStructureLate ReadMaxOffsetLate: IGNORE, read different offsets
     356    // ReadStructureEarly ReadMaxOffsetEarly ReadButterfly NukeStructure ChangeButterfly ChangeMaxOffset ReadStructureLate RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     357    // ReadStructureEarly ReadMaxOffsetEarly ReadButterfly NukeStructure ChangeButterfly ChangeMaxOffset ReadStructureLate ReadMaxOffsetLate RestoreStructure: IGNORE, read different offsets
     358    // ReadStructureEarly ReadMaxOffsetEarly ReadButterfly NukeStructure ChangeButterfly ReadStructureLate ChangeMaxOffset RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     359    // ReadStructureEarly ReadMaxOffsetEarly ReadButterfly NukeStructure ChangeButterfly ReadStructureLate ChangeMaxOffset ReadMaxOffsetLate RestoreStructure: IGNORE, read different offsets
     360    // ReadStructureEarly ReadMaxOffsetEarly ReadButterfly NukeStructure ChangeButterfly ReadStructureLate ReadMaxOffsetLate ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure late
     361    // ReadStructureEarly ReadMaxOffsetEarly ReadButterfly NukeStructure ReadStructureLate ChangeButterfly ChangeMaxOffset RestoreStructure ReadMaxOffsetLate: IGNORE, read nuked structure late
     362    // ReadStructureEarly ReadMaxOffsetEarly ReadButterfly NukeStructure ReadStructureLate ChangeButterfly ChangeMaxOffset ReadMaxOffsetLate RestoreStructure: IGNORE, read nuked structure late
     363    // ReadStructureEarly ReadMaxOffsetEarly ReadButterfly NukeStructure ReadStructureLate ChangeButterfly ReadMaxOffsetLate ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure late
     364    // ReadStructureEarly ReadMaxOffsetEarly ReadButterfly NukeStructure ReadStructureLate ReadMaxOffsetLate ChangeButterfly ChangeMaxOffset RestoreStructure: IGNORE, read nuked structure late
     365    // ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate NukeStructure ChangeButterfly ChangeMaxOffset RestoreStructure ReadMaxOffsetLate: IGNORE, read different offsets
     366    // ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate NukeStructure ChangeButterfly ChangeMaxOffset ReadMaxOffsetLate RestoreStructure: IGNORE, read different offsets
     367    // ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate NukeStructure ChangeButterfly ReadMaxOffsetLate ChangeMaxOffset RestoreStructure: BEFORE, reads the offset before, everything else happens before
     368    // ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate NukeStructure ReadMaxOffsetLate ChangeButterfly ChangeMaxOffset RestoreStructure: BEFORE, reads the offset before, everything else happens before
     369    // ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate NukeStructure ChangeButterfly ChangeMaxOffset RestoreStructure: BEFORE, trivially
    370370    //
    371371    // Whew.
     
    393393        return nullptr;
    394394    structure = vm.getStructure(structureID);
    395     lastOffset = structure->lastOffset();
     395    maxOffset = structure->maxOffset();
    396396    IndexingType indexingMode = structure->indexingMode();
    397397    Dependency indexingModeDependency = Dependency::fence(indexingMode);
     
    416416    if (butterflyDependency.consume(this)->structureID() != structureID)
    417417        return nullptr;
    418     if (butterflyDependency.consume(structure)->lastOffset() != lastOffset)
     418    if (butterflyDependency.consume(structure)->maxOffset() != maxOffset)
    419419        return nullptr;
    420420   
    421     markAuxiliaryAndVisitOutOfLineProperties(visitor, butterfly, structure, lastOffset);
     421    markAuxiliaryAndVisitOutOfLineProperties(visitor, butterfly, structure, maxOffset);
    422422    ASSERT(indexingMode == structure->indexingMode());
    423423    visitElements(indexingMode);
  • trunk/Source/JavaScriptCore/runtime/JSObject.h

    r253867 r254760  
    942942    Structure* visitButterflyImpl(SlotVisitor&);
    943943   
    944     void markAuxiliaryAndVisitOutOfLineProperties(SlotVisitor&, Butterfly*, Structure*, PropertyOffset lastOffset);
     944    void markAuxiliaryAndVisitOutOfLineProperties(SlotVisitor&, Butterfly*, Structure*, PropertyOffset maxOffset);
    945945
    946946    // Call this if you know that the object is in a mode where it has array
  • trunk/Source/JavaScriptCore/runtime/JSObjectInlines.h

    r254087 r254760  
    217217    structure->addPropertyWithoutTransition(
    218218        vm, propertyName, attributes,
    219         [&] (const GCSafeConcurrentJSLocker&, PropertyOffset offset, PropertyOffset newLastOffset) {
    220             unsigned newOutOfLineCapacity = Structure::outOfLineCapacity(newLastOffset);
     219        [&] (const GCSafeConcurrentJSLocker&, PropertyOffset offset, PropertyOffset newMaxOffset) {
     220            unsigned newOutOfLineCapacity = Structure::outOfLineCapacity(newMaxOffset);
    221221            if (newOutOfLineCapacity != oldOutOfLineCapacity) {
    222222                Butterfly* butterfly = allocateMoreOutOfLineStorage(vm, oldOutOfLineCapacity, newOutOfLineCapacity);
    223223                nukeStructureAndSetButterfly(vm, structureID, butterfly);
    224                 structure->setLastOffset(newLastOffset);
     224                structure->setMaxOffset(vm, newMaxOffset);
    225225                WTF::storeStoreFence();
    226226                setStructureIDDirectly(structureID);
    227227            } else
    228                 structure->setLastOffset(newLastOffset);
     228                structure->setMaxOffset(vm, newMaxOffset);
    229229
    230230            // This assertion verifies that the concurrent GC won't read garbage if the concurrentGC
  • trunk/Source/JavaScriptCore/runtime/ObjectInitializationScope.cpp

    r251456 r254760  
    105105    for (int64_t i = 0; i < static_cast<int64_t>(structure->outOfLineCapacity()); i++) {
    106106        // We rely on properties past the last offset be zero for concurrent GC.
    107         if (i + firstOutOfLineOffset > structure->lastOffset())
     107        if (i + firstOutOfLineOffset > structure->maxOffset())
    108108            ASSERT(isSafeEmptyValueForGCScanning(butterfly->propertyStorage()[-i - 1].get()));
    109109        else if (isScribbledValue(butterfly->propertyStorage()[-i - 1].get())) {
  • trunk/Source/JavaScriptCore/runtime/PropertyOffset.h

    r223715 r254760  
    4848inline size_t offsetInOutOfLineStorage(PropertyOffset);
    4949inline size_t offsetInRespectiveStorage(PropertyOffset);
    50 inline size_t numberOfOutOfLineSlotsForLastOffset(PropertyOffset);
    51 inline size_t numberOfSlotsForLastOffset(PropertyOffset, int inlineCapacity);
     50inline size_t numberOfOutOfLineSlotsForMaxOffset(PropertyOffset);
     51inline size_t numberOfSlotsForMaxOffset(PropertyOffset, int inlineCapacity);
    5252
    5353inline void checkOffset(PropertyOffset offset)
     
    118118}
    119119
    120 inline size_t numberOfOutOfLineSlotsForLastOffset(PropertyOffset offset)
     120inline size_t numberOfOutOfLineSlotsForMaxOffset(PropertyOffset offset)
    121121{
    122122    checkOffset(offset);
     
    126126}
    127127
    128 inline size_t numberOfSlotsForLastOffset(PropertyOffset offset, int inlineCapacity)
     128inline size_t numberOfSlotsForMaxOffset(PropertyOffset offset, int inlineCapacity)
    129129{
    130130    checkOffset(offset, inlineCapacity);
    131131    if (offset < inlineCapacity)
    132132        return offset + 1;
    133     return inlineCapacity + numberOfOutOfLineSlotsForLastOffset(offset);
     133    return inlineCapacity + numberOfOutOfLineSlotsForMaxOffset(offset);
    134134}
    135135
  • trunk/Source/JavaScriptCore/runtime/Structure.cpp

    r253931 r254760  
    9292    if (isUsingSingleSlot()) {
    9393        Structure* transition = singleTransition();
    94         return transition && transition->m_nameInPrevious == rep && transition->attributesInPrevious() == attributes;
     94        return transition && transition->m_transitionPropertyName == rep && transition->transitionPropertyAttributes() == attributes;
    9595    }
    9696    return map()->get(std::make_pair(rep, attributes));
     
    101101    if (isUsingSingleSlot()) {
    102102        Structure* transition = singleTransition();
    103         return (transition && transition->m_nameInPrevious == rep && transition->attributesInPrevious() == attributes) ? transition : 0;
     103        return (transition && transition->m_transitionPropertyName == rep && transition->transitionPropertyAttributes() == attributes) ? transition : 0;
    104104    }
    105105    return map()->get(std::make_pair(rep, attributes));
     
    128128    // When either of the parameters are bitfields, the C++ compiler will try to bind them as lvalues, which is invalid. To work around this, use unary "+" to make the parameter an rvalue.
    129129    // See https://bugs.webkit.org/show_bug.cgi?id=59261 for more details
    130     map()->set(std::make_pair(structure->m_nameInPrevious.get(), +structure->attributesInPrevious()), structure);
     130    map()->set(std::make_pair(structure->m_transitionPropertyName.get(), +structure->transitionPropertyAttributes()), structure);
    131131}
    132132
     
    186186    , m_classInfo(classInfo)
    187187    , m_transitionWatchpointSet(IsWatched)
    188     , m_offset(invalidOffset)
    189188    , m_propertyHash(0)
    190189{
     
    196195    setHasUnderscoreProtoPropertyExcludingOriginalProto(false);
    197196    setIsQuickPropertyAccessAllowedForEnumeration(true);
    198     setAttributesInPrevious(0);
     197    setTransitionPropertyAttributes(0);
    199198    setDidPreventExtensions(false);
    200199    setDidTransition(false);
     
    203202    setHasBeenDictionary(false);
    204203    setIsAddingPropertyForTransition(false);
     204    setTransitionOffset(vm, invalidOffset);
     205    setMaxOffset(vm, invalidOffset);
    205206 
    206207    ASSERT(inlineCapacity <= JSFinalObject::maxInlineCapacity());
     
    221222    , m_classInfo(info())
    222223    , m_transitionWatchpointSet(IsWatched)
    223     , m_offset(invalidOffset)
    224224    , m_propertyHash(0)
    225225{
     
    231231    setHasUnderscoreProtoPropertyExcludingOriginalProto(false);
    232232    setIsQuickPropertyAccessAllowedForEnumeration(true);
    233     setAttributesInPrevious(0);
     233    setTransitionPropertyAttributes(0);
    234234    setDidPreventExtensions(false);
    235235    setDidTransition(false);
     
    238238    setHasBeenDictionary(false);
    239239    setIsAddingPropertyForTransition(false);
     240    setTransitionOffset(vm, invalidOffset);
     241    setMaxOffset(vm, invalidOffset);
    240242 
    241243    TypeInfo typeInfo = TypeInfo(CellType, StructureFlags);
     
    255257    , m_classInfo(previous->m_classInfo)
    256258    , m_transitionWatchpointSet(IsWatched)
    257     , m_offset(invalidOffset)
    258259    , m_propertyHash(previous->m_propertyHash)
    259260    , m_seenProperties(previous->m_seenProperties)
     
    267268    setHasUnderscoreProtoPropertyExcludingOriginalProto(previous->hasUnderscoreProtoPropertyExcludingOriginalProto());
    268269    setIsQuickPropertyAccessAllowedForEnumeration(previous->isQuickPropertyAccessAllowedForEnumeration());
    269     setAttributesInPrevious(0);
     270    setTransitionPropertyAttributes(0);
    270271    setDidPreventExtensions(previous->didPreventExtensions());
    271272    setDidTransition(true);
     
    273274    setHasBeenDictionary(previous->hasBeenDictionary());
    274275    setIsAddingPropertyForTransition(false);
     276    setTransitionOffset(vm, invalidOffset);
     277    setMaxOffset(vm, invalidOffset);
    275278 
    276279    TypeInfo typeInfo = previous->typeInfo();
     
    312315    result->addPropertyWithoutTransition(
    313316        vm, vm.propertyNames->builtinNames().polyProtoName(), static_cast<unsigned>(PropertyAttribute::DontEnum),
    314         [&] (const GCSafeConcurrentJSLocker&, PropertyOffset offset, PropertyOffset newLastOffset) {
    315             RELEASE_ASSERT(Structure::outOfLineCapacity(newLastOffset) == oldOutOfLineCapacity);
     317        [&] (const GCSafeConcurrentJSLocker&, PropertyOffset offset, PropertyOffset newMaxOffset) {
     318            RELEASE_ASSERT(Structure::outOfLineCapacity(newMaxOffset) == oldOutOfLineCapacity);
    316319            RELEASE_ASSERT(offset == knownPolyProtoOffset);
    317320            RELEASE_ASSERT(isInlineOffset(knownPolyProtoOffset));
    318321            result->m_prototype.setWithoutWriteBarrier(JSValue());
    319             result->setLastOffset(newLastOffset);
     322            result->setMaxOffset(vm, newMaxOffset);
    320323        });
    321324
     
    364367    findStructuresAndMapForMaterialization(structures, structure, table);
    365368   
    366     unsigned capacity = numberOfSlotsForLastOffset(m_offset, m_inlineCapacity);
     369    unsigned capacity = numberOfSlotsForMaxOffset(maxOffset(), m_inlineCapacity);
    367370    if (table) {
    368371        table = table->copy(vm, capacity);
     
    380383    for (size_t i = structures.size(); i--;) {
    381384        structure = structures[i];
    382         if (!structure->m_nameInPrevious)
     385        if (!structure->m_transitionPropertyName)
    383386            continue;
    384         PropertyMapEntry entry(structure->m_nameInPrevious.get(), structure->m_offset, structure->attributesInPrevious());
    385         table->add(entry, m_offset, PropertyTable::PropertyOffsetMustNotChange);
     387        ASSERT(i == structures.size() - 1 || structure->maxOffset() > structures[i + 1]->maxOffset());
     388        PropertyMapEntry entry(structure->m_transitionPropertyName.get(), structure->transitionOffset(), structure->transitionPropertyAttributes());
     389        auto maxOffset = this->maxOffset();
     390        table->add(entry, maxOffset, PropertyTable::PropertyOffsetMustNotChange);
    386391    }
    387392   
     
    407412
    408413    if (Structure* existingTransition = structure->m_transitionTable.get(uid, attributes)) {
    409         validateOffset(existingTransition->m_offset, existingTransition->inlineCapacity());
    410         offset = existingTransition->m_offset;
     414        validateOffset(existingTransition->transitionOffset(), existingTransition->inlineCapacity());
     415        offset = existingTransition->transitionOffset();
    411416        return existingTransition;
    412417    }
     
    475480    else
    476481        maxTransitionLength = s_maxTransitionLength;
    477     if (structure->transitionCount() > maxTransitionLength) {
     482    if (structure->transitionCountEstimate() > maxTransitionLength) {
    478483        ASSERT(!isCopyOnWrite(structure->indexingMode()));
    479484        Structure* transition = toCacheableDictionaryTransition(vm, structure, deferred);
    480485        ASSERT(structure != transition);
    481486        offset = transition->add(vm, propertyName, attributes);
     487        transition->setTransitionOffset(vm, offset);
    482488        return transition;
    483489    }
     
    488494   
    489495    // While we are adding the property, rematerializing the property table is super weird: we already
    490     // have a m_nameInPrevious and attributesInPrevious but the m_offset is still wrong. If the
     496    // have a m_transitionPropertyName and transitionPropertyAttributes but the m_transitionOffset is still wrong. If the
    491497    // materialization algorithm runs, it'll build a property table that already has the property but
    492498    // at a bogus offset. Rather than try to teach the materialization code how to create a table under
     
    502508
    503509    transition->m_blob.setIndexingModeIncludingHistory(structure->indexingModeIncludingHistory() & ~CopyOnWrite);
    504     transition->m_nameInPrevious = propertyName.uid();
    505     transition->setAttributesInPrevious(attributes);
     510    transition->m_transitionPropertyName = propertyName.uid();
     511    transition->setTransitionPropertyAttributes(attributes);
    506512    transition->setPropertyTable(vm, structure->takePropertyTableOrCloneIfPinned(vm));
    507     transition->m_offset = structure->m_offset;
     513    transition->setMaxOffset(vm, structure->maxOffset());
    508514
    509515    offset = transition->add(vm, propertyName, attributes);
     516    transition->setTransitionOffset(vm, offset);
    510517
    511518    // Now that everything is fine with the new structure's bookkeeping, the GC is free to blow the
     
    514521    transition->setIsAddingPropertyForTransition(false);
    515522
    516     checkOffset(transition->m_offset, transition->inlineCapacity());
     523    checkOffset(transition->transitionOffset(), transition->inlineCapacity());
    517524    {
    518525        ConcurrentJSLocker locker(structure->m_lock);
     
    560567    PropertyTable* table = structure->copyPropertyTableForPinning(vm);
    561568    transition->pin(holdLock(transition->m_lock), vm, table);
    562     transition->m_offset = structure->m_offset;
     569    transition->setMaxOffset(vm, structure->maxOffset());
    563570   
    564571    transition->checkOffsetConsistency();
     
    573580        PropertyTable* table = structure->copyPropertyTableForPinning(vm);
    574581        transition->pin(holdLock(transition->m_lock), vm, table);
    575         transition->m_offset = structure->m_offset;
     582        transition->setMaxOffset(vm, structure->maxOffset());
    576583       
    577584        structure = transition;
     
    595602    PropertyTable* table = structure->copyPropertyTableForPinning(vm);
    596603    transition->pin(holdLock(transition->m_lock), vm, table);
    597     transition->m_offset = structure->m_offset;
     604    transition->setMaxOffset(vm, structure->maxOffset());
    598605    transition->setDictionaryKind(kind);
    599606    transition->setHasBeenDictionary(true);
     
    650657    Structure* existingTransition;
    651658    if (!structure->isDictionary() && (existingTransition = structure->m_transitionTable.get(0, attributes))) {
    652         ASSERT(existingTransition->attributesInPrevious() == attributes);
     659        ASSERT(existingTransition->transitionPropertyAttributes() == attributes);
    653660        ASSERT(existingTransition->indexingModeIncludingHistory() == indexingModeIncludingHistory);
    654661        return existingTransition;
     
    658665   
    659666    Structure* transition = create(vm, structure);
    660     transition->setAttributesInPrevious(attributes);
     667    transition->setTransitionPropertyAttributes(attributes);
    661668    transition->m_blob.setIndexingModeIncludingHistory(indexingModeIncludingHistory);
    662669   
     
    672679        PropertyTable* table = structure->copyPropertyTableForPinning(vm);
    673680        transition->pinForCaching(holdLock(transition->m_lock), vm, table);
    674         transition->m_offset = structure->m_offset;
     681        transition->setMaxOffset(vm, structure->maxOffset());
    675682       
    676683        table = transition->propertyTableOrNull();
     
    684691    } else {
    685692        transition->setPropertyTable(vm, structure->takePropertyTableOrCloneIfPinned(vm));
    686         transition->m_offset = structure->m_offset;
    687         checkOffset(transition->m_offset, transition->inlineCapacity());
     693        transition->setMaxOffset(vm, structure->maxOffset());
     694        checkOffset(transition->maxOffset(), transition->inlineCapacity());
    688695    }
    689696   
     
    765772        unsigned i = 0;
    766773        PropertyTable::iterator end = table->end();
    767         m_offset = invalidOffset;
     774        auto offset = invalidOffset;
    768775        for (PropertyTable::iterator iter = table->begin(); iter != end; ++iter, ++i) {
    769776            values[i] = object->getDirect(iter->offset);
    770             m_offset = iter->offset = offsetForPropertyNumber(i, m_inlineCapacity);
     777            offset = iter->offset = offsetForPropertyNumber(i, m_inlineCapacity);
    771778        }
     779        setMaxOffset(vm, offset);
     780        ASSERT(transitionOffset() == invalidOffset);
    772781       
    773782        // Copies in our values to their compacted locations.
     
    824833    setPropertyTable(vm, table);
    825834    clearPreviousID();
    826     m_nameInPrevious = nullptr;
     835    m_transitionPropertyName = nullptr;
    827836}
    828837
     
    831840    setIsPinnedPropertyTable(true);
    832841    setPropertyTable(vm, table);
    833     m_nameInPrevious = nullptr;
     842    m_transitionPropertyName = nullptr;
    834843}
    835844
     
    963972    return add<ShouldPin::No>(
    964973        vm, propertyName, attributes,
    965         [this] (const GCSafeConcurrentJSLocker&, PropertyOffset, PropertyOffset newLastOffset) {
    966             setLastOffset(newLastOffset);
     974        [this, &vm] (const GCSafeConcurrentJSLocker&, PropertyOffset, PropertyOffset newMaxOffset) {
     975            setMaxOffset(vm, newMaxOffset);
    967976        });
    968977}
  • trunk/Source/JavaScriptCore/runtime/Structure.h

    r253931 r254760  
    353353    }
    354354    bool transitivelyTransitionedFrom(Structure* structureToFind);
    355    
    356     PropertyOffset lastOffset() const { return m_offset; }
    357    
    358     void setLastOffset(PropertyOffset offset) { m_offset = offset; }
    359 
    360     static unsigned outOfLineCapacity(PropertyOffset lastOffset)
    361     {
    362         unsigned outOfLineSize = Structure::outOfLineSize(lastOffset);
     355
     356    PropertyOffset maxOffset() const
     357    {
     358        if (m_maxOffset == shortInvalidOffset)
     359            return invalidOffset;
     360        if (m_maxOffset == useRareDataFlag)
     361            return rareData()->m_maxOffset;
     362        return m_maxOffset;
     363    }
     364   
     365    void setMaxOffset(VM& vm, PropertyOffset offset)
     366    {
     367        if (offset == invalidOffset)
     368            m_maxOffset = shortInvalidOffset;
     369        else if (offset < useRareDataFlag && offset < shortInvalidOffset)
     370            m_maxOffset = offset;
     371        else {
     372            m_maxOffset = useRareDataFlag;
     373            ensureRareData(vm)->m_maxOffset = offset;
     374        }
     375    }
     376
     377    PropertyOffset transitionOffset() const
     378    {
     379        if (m_transitionOffset == shortInvalidOffset)
     380            return invalidOffset;
     381        if (m_transitionOffset == useRareDataFlag)
     382            return rareData()->m_transitionOffset;
     383        return m_transitionOffset;
     384    }
     385
     386    void setTransitionOffset(VM& vm, PropertyOffset offset)
     387    {
     388        if (offset == invalidOffset)
     389            m_transitionOffset = shortInvalidOffset;
     390        else if (offset < useRareDataFlag && offset < shortInvalidOffset)
     391            m_transitionOffset = offset;
     392        else {
     393            m_transitionOffset = useRareDataFlag;
     394            ensureRareData(vm)->m_transitionOffset = offset;
     395        }
     396    }
     397
     398    static unsigned outOfLineCapacity(PropertyOffset maxOffset)
     399    {
     400        unsigned outOfLineSize = Structure::outOfLineSize(maxOffset);
    363401
    364402        // This algorithm completely determines the out-of-line property storage growth algorithm.
     
    378416    }
    379417   
    380     static unsigned outOfLineSize(PropertyOffset lastOffset)
    381     {
    382         return numberOfOutOfLineSlotsForLastOffset(lastOffset);
     418    static unsigned outOfLineSize(PropertyOffset maxOffset)
     419    {
     420        return numberOfOutOfLineSlotsForMaxOffset(maxOffset);
    383421    }
    384422
    385423    unsigned outOfLineCapacity() const
    386424    {
    387         return outOfLineCapacity(m_offset);
     425        return outOfLineCapacity(maxOffset());
    388426    }
    389427    unsigned outOfLineSize() const
    390428    {
    391         return outOfLineSize(m_offset);
     429        return outOfLineSize(maxOffset());
    392430    }
    393431    bool hasInlineStorage() const
     
    401439    unsigned inlineSize() const
    402440    {
    403         return std::min<unsigned>(m_offset + 1, m_inlineCapacity);
     441        return std::min<unsigned>(maxOffset() + 1, m_inlineCapacity);
    404442    }
    405443    unsigned totalStorageSize() const
    406444    {
    407         return numberOfSlotsForLastOffset(m_offset, m_inlineCapacity);
     445        return numberOfSlotsForMaxOffset(maxOffset(), m_inlineCapacity);
    408446    }
    409447    unsigned totalStorageCapacity() const
     
    416454    {
    417455        return JSC::isValidOffset(offset)
    418             && offset <= m_offset
     456            && offset <= maxOffset()
    419457            && (offset < m_inlineCapacity || offset >= firstOutOfLineOffset);
    420458    }
     
    467505        if (!is__proto__)
    468506            setHasReadOnlyOrGetterSetterPropertiesExcludingProto(true);
    469     }
    470    
    471     bool isEmpty() const
    472     {
    473         ASSERT(checkOffsetConsistency());
    474         return !JSC::isValidOffset(m_offset);
    475507    }
    476508
     
    651683    DEFINE_BITFIELD(bool, hasReadOnlyOrGetterSetterPropertiesExcludingProto, HasReadOnlyOrGetterSetterPropertiesExcludingProto, 1, 4);
    652684    DEFINE_BITFIELD(bool, isQuickPropertyAccessAllowedForEnumeration, IsQuickPropertyAccessAllowedForEnumeration, 1, 5);
    653     DEFINE_BITFIELD(unsigned, attributesInPrevious, AttributesInPrevious, 14, 6);
     685    DEFINE_BITFIELD(unsigned, transitionPropertyAttributes, TransitionPropertyAttributes, 14, 6);
    654686    DEFINE_BITFIELD(bool, didPreventExtensions, DidPreventExtensions, 1, 20);
    655687    DEFINE_BITFIELD(bool, didTransition, DidTransition, 1, 21);
     
    733765    }
    734766
    735     int transitionCount() const
    736     {
    737         // Since the number of transitions is always the same as m_offset, we keep the size of Structure down by not storing both.
    738         return numberOfSlotsForLastOffset(m_offset, m_inlineCapacity);
     767    int transitionCountEstimate() const
     768    {
     769        // Since the number of transitions is often the same as the last offset (except if there are deletes)
     770        // we keep the size of Structure down by not storing both.
     771        return numberOfSlotsForMaxOffset(maxOffset(), m_inlineCapacity);
    739772    }
    740773
     
    778811    WriteBarrier<JSCell> m_previousOrRareData;
    779812
    780     RefPtr<UniquedStringImpl> m_nameInPrevious;
     813    RefPtr<UniquedStringImpl> m_transitionPropertyName;
    781814
    782815    const ClassInfo* m_classInfo;
     
    792825    COMPILE_ASSERT(firstOutOfLineOffset < 256, firstOutOfLineOffset_fits);
    793826
    794     // m_offset does not account for anonymous slots
    795     PropertyOffset m_offset;
     827    static constexpr uint16_t shortInvalidOffset = std::numeric_limits<uint16_t>::max();
     828    static constexpr uint16_t useRareDataFlag = std::numeric_limits<uint16_t>::max() - 1;
     829
     830    uint16_t m_transitionOffset;
     831    uint16_t m_maxOffset;
    796832
    797833    uint32_t m_propertyHash;
  • trunk/Source/JavaScriptCore/runtime/StructureInlines.h

    r253931 r254760  
    181181    for (unsigned i = structures.size(); i--;) {
    182182        structure = structures[i];
    183         if (!structure->m_nameInPrevious)
     183        if (!structure->m_transitionPropertyName)
    184184            continue;
    185185       
    186         if (!functor(PropertyMapEntry(structure->m_nameInPrevious.get(), structure->m_offset, structure->attributesInPrevious())))
     186        if (!functor(PropertyMapEntry(structure->m_transitionPropertyName.get(), structure->transitionOffset(), structure->transitionPropertyAttributes())))
    187187            return;
    188188    }
     
    365365        dataLog("Detected offset inconsistency: ", description, "!\n");
    366366        dataLog("this = ", RawPointer(this), "\n");
    367         dataLog("m_offset = ", m_offset, "\n");
     367        dataLog("transitionOffset = ", transitionOffset(), "\n");
     368        dataLog("maxOffset = ", maxOffset(), "\n");
    368369        dataLog("m_inlineCapacity = ", m_inlineCapacity, "\n");
    369370        dataLog("propertyTable = ", RawPointer(propertyTable), "\n");
    370         dataLog("numberOfSlotsForLastOffset = ", numberOfSlotsForLastOffset(m_offset, m_inlineCapacity), "\n");
     371        dataLog("numberOfSlotsForMaxOffset = ", numberOfSlotsForMaxOffset(maxOffset(), m_inlineCapacity), "\n");
    371372        dataLog("totalSize = ", totalSize, "\n");
    372373        dataLog("inlineOverflowAccordingToTotalSize = ", inlineOverflowAccordingToTotalSize, "\n");
    373         dataLog("numberOfOutOfLineSlotsForLastOffset = ", numberOfOutOfLineSlotsForLastOffset(m_offset), "\n");
     374        dataLog("numberOfOutOfLineSlotsForMaxOffset = ", numberOfOutOfLineSlotsForMaxOffset(maxOffset()), "\n");
    374375        detailsFunc();
    375376        UNREACHABLE_FOR_PLATFORM();
    376377    };
    377378   
    378     if (numberOfSlotsForLastOffset(m_offset, m_inlineCapacity) != totalSize)
    379         fail("numberOfSlotsForLastOffset doesn't match totalSize");
    380     if (inlineOverflowAccordingToTotalSize != numberOfOutOfLineSlotsForLastOffset(m_offset))
    381         fail("inlineOverflowAccordingToTotalSize doesn't match numberOfOutOfLineSlotsForLastOffset");
     379    if (numberOfSlotsForMaxOffset(maxOffset(), m_inlineCapacity) != totalSize)
     380        fail("numberOfSlotsForMaxOffset doesn't match totalSize");
     381    if (inlineOverflowAccordingToTotalSize != numberOfOutOfLineSlotsForMaxOffset(maxOffset()))
     382        fail("inlineOverflowAccordingToTotalSize doesn't match numberOfOutOfLineSlotsForMaxOffset");
    382383
    383384    return true;
     
    454455    m_seenProperties.add(bitwise_cast<uintptr_t>(rep));
    455456   
    456     PropertyOffset newLastOffset = m_offset;
    457     table->add(PropertyMapEntry(rep, newOffset, attributes), newLastOffset, PropertyTable::PropertyOffsetMayChange);
    458    
    459     func(locker, newOffset, newLastOffset);
    460    
    461     ASSERT(m_offset == newLastOffset);
     457    PropertyOffset newMaxOffset = maxOffset();
     458    table->add(PropertyMapEntry(rep, newOffset, attributes), newMaxOffset, PropertyTable::PropertyOffsetMayChange);
     459   
     460    func(locker, newOffset, newMaxOffset);
     461   
     462    ASSERT(maxOffset() == newMaxOffset);
    462463
    463464    checkConsistency();
  • trunk/Source/JavaScriptCore/runtime/StructureRareData.cpp

    r253810 r254760  
    5959    : JSCell(vm, vm.structureRareDataStructure.get())
    6060    , m_giveUpOnObjectToStringValueCache(false)
     61    , m_maxOffset(invalidOffset)
     62    , m_transitionOffset(invalidOffset)
    6163{
    6264    if (previous)
  • trunk/Source/JavaScriptCore/runtime/StructureRareData.h

    r251425 r254760  
    115115    Box<InlineWatchpointSet> m_polyProtoWatchpoint;
    116116    bool m_giveUpOnObjectToStringValueCache;
     117
     118    PropertyOffset m_maxOffset;
     119    PropertyOffset m_transitionOffset;
    117120};
    118121
Note: See TracChangeset for help on using the changeset viewer.