Ignore:
Timestamp:
Dec 16, 2017, 10:20:04 AM (7 years ago)
Author:
[email protected]
Message:

Indexing should only be computed when the new structure has an indexing header.
https://bugs.webkit.org/show_bug.cgi?id=180895

Reviewed by Saam Barati.

If we don't have an indexing header then we point the butterfly
sizeof(IndexingHeader) past the end of the butterfly. This makes
the computation of the offset simpler since it doesn't depend on
the indexing headeriness of the butterfly.

  • jit/JITOperations.cpp:
  • runtime/JSObject.cpp:

(JSC::JSObject::createInitialUndecided):
(JSC::JSObject::createInitialInt32):
(JSC::JSObject::createInitialDouble):
(JSC::JSObject::createInitialContiguous):
(JSC::JSObject::createArrayStorage):
(JSC::JSObject::convertUndecidedToArrayStorage):
(JSC::JSObject::convertInt32ToArrayStorage):
(JSC::JSObject::convertDoubleToArrayStorage):

  • runtime/JSObject.h:

(JSC::JSObject::setButterfly):
(JSC::JSObject::nukeStructureAndSetButterfly):

  • runtime/JSObjectInlines.h:

(JSC::JSObject::prepareToPutDirectWithoutTransition):
(JSC::JSObject::putDirectInternal):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/runtime/JSObjectInlines.h

    r224927 r226000  
    186186            if (newOutOfLineCapacity != oldOutOfLineCapacity) {
    187187                Butterfly* butterfly = allocateMoreOutOfLineStorage(vm, oldOutOfLineCapacity, newOutOfLineCapacity);
    188                 nukeStructureAndSetButterfly(vm, structureID, butterfly);
     188                nukeStructureAndSetButterfly(vm, structureID, butterfly, structure->indexingType());
    189189                structure->setLastOffset(newLastOffset);
    190190                WTF::storeStoreFence();
     
    313313            ASSERT(newStructure != this->structure());
    314314            newButterfly = allocateMoreOutOfLineStorage(vm, currentCapacity, newStructure->outOfLineCapacity());
    315             nukeStructureAndSetButterfly(vm, structureID, newButterfly);
     315            nukeStructureAndSetButterfly(vm, structureID, newButterfly, newStructure->indexingType());
    316316        }
    317317
     
    367367    if (oldCapacity != newCapacity) {
    368368        Butterfly* newButterfly = allocateMoreOutOfLineStorage(vm, oldCapacity, newCapacity);
    369         nukeStructureAndSetButterfly(vm, structureID, newButterfly);
     369        nukeStructureAndSetButterfly(vm, structureID, newButterfly, newStructure->indexingType());
    370370    }
    371371    putDirect(vm, offset, value);
Note: See TracChangeset for help on using the changeset viewer.