Changeset 254760 in webkit
- Timestamp:
- Jan 17, 2020 12:38:08 PM (4 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r254757 r254760 1 2020-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 1 66 2020-01-17 Alexey Shvayka <shvaikalesh@gmail.com> 2 67 -
trunk/Source/JavaScriptCore/runtime/ClonedArguments.cpp
r251425 r254760 154 154 structure->addPropertyWithoutTransition( 155 155 vm, vm.propertyNames->length, static_cast<unsigned>(PropertyAttribute::DontEnum), 156 [&] (const GCSafeConcurrentJSLocker&, PropertyOffset offset, PropertyOffset new LastOffset) {156 [&] (const GCSafeConcurrentJSLocker&, PropertyOffset offset, PropertyOffset newMaxOffset) { 157 157 RELEASE_ASSERT(offset == clonedArgumentsLengthPropertyOffset); 158 structure->set LastOffset(newLastOffset);158 structure->setMaxOffset(vm, newMaxOffset); 159 159 }); 160 160 return structure; -
trunk/Source/JavaScriptCore/runtime/JSObject.cpp
r254087 r254760 93 93 } 94 94 95 ALWAYS_INLINE void JSObject::markAuxiliaryAndVisitOutOfLineProperties(SlotVisitor& visitor, Butterfly* butterfly, Structure* structure, PropertyOffset lastOffset)95 ALWAYS_INLINE void JSObject::markAuxiliaryAndVisitOutOfLineProperties(SlotVisitor& visitor, Butterfly* butterfly, Structure* structure, PropertyOffset maxOffset) 96 96 { 97 97 // We call this when we found everything without races. … … 114 114 115 115 HeapCell* base = bitwise_cast<HeapCell*>( 116 butterfly->base(preCapacity, Structure::outOfLineCapacity( lastOffset)));116 butterfly->base(preCapacity, Structure::outOfLineCapacity(maxOffset))); 117 117 118 118 ASSERT(Heap::heap(base) == visitor.heap()); … … 120 120 visitor.markAuxiliary(base); 121 121 122 unsigned outOfLineSize = Structure::outOfLineSize( lastOffset);122 unsigned outOfLineSize = Structure::outOfLineSize(maxOffset); 123 123 visitor.appendValuesHidden(butterfly->propertyStorage() - outOfLineSize, outOfLineSize); 124 124 } … … 139 139 Butterfly* butterfly; 140 140 Structure* structure; 141 PropertyOffset lastOffset;141 PropertyOffset maxOffset; 142 142 143 143 auto visitElements = [&] (IndexingType indexingMode) { … … 160 160 butterfly = this->butterfly(); 161 161 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); 165 165 visitElements(structure->indexingMode()); 166 166 … … 175 175 // object->structure = nuke(object->structure) 176 176 // object->butterfly = newButterfly 177 // structure->m_offset = new LastOffset177 // structure->m_offset = newMaxOffset 178 178 // object->structure = newStructure 179 179 // … … 231 231 // mutator changing the size without changing the structure: 232 232 // 233 // NukeStructure ChangeButterfly Change LastOffset RestoreStructure233 // NukeStructure ChangeButterfly ChangeMaxOffset RestoreStructure 234 234 // 235 235 // Meanwhile the collector does: 236 236 // 237 // ReadStructureEarly Read LastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate237 // ReadStructureEarly ReadMaxOffsetEarly ReadButterfly ReadStructureLate ReadMaxOffsetLate 238 238 // 239 239 // The collector can detect races by not only comparing the early structure to the late structure 240 240 // (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 will241 // late maxOffsets. Note: the IGNORE proofs do not cite all of the reasons why the collector will 242 242 // ignore the case, since we only need to identify one to say that we're in the ignore case. 243 243 // 244 // NukeStructure ChangeButterfly Change LastOffset RestoreStructure ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate: AFTER, trivially245 // NukeStructure ChangeButterfly Change LastOffset ReadStructureEarly RestoreStructure ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early246 // NukeStructure ChangeButterfly Change LastOffset ReadStructureEarly ReadLastOffsetEarly RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early247 // NukeStructure ChangeButterfly Change LastOffset ReadStructureEarly ReadLastOffsetEarly ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early248 // NukeStructure ChangeButterfly Change LastOffset ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early249 // NukeStructure ChangeButterfly Change LastOffset ReadStructureEarly ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early250 // NukeStructure ChangeButterfly ReadStructureEarly Change LastOffset RestoreStructure ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early251 // NukeStructure ChangeButterfly ReadStructureEarly Change LastOffset ReadLastOffsetEarly RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early252 // NukeStructure ChangeButterfly ReadStructureEarly Change LastOffset ReadLastOffsetEarly ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early253 // NukeStructure ChangeButterfly ReadStructureEarly Change LastOffset ReadLastOffsetEarly ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early254 // NukeStructure ChangeButterfly ReadStructureEarly Change LastOffset ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early255 // NukeStructure ChangeButterfly ReadStructureEarly Read LastOffsetEarly ChangeLastOffset RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early256 // NukeStructure ChangeButterfly ReadStructureEarly Read LastOffsetEarly ChangeLastOffset ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early257 // NukeStructure ChangeButterfly ReadStructureEarly Read LastOffsetEarly ChangeLastOffset ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early258 // NukeStructure ChangeButterfly ReadStructureEarly Read LastOffsetEarly ChangeLastOffset ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early259 // NukeStructure ChangeButterfly ReadStructureEarly Read LastOffsetEarly ReadButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early260 // NukeStructure ChangeButterfly ReadStructureEarly Read LastOffsetEarly ReadButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early261 // NukeStructure ChangeButterfly ReadStructureEarly Read LastOffsetEarly ReadButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early262 // NukeStructure ChangeButterfly ReadStructureEarly Read LastOffsetEarly ReadButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early263 // NukeStructure ChangeButterfly ReadStructureEarly Read LastOffsetEarly ReadButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early264 // NukeStructure ChangeButterfly ReadStructureEarly Read LastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure early265 // NukeStructure ReadStructureEarly ChangeButterfly Change LastOffset RestoreStructure ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early266 // NukeStructure ReadStructureEarly ChangeButterfly Change LastOffset ReadLastOffsetEarly RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early267 // NukeStructure ReadStructureEarly ChangeButterfly Change LastOffset ReadLastOffsetEarly ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early268 // NukeStructure ReadStructureEarly ChangeButterfly Change LastOffset ReadLastOffsetEarly ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early269 // NukeStructure ReadStructureEarly ChangeButterfly Change LastOffset ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early270 // NukeStructure ReadStructureEarly ChangeButterfly Read LastOffsetEarly ChangeLastOffset RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early271 // NukeStructure ReadStructureEarly ChangeButterfly Read LastOffsetEarly ChangeLastOffset ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early272 // NukeStructure ReadStructureEarly ChangeButterfly Read LastOffsetEarly ChangeLastOffset ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early273 // NukeStructure ReadStructureEarly ChangeButterfly Read LastOffsetEarly ChangeLastOffset ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early274 // NukeStructure ReadStructureEarly ChangeButterfly Read LastOffsetEarly ReadButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early275 // NukeStructure ReadStructureEarly ChangeButterfly Read LastOffsetEarly ReadButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early276 // NukeStructure ReadStructureEarly ChangeButterfly Read LastOffsetEarly ReadButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early277 // NukeStructure ReadStructureEarly ChangeButterfly Read LastOffsetEarly ReadButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early278 // NukeStructure ReadStructureEarly ChangeButterfly Read LastOffsetEarly ReadButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early279 // NukeStructure ReadStructureEarly ChangeButterfly Read LastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure early280 // NukeStructure ReadStructureEarly Read LastOffsetEarly ChangeButterfly ChangeLastOffset RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early281 // NukeStructure ReadStructureEarly Read LastOffsetEarly ChangeButterfly ChangeLastOffset ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early282 // NukeStructure ReadStructureEarly Read LastOffsetEarly ChangeButterfly ChangeLastOffset ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early283 // NukeStructure ReadStructureEarly Read LastOffsetEarly ChangeButterfly ChangeLastOffset ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early284 // NukeStructure ReadStructureEarly Read LastOffsetEarly ChangeButterfly ReadButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early285 // NukeStructure ReadStructureEarly Read LastOffsetEarly ChangeButterfly ReadButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early286 // NukeStructure ReadStructureEarly Read LastOffsetEarly ChangeButterfly ReadButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early287 // NukeStructure ReadStructureEarly Read LastOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early288 // NukeStructure ReadStructureEarly Read LastOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early289 // NukeStructure ReadStructureEarly Read LastOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure early290 // NukeStructure ReadStructureEarly Read LastOffsetEarly ReadButterfly ChangeButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read nuked structure early291 // NukeStructure ReadStructureEarly Read LastOffsetEarly ReadButterfly ChangeButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early292 // NukeStructure ReadStructureEarly Read LastOffsetEarly ReadButterfly ChangeButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early293 // NukeStructure ReadStructureEarly Read LastOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early294 // NukeStructure ReadStructureEarly Read LastOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early295 // NukeStructure ReadStructureEarly Read LastOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure early296 // NukeStructure ReadStructureEarly Read LastOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure early297 // NukeStructure ReadStructureEarly Read LastOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure early298 // NukeStructure ReadStructureEarly Read LastOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure early299 // NukeStructure ReadStructureEarly Read LastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeButterfly ChangeLastOffset RestoreStructure: IGNORE, read nuked structure early300 // ReadStructureEarly NukeStructure ChangeButterfly Change LastOffset RestoreStructure ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate: AFTER, the ReadStructureEarly sees the same structure as after and everything else runs after.301 // ReadStructureEarly NukeStructure ChangeButterfly Change LastOffset ReadLastOffsetEarly RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: AFTER, as above and the ReadLastOffsetEarly sees the lastOffset after.302 // ReadStructureEarly NukeStructure ChangeButterfly Change LastOffset ReadLastOffsetEarly ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: AFTER, as above and the ReadButterfly sees the right butterfly after.303 // ReadStructureEarly NukeStructure ChangeButterfly Change LastOffset ReadLastOffsetEarly ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure late304 // ReadStructureEarly NukeStructure ChangeButterfly Change LastOffset ReadLastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure late305 // ReadStructureEarly NukeStructure ChangeButterfly Read LastOffsetEarly ChangeLastOffset RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets306 // ReadStructureEarly NukeStructure ChangeButterfly Read LastOffsetEarly ChangeLastOffset ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets307 // ReadStructureEarly NukeStructure ChangeButterfly Read LastOffsetEarly ChangeLastOffset ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets308 // ReadStructureEarly NukeStructure ChangeButterfly Read LastOffsetEarly ChangeLastOffset ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets309 // ReadStructureEarly NukeStructure ChangeButterfly Read LastOffsetEarly ReadButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets310 // ReadStructureEarly NukeStructure ChangeButterfly Read LastOffsetEarly ReadButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets311 // ReadStructureEarly NukeStructure ChangeButterfly Read LastOffsetEarly ReadButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets312 // ReadStructureEarly NukeStructure ChangeButterfly Read LastOffsetEarly ReadButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets313 // ReadStructureEarly NukeStructure ChangeButterfly Read LastOffsetEarly ReadButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets314 // ReadStructureEarly NukeStructure ChangeButterfly Read LastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late315 // ReadStructureEarly NukeStructure Read LastOffsetEarly ChangeButterfly ChangeLastOffset RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets316 // ReadStructureEarly NukeStructure Read LastOffsetEarly ChangeButterfly ChangeLastOffset ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets317 // ReadStructureEarly NukeStructure Read LastOffsetEarly ChangeButterfly ChangeLastOffset ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets318 // ReadStructureEarly NukeStructure Read LastOffsetEarly ChangeButterfly ChangeLastOffset ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets319 // ReadStructureEarly NukeStructure Read LastOffsetEarly ChangeButterfly ReadButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets320 // ReadStructureEarly NukeStructure Read LastOffsetEarly ChangeButterfly ReadButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets321 // ReadStructureEarly NukeStructure Read LastOffsetEarly ChangeButterfly ReadButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets322 // ReadStructureEarly NukeStructure Read LastOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets323 // ReadStructureEarly NukeStructure Read LastOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets324 // ReadStructureEarly NukeStructure Read LastOffsetEarly ChangeButterfly ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late325 // ReadStructureEarly NukeStructure Read LastOffsetEarly ReadButterfly ChangeButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets326 // ReadStructureEarly NukeStructure Read LastOffsetEarly ReadButterfly ChangeButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets327 // ReadStructureEarly NukeStructure Read LastOffsetEarly ReadButterfly ChangeButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets328 // ReadStructureEarly NukeStructure Read LastOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets329 // ReadStructureEarly NukeStructure Read LastOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets330 // ReadStructureEarly NukeStructure Read LastOffsetEarly ReadButterfly ChangeButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late331 // ReadStructureEarly NukeStructure Read LastOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets332 // ReadStructureEarly NukeStructure Read LastOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets333 // ReadStructureEarly NukeStructure Read LastOffsetEarly ReadButterfly ReadStructureLate ChangeButterfly ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late334 // ReadStructureEarly NukeStructure Read LastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeButterfly ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late335 // ReadStructureEarly Read LastOffsetEarly NukeStructure ChangeButterfly ChangeLastOffset RestoreStructure ReadButterfly ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets336 // ReadStructureEarly Read LastOffsetEarly NukeStructure ChangeButterfly ChangeLastOffset ReadButterfly RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets337 // ReadStructureEarly Read LastOffsetEarly NukeStructure ChangeButterfly ChangeLastOffset ReadButterfly ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure late338 // ReadStructureEarly Read LastOffsetEarly NukeStructure ChangeButterfly ChangeLastOffset ReadButterfly ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure late339 // ReadStructureEarly Read LastOffsetEarly NukeStructure ChangeButterfly ReadButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets340 // ReadStructureEarly Read LastOffsetEarly NukeStructure ChangeButterfly ReadButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets341 // ReadStructureEarly Read LastOffsetEarly NukeStructure ChangeButterfly ReadButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets342 // ReadStructureEarly Read LastOffsetEarly NukeStructure ChangeButterfly ReadButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets343 // ReadStructureEarly Read LastOffsetEarly NukeStructure ChangeButterfly ReadButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets344 // ReadStructureEarly Read LastOffsetEarly NukeStructure ChangeButterfly ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late345 // ReadStructureEarly Read LastOffsetEarly NukeStructure ReadButterfly ChangeButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets346 // ReadStructureEarly Read LastOffsetEarly NukeStructure ReadButterfly ChangeButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets347 // ReadStructureEarly Read LastOffsetEarly NukeStructure ReadButterfly ChangeButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets348 // ReadStructureEarly Read LastOffsetEarly NukeStructure ReadButterfly ChangeButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets349 // ReadStructureEarly Read LastOffsetEarly NukeStructure ReadButterfly ChangeButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets350 // ReadStructureEarly Read LastOffsetEarly NukeStructure ReadButterfly ChangeButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late351 // ReadStructureEarly Read LastOffsetEarly NukeStructure ReadButterfly ReadStructureLate ChangeButterfly ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets352 // ReadStructureEarly Read LastOffsetEarly NukeStructure ReadButterfly ReadStructureLate ChangeButterfly ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure late353 // ReadStructureEarly Read LastOffsetEarly NukeStructure ReadButterfly ReadStructureLate ChangeButterfly ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late354 // ReadStructureEarly Read LastOffsetEarly NukeStructure ReadButterfly ReadStructureLate ReadLastOffsetLate ChangeButterfly ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late355 // ReadStructureEarly Read LastOffsetEarly ReadButterfly NukeStructure ChangeButterfly ChangeLastOffset RestoreStructure ReadStructureLate ReadLastOffsetLate: IGNORE, read different offsets356 // ReadStructureEarly Read LastOffsetEarly ReadButterfly NukeStructure ChangeButterfly ChangeLastOffset ReadStructureLate RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets357 // ReadStructureEarly Read LastOffsetEarly ReadButterfly NukeStructure ChangeButterfly ChangeLastOffset ReadStructureLate ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets358 // ReadStructureEarly Read LastOffsetEarly ReadButterfly NukeStructure ChangeButterfly ReadStructureLate ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets359 // ReadStructureEarly Read LastOffsetEarly ReadButterfly NukeStructure ChangeButterfly ReadStructureLate ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets360 // ReadStructureEarly Read LastOffsetEarly ReadButterfly NukeStructure ChangeButterfly ReadStructureLate ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late361 // ReadStructureEarly Read LastOffsetEarly ReadButterfly NukeStructure ReadStructureLate ChangeButterfly ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read nuked structure late362 // ReadStructureEarly Read LastOffsetEarly ReadButterfly NukeStructure ReadStructureLate ChangeButterfly ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read nuked structure late363 // ReadStructureEarly Read LastOffsetEarly ReadButterfly NukeStructure ReadStructureLate ChangeButterfly ReadLastOffsetLate ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late364 // ReadStructureEarly Read LastOffsetEarly ReadButterfly NukeStructure ReadStructureLate ReadLastOffsetLate ChangeButterfly ChangeLastOffset RestoreStructure: IGNORE, read nuked structure late365 // ReadStructureEarly Read LastOffsetEarly ReadButterfly ReadStructureLate NukeStructure ChangeButterfly ChangeLastOffset RestoreStructure ReadLastOffsetLate: IGNORE, read different offsets366 // ReadStructureEarly Read LastOffsetEarly ReadButterfly ReadStructureLate NukeStructure ChangeButterfly ChangeLastOffset ReadLastOffsetLate RestoreStructure: IGNORE, read different offsets367 // ReadStructureEarly Read LastOffsetEarly ReadButterfly ReadStructureLate NukeStructure ChangeButterfly ReadLastOffsetLate ChangeLastOffset RestoreStructure: BEFORE, reads the offset before, everything else happens before368 // ReadStructureEarly Read LastOffsetEarly ReadButterfly ReadStructureLate NukeStructure ReadLastOffsetLate ChangeButterfly ChangeLastOffset RestoreStructure: BEFORE, reads the offset before, everything else happens before369 // ReadStructureEarly Read LastOffsetEarly ReadButterfly ReadStructureLate ReadLastOffsetLate NukeStructure ChangeButterfly ChangeLastOffset RestoreStructure: BEFORE, trivially244 // 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 370 370 // 371 371 // Whew. … … 393 393 return nullptr; 394 394 structure = vm.getStructure(structureID); 395 lastOffset = structure->lastOffset();395 maxOffset = structure->maxOffset(); 396 396 IndexingType indexingMode = structure->indexingMode(); 397 397 Dependency indexingModeDependency = Dependency::fence(indexingMode); … … 416 416 if (butterflyDependency.consume(this)->structureID() != structureID) 417 417 return nullptr; 418 if (butterflyDependency.consume(structure)-> lastOffset() != lastOffset)418 if (butterflyDependency.consume(structure)->maxOffset() != maxOffset) 419 419 return nullptr; 420 420 421 markAuxiliaryAndVisitOutOfLineProperties(visitor, butterfly, structure, lastOffset);421 markAuxiliaryAndVisitOutOfLineProperties(visitor, butterfly, structure, maxOffset); 422 422 ASSERT(indexingMode == structure->indexingMode()); 423 423 visitElements(indexingMode); -
trunk/Source/JavaScriptCore/runtime/JSObject.h
r253867 r254760 942 942 Structure* visitButterflyImpl(SlotVisitor&); 943 943 944 void markAuxiliaryAndVisitOutOfLineProperties(SlotVisitor&, Butterfly*, Structure*, PropertyOffset lastOffset);944 void markAuxiliaryAndVisitOutOfLineProperties(SlotVisitor&, Butterfly*, Structure*, PropertyOffset maxOffset); 945 945 946 946 // Call this if you know that the object is in a mode where it has array -
trunk/Source/JavaScriptCore/runtime/JSObjectInlines.h
r254087 r254760 217 217 structure->addPropertyWithoutTransition( 218 218 vm, propertyName, attributes, 219 [&] (const GCSafeConcurrentJSLocker&, PropertyOffset offset, PropertyOffset new LastOffset) {220 unsigned newOutOfLineCapacity = Structure::outOfLineCapacity(new LastOffset);219 [&] (const GCSafeConcurrentJSLocker&, PropertyOffset offset, PropertyOffset newMaxOffset) { 220 unsigned newOutOfLineCapacity = Structure::outOfLineCapacity(newMaxOffset); 221 221 if (newOutOfLineCapacity != oldOutOfLineCapacity) { 222 222 Butterfly* butterfly = allocateMoreOutOfLineStorage(vm, oldOutOfLineCapacity, newOutOfLineCapacity); 223 223 nukeStructureAndSetButterfly(vm, structureID, butterfly); 224 structure->set LastOffset(newLastOffset);224 structure->setMaxOffset(vm, newMaxOffset); 225 225 WTF::storeStoreFence(); 226 226 setStructureIDDirectly(structureID); 227 227 } else 228 structure->set LastOffset(newLastOffset);228 structure->setMaxOffset(vm, newMaxOffset); 229 229 230 230 // This assertion verifies that the concurrent GC won't read garbage if the concurrentGC -
trunk/Source/JavaScriptCore/runtime/ObjectInitializationScope.cpp
r251456 r254760 105 105 for (int64_t i = 0; i < static_cast<int64_t>(structure->outOfLineCapacity()); i++) { 106 106 // 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()) 108 108 ASSERT(isSafeEmptyValueForGCScanning(butterfly->propertyStorage()[-i - 1].get())); 109 109 else if (isScribbledValue(butterfly->propertyStorage()[-i - 1].get())) { -
trunk/Source/JavaScriptCore/runtime/PropertyOffset.h
r223715 r254760 48 48 inline size_t offsetInOutOfLineStorage(PropertyOffset); 49 49 inline size_t offsetInRespectiveStorage(PropertyOffset); 50 inline size_t numberOfOutOfLineSlotsFor LastOffset(PropertyOffset);51 inline size_t numberOfSlotsFor LastOffset(PropertyOffset, int inlineCapacity);50 inline size_t numberOfOutOfLineSlotsForMaxOffset(PropertyOffset); 51 inline size_t numberOfSlotsForMaxOffset(PropertyOffset, int inlineCapacity); 52 52 53 53 inline void checkOffset(PropertyOffset offset) … … 118 118 } 119 119 120 inline size_t numberOfOutOfLineSlotsFor LastOffset(PropertyOffset offset)120 inline size_t numberOfOutOfLineSlotsForMaxOffset(PropertyOffset offset) 121 121 { 122 122 checkOffset(offset); … … 126 126 } 127 127 128 inline size_t numberOfSlotsFor LastOffset(PropertyOffset offset, int inlineCapacity)128 inline size_t numberOfSlotsForMaxOffset(PropertyOffset offset, int inlineCapacity) 129 129 { 130 130 checkOffset(offset, inlineCapacity); 131 131 if (offset < inlineCapacity) 132 132 return offset + 1; 133 return inlineCapacity + numberOfOutOfLineSlotsFor LastOffset(offset);133 return inlineCapacity + numberOfOutOfLineSlotsForMaxOffset(offset); 134 134 } 135 135 -
trunk/Source/JavaScriptCore/runtime/Structure.cpp
r253931 r254760 92 92 if (isUsingSingleSlot()) { 93 93 Structure* transition = singleTransition(); 94 return transition && transition->m_ nameInPrevious == rep && transition->attributesInPrevious() == attributes;94 return transition && transition->m_transitionPropertyName == rep && transition->transitionPropertyAttributes() == attributes; 95 95 } 96 96 return map()->get(std::make_pair(rep, attributes)); … … 101 101 if (isUsingSingleSlot()) { 102 102 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; 104 104 } 105 105 return map()->get(std::make_pair(rep, attributes)); … … 128 128 // 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. 129 129 // 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); 131 131 } 132 132 … … 186 186 , m_classInfo(classInfo) 187 187 , m_transitionWatchpointSet(IsWatched) 188 , m_offset(invalidOffset)189 188 , m_propertyHash(0) 190 189 { … … 196 195 setHasUnderscoreProtoPropertyExcludingOriginalProto(false); 197 196 setIsQuickPropertyAccessAllowedForEnumeration(true); 198 set AttributesInPrevious(0);197 setTransitionPropertyAttributes(0); 199 198 setDidPreventExtensions(false); 200 199 setDidTransition(false); … … 203 202 setHasBeenDictionary(false); 204 203 setIsAddingPropertyForTransition(false); 204 setTransitionOffset(vm, invalidOffset); 205 setMaxOffset(vm, invalidOffset); 205 206 206 207 ASSERT(inlineCapacity <= JSFinalObject::maxInlineCapacity()); … … 221 222 , m_classInfo(info()) 222 223 , m_transitionWatchpointSet(IsWatched) 223 , m_offset(invalidOffset)224 224 , m_propertyHash(0) 225 225 { … … 231 231 setHasUnderscoreProtoPropertyExcludingOriginalProto(false); 232 232 setIsQuickPropertyAccessAllowedForEnumeration(true); 233 set AttributesInPrevious(0);233 setTransitionPropertyAttributes(0); 234 234 setDidPreventExtensions(false); 235 235 setDidTransition(false); … … 238 238 setHasBeenDictionary(false); 239 239 setIsAddingPropertyForTransition(false); 240 setTransitionOffset(vm, invalidOffset); 241 setMaxOffset(vm, invalidOffset); 240 242 241 243 TypeInfo typeInfo = TypeInfo(CellType, StructureFlags); … … 255 257 , m_classInfo(previous->m_classInfo) 256 258 , m_transitionWatchpointSet(IsWatched) 257 , m_offset(invalidOffset)258 259 , m_propertyHash(previous->m_propertyHash) 259 260 , m_seenProperties(previous->m_seenProperties) … … 267 268 setHasUnderscoreProtoPropertyExcludingOriginalProto(previous->hasUnderscoreProtoPropertyExcludingOriginalProto()); 268 269 setIsQuickPropertyAccessAllowedForEnumeration(previous->isQuickPropertyAccessAllowedForEnumeration()); 269 set AttributesInPrevious(0);270 setTransitionPropertyAttributes(0); 270 271 setDidPreventExtensions(previous->didPreventExtensions()); 271 272 setDidTransition(true); … … 273 274 setHasBeenDictionary(previous->hasBeenDictionary()); 274 275 setIsAddingPropertyForTransition(false); 276 setTransitionOffset(vm, invalidOffset); 277 setMaxOffset(vm, invalidOffset); 275 278 276 279 TypeInfo typeInfo = previous->typeInfo(); … … 312 315 result->addPropertyWithoutTransition( 313 316 vm, vm.propertyNames->builtinNames().polyProtoName(), static_cast<unsigned>(PropertyAttribute::DontEnum), 314 [&] (const GCSafeConcurrentJSLocker&, PropertyOffset offset, PropertyOffset new LastOffset) {315 RELEASE_ASSERT(Structure::outOfLineCapacity(new LastOffset) == oldOutOfLineCapacity);317 [&] (const GCSafeConcurrentJSLocker&, PropertyOffset offset, PropertyOffset newMaxOffset) { 318 RELEASE_ASSERT(Structure::outOfLineCapacity(newMaxOffset) == oldOutOfLineCapacity); 316 319 RELEASE_ASSERT(offset == knownPolyProtoOffset); 317 320 RELEASE_ASSERT(isInlineOffset(knownPolyProtoOffset)); 318 321 result->m_prototype.setWithoutWriteBarrier(JSValue()); 319 result->set LastOffset(newLastOffset);322 result->setMaxOffset(vm, newMaxOffset); 320 323 }); 321 324 … … 364 367 findStructuresAndMapForMaterialization(structures, structure, table); 365 368 366 unsigned capacity = numberOfSlotsFor LastOffset(m_offset, m_inlineCapacity);369 unsigned capacity = numberOfSlotsForMaxOffset(maxOffset(), m_inlineCapacity); 367 370 if (table) { 368 371 table = table->copy(vm, capacity); … … 380 383 for (size_t i = structures.size(); i--;) { 381 384 structure = structures[i]; 382 if (!structure->m_ nameInPrevious)385 if (!structure->m_transitionPropertyName) 383 386 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); 386 391 } 387 392 … … 407 412 408 413 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(); 411 416 return existingTransition; 412 417 } … … 475 480 else 476 481 maxTransitionLength = s_maxTransitionLength; 477 if (structure->transitionCount () > maxTransitionLength) {482 if (structure->transitionCountEstimate() > maxTransitionLength) { 478 483 ASSERT(!isCopyOnWrite(structure->indexingMode())); 479 484 Structure* transition = toCacheableDictionaryTransition(vm, structure, deferred); 480 485 ASSERT(structure != transition); 481 486 offset = transition->add(vm, propertyName, attributes); 487 transition->setTransitionOffset(vm, offset); 482 488 return transition; 483 489 } … … 488 494 489 495 // 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 the496 // have a m_transitionPropertyName and transitionPropertyAttributes but the m_transitionOffset is still wrong. If the 491 497 // materialization algorithm runs, it'll build a property table that already has the property but 492 498 // at a bogus offset. Rather than try to teach the materialization code how to create a table under … … 502 508 503 509 transition->m_blob.setIndexingModeIncludingHistory(structure->indexingModeIncludingHistory() & ~CopyOnWrite); 504 transition->m_ nameInPrevious= propertyName.uid();505 transition->set AttributesInPrevious(attributes);510 transition->m_transitionPropertyName = propertyName.uid(); 511 transition->setTransitionPropertyAttributes(attributes); 506 512 transition->setPropertyTable(vm, structure->takePropertyTableOrCloneIfPinned(vm)); 507 transition-> m_offset = structure->m_offset;513 transition->setMaxOffset(vm, structure->maxOffset()); 508 514 509 515 offset = transition->add(vm, propertyName, attributes); 516 transition->setTransitionOffset(vm, offset); 510 517 511 518 // Now that everything is fine with the new structure's bookkeeping, the GC is free to blow the … … 514 521 transition->setIsAddingPropertyForTransition(false); 515 522 516 checkOffset(transition-> m_offset, transition->inlineCapacity());523 checkOffset(transition->transitionOffset(), transition->inlineCapacity()); 517 524 { 518 525 ConcurrentJSLocker locker(structure->m_lock); … … 560 567 PropertyTable* table = structure->copyPropertyTableForPinning(vm); 561 568 transition->pin(holdLock(transition->m_lock), vm, table); 562 transition-> m_offset = structure->m_offset;569 transition->setMaxOffset(vm, structure->maxOffset()); 563 570 564 571 transition->checkOffsetConsistency(); … … 573 580 PropertyTable* table = structure->copyPropertyTableForPinning(vm); 574 581 transition->pin(holdLock(transition->m_lock), vm, table); 575 transition-> m_offset = structure->m_offset;582 transition->setMaxOffset(vm, structure->maxOffset()); 576 583 577 584 structure = transition; … … 595 602 PropertyTable* table = structure->copyPropertyTableForPinning(vm); 596 603 transition->pin(holdLock(transition->m_lock), vm, table); 597 transition-> m_offset = structure->m_offset;604 transition->setMaxOffset(vm, structure->maxOffset()); 598 605 transition->setDictionaryKind(kind); 599 606 transition->setHasBeenDictionary(true); … … 650 657 Structure* existingTransition; 651 658 if (!structure->isDictionary() && (existingTransition = structure->m_transitionTable.get(0, attributes))) { 652 ASSERT(existingTransition-> attributesInPrevious() == attributes);659 ASSERT(existingTransition->transitionPropertyAttributes() == attributes); 653 660 ASSERT(existingTransition->indexingModeIncludingHistory() == indexingModeIncludingHistory); 654 661 return existingTransition; … … 658 665 659 666 Structure* transition = create(vm, structure); 660 transition->set AttributesInPrevious(attributes);667 transition->setTransitionPropertyAttributes(attributes); 661 668 transition->m_blob.setIndexingModeIncludingHistory(indexingModeIncludingHistory); 662 669 … … 672 679 PropertyTable* table = structure->copyPropertyTableForPinning(vm); 673 680 transition->pinForCaching(holdLock(transition->m_lock), vm, table); 674 transition-> m_offset = structure->m_offset;681 transition->setMaxOffset(vm, structure->maxOffset()); 675 682 676 683 table = transition->propertyTableOrNull(); … … 684 691 } else { 685 692 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()); 688 695 } 689 696 … … 765 772 unsigned i = 0; 766 773 PropertyTable::iterator end = table->end(); 767 m_offset = invalidOffset;774 auto offset = invalidOffset; 768 775 for (PropertyTable::iterator iter = table->begin(); iter != end; ++iter, ++i) { 769 776 values[i] = object->getDirect(iter->offset); 770 m_offset = iter->offset = offsetForPropertyNumber(i, m_inlineCapacity);777 offset = iter->offset = offsetForPropertyNumber(i, m_inlineCapacity); 771 778 } 779 setMaxOffset(vm, offset); 780 ASSERT(transitionOffset() == invalidOffset); 772 781 773 782 // Copies in our values to their compacted locations. … … 824 833 setPropertyTable(vm, table); 825 834 clearPreviousID(); 826 m_ nameInPrevious= nullptr;835 m_transitionPropertyName = nullptr; 827 836 } 828 837 … … 831 840 setIsPinnedPropertyTable(true); 832 841 setPropertyTable(vm, table); 833 m_ nameInPrevious= nullptr;842 m_transitionPropertyName = nullptr; 834 843 } 835 844 … … 963 972 return add<ShouldPin::No>( 964 973 vm, propertyName, attributes, 965 [this ] (const GCSafeConcurrentJSLocker&, PropertyOffset, PropertyOffset newLastOffset) {966 set LastOffset(newLastOffset);974 [this, &vm] (const GCSafeConcurrentJSLocker&, PropertyOffset, PropertyOffset newMaxOffset) { 975 setMaxOffset(vm, newMaxOffset); 967 976 }); 968 977 } -
trunk/Source/JavaScriptCore/runtime/Structure.h
r253931 r254760 353 353 } 354 354 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); 363 401 364 402 // This algorithm completely determines the out-of-line property storage growth algorithm. … … 378 416 } 379 417 380 static unsigned outOfLineSize(PropertyOffset lastOffset)381 { 382 return numberOfOutOfLineSlotsFor LastOffset(lastOffset);418 static unsigned outOfLineSize(PropertyOffset maxOffset) 419 { 420 return numberOfOutOfLineSlotsForMaxOffset(maxOffset); 383 421 } 384 422 385 423 unsigned outOfLineCapacity() const 386 424 { 387 return outOfLineCapacity(m _offset);425 return outOfLineCapacity(maxOffset()); 388 426 } 389 427 unsigned outOfLineSize() const 390 428 { 391 return outOfLineSize(m _offset);429 return outOfLineSize(maxOffset()); 392 430 } 393 431 bool hasInlineStorage() const … … 401 439 unsigned inlineSize() const 402 440 { 403 return std::min<unsigned>(m _offset+ 1, m_inlineCapacity);441 return std::min<unsigned>(maxOffset() + 1, m_inlineCapacity); 404 442 } 405 443 unsigned totalStorageSize() const 406 444 { 407 return numberOfSlotsFor LastOffset(m_offset, m_inlineCapacity);445 return numberOfSlotsForMaxOffset(maxOffset(), m_inlineCapacity); 408 446 } 409 447 unsigned totalStorageCapacity() const … … 416 454 { 417 455 return JSC::isValidOffset(offset) 418 && offset <= m _offset456 && offset <= maxOffset() 419 457 && (offset < m_inlineCapacity || offset >= firstOutOfLineOffset); 420 458 } … … 467 505 if (!is__proto__) 468 506 setHasReadOnlyOrGetterSetterPropertiesExcludingProto(true); 469 }470 471 bool isEmpty() const472 {473 ASSERT(checkOffsetConsistency());474 return !JSC::isValidOffset(m_offset);475 507 } 476 508 … … 651 683 DEFINE_BITFIELD(bool, hasReadOnlyOrGetterSetterPropertiesExcludingProto, HasReadOnlyOrGetterSetterPropertiesExcludingProto, 1, 4); 652 684 DEFINE_BITFIELD(bool, isQuickPropertyAccessAllowedForEnumeration, IsQuickPropertyAccessAllowedForEnumeration, 1, 5); 653 DEFINE_BITFIELD(unsigned, attributesInPrevious, AttributesInPrevious, 14, 6);685 DEFINE_BITFIELD(unsigned, transitionPropertyAttributes, TransitionPropertyAttributes, 14, 6); 654 686 DEFINE_BITFIELD(bool, didPreventExtensions, DidPreventExtensions, 1, 20); 655 687 DEFINE_BITFIELD(bool, didTransition, DidTransition, 1, 21); … … 733 765 } 734 766 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); 739 772 } 740 773 … … 778 811 WriteBarrier<JSCell> m_previousOrRareData; 779 812 780 RefPtr<UniquedStringImpl> m_ nameInPrevious;813 RefPtr<UniquedStringImpl> m_transitionPropertyName; 781 814 782 815 const ClassInfo* m_classInfo; … … 792 825 COMPILE_ASSERT(firstOutOfLineOffset < 256, firstOutOfLineOffset_fits); 793 826 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; 796 832 797 833 uint32_t m_propertyHash; -
trunk/Source/JavaScriptCore/runtime/StructureInlines.h
r253931 r254760 181 181 for (unsigned i = structures.size(); i--;) { 182 182 structure = structures[i]; 183 if (!structure->m_ nameInPrevious)183 if (!structure->m_transitionPropertyName) 184 184 continue; 185 185 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()))) 187 187 return; 188 188 } … … 365 365 dataLog("Detected offset inconsistency: ", description, "!\n"); 366 366 dataLog("this = ", RawPointer(this), "\n"); 367 dataLog("m_offset = ", m_offset, "\n"); 367 dataLog("transitionOffset = ", transitionOffset(), "\n"); 368 dataLog("maxOffset = ", maxOffset(), "\n"); 368 369 dataLog("m_inlineCapacity = ", m_inlineCapacity, "\n"); 369 370 dataLog("propertyTable = ", RawPointer(propertyTable), "\n"); 370 dataLog("numberOfSlotsFor LastOffset = ", numberOfSlotsForLastOffset(m_offset, m_inlineCapacity), "\n");371 dataLog("numberOfSlotsForMaxOffset = ", numberOfSlotsForMaxOffset(maxOffset(), m_inlineCapacity), "\n"); 371 372 dataLog("totalSize = ", totalSize, "\n"); 372 373 dataLog("inlineOverflowAccordingToTotalSize = ", inlineOverflowAccordingToTotalSize, "\n"); 373 dataLog("numberOfOutOfLineSlotsFor LastOffset = ", numberOfOutOfLineSlotsForLastOffset(m_offset), "\n");374 dataLog("numberOfOutOfLineSlotsForMaxOffset = ", numberOfOutOfLineSlotsForMaxOffset(maxOffset()), "\n"); 374 375 detailsFunc(); 375 376 UNREACHABLE_FOR_PLATFORM(); 376 377 }; 377 378 378 if (numberOfSlotsFor LastOffset(m_offset, m_inlineCapacity) != totalSize)379 fail("numberOfSlotsFor LastOffset doesn't match totalSize");380 if (inlineOverflowAccordingToTotalSize != numberOfOutOfLineSlotsFor LastOffset(m_offset))381 fail("inlineOverflowAccordingToTotalSize doesn't match numberOfOutOfLineSlotsFor LastOffset");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"); 382 383 383 384 return true; … … 454 455 m_seenProperties.add(bitwise_cast<uintptr_t>(rep)); 455 456 456 PropertyOffset new LastOffset = m_offset;457 table->add(PropertyMapEntry(rep, newOffset, attributes), new LastOffset, PropertyTable::PropertyOffsetMayChange);458 459 func(locker, newOffset, new LastOffset);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); 462 463 463 464 checkConsistency(); -
trunk/Source/JavaScriptCore/runtime/StructureRareData.cpp
r253810 r254760 59 59 : JSCell(vm, vm.structureRareDataStructure.get()) 60 60 , m_giveUpOnObjectToStringValueCache(false) 61 , m_maxOffset(invalidOffset) 62 , m_transitionOffset(invalidOffset) 61 63 { 62 64 if (previous) -
trunk/Source/JavaScriptCore/runtime/StructureRareData.h
r251425 r254760 115 115 Box<InlineWatchpointSet> m_polyProtoWatchpoint; 116 116 bool m_giveUpOnObjectToStringValueCache; 117 118 PropertyOffset m_maxOffset; 119 PropertyOffset m_transitionOffset; 117 120 }; 118 121
Note: See TracChangeset
for help on using the changeset viewer.