Changeset 161230 in webkit
- Timestamp:
- Jan 2, 2014 2:57:14 PM (10 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 1 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r161220 r161230 1 2014-01-02 Mark Hahnenberg <mhahnenberg@apple.com> 2 3 Storing new CopiedSpace memory into a JSObject should fire a write barrier 4 https://bugs.webkit.org/show_bug.cgi?id=126025 5 6 Reviewed by Filip Pizlo. 7 8 Technically this is creating a pointer between a (potentially) old generation object and a young 9 generation chunk of memory, thus there needs to be a barrier. 10 11 * JavaScriptCore.xcodeproj/project.pbxproj: 12 * dfg/DFGOperations.cpp: 13 * heap/CopyWriteBarrier.h: Added. This class functions similarly to the WriteBarrier class. It 14 acts as a proxy for pointers to CopiedSpace. Assignments to the field cause a write barrier to 15 fire for the object that is the owner of the CopiedSpace memory. This is to ensure during nursery 16 collections that objects with new backing stores are visited, even if they are old generation objects. 17 (JSC::CopyWriteBarrier::CopyWriteBarrier): 18 (JSC::CopyWriteBarrier::operator!): 19 (JSC::CopyWriteBarrier::operator UnspecifiedBoolType*): 20 (JSC::CopyWriteBarrier::get): 21 (JSC::CopyWriteBarrier::operator*): 22 (JSC::CopyWriteBarrier::operator->): 23 (JSC::CopyWriteBarrier::set): 24 (JSC::CopyWriteBarrier::setWithoutWriteBarrier): 25 (JSC::CopyWriteBarrier::clear): 26 * heap/Heap.h: 27 * runtime/JSArray.cpp: 28 (JSC::JSArray::unshiftCountSlowCase): 29 (JSC::JSArray::shiftCountWithArrayStorage): 30 (JSC::JSArray::unshiftCountWithArrayStorage): 31 * runtime/JSCell.h: 32 (JSC::JSCell::unvalidatedStructure): 33 * runtime/JSGenericTypedArrayViewInlines.h: 34 (JSC::JSGenericTypedArrayView<Adaptor>::slowDownAndWasteMemory): 35 * runtime/JSObject.cpp: 36 (JSC::JSObject::copyButterfly): 37 (JSC::JSObject::getOwnPropertySlotByIndex): 38 (JSC::JSObject::putByIndex): 39 (JSC::JSObject::enterDictionaryIndexingModeWhenArrayStorageAlreadyExists): 40 (JSC::JSObject::createInitialIndexedStorage): 41 (JSC::JSObject::createArrayStorage): 42 (JSC::JSObject::deletePropertyByIndex): 43 (JSC::JSObject::getOwnPropertyNames): 44 (JSC::JSObject::putByIndexBeyondVectorLengthWithoutAttributes): 45 (JSC::JSObject::countElements): 46 (JSC::JSObject::increaseVectorLength): 47 (JSC::JSObject::ensureLengthSlow): 48 * runtime/JSObject.h: 49 (JSC::JSObject::butterfly): 50 (JSC::JSObject::setStructureAndButterfly): 51 (JSC::JSObject::setButterflyWithoutChangingStructure): 52 (JSC::JSObject::JSObject): 53 (JSC::JSObject::putDirectInternal): 54 (JSC::JSObject::putDirectWithoutTransition): 55 * runtime/MapData.cpp: 56 (JSC::MapData::ensureSpaceForAppend): 57 * runtime/Structure.cpp: 58 (JSC::Structure::materializePropertyMap): 59 1 60 2013-12-23 Oliver Hunt <oliver@apple.com> 2 61 -
trunk/Source/JavaScriptCore/GNUmakefile.list.am
r160796 r161230 503 503 Source/JavaScriptCore/heap/CopyVisitor.cpp \ 504 504 Source/JavaScriptCore/heap/CopyWorkList.h \ 505 Source/JavaScriptCore/heap/CopyWriteBarrier.h \ 505 506 Source/JavaScriptCore/heap/ConservativeRoots.cpp \ 506 507 Source/JavaScriptCore/heap/ConservativeRoots.h \ -
trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj
r160796 r161230 985 985 <ClInclude Include="..\heap\CopyVisitorInlines.h" /> 986 986 <ClInclude Include="..\heap\CopyWorkList.h" /> 987 <ClInclude Include="..\heap\CopyWriteBarrier.h" /> 987 988 <ClInclude Include="..\heap\DeferGC.h" /> 988 989 <ClInclude Include="..\heap\DelayedReleaseScope.h" /> -
trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters
r160796 r161230 1629 1629 <Filter>heap</Filter> 1630 1630 </ClInclude> 1631 <ClInclude Include="..\heap\CopyWriteBarrier.h"> 1632 <Filter>heap</Filter> 1633 </ClInclude> 1631 1634 <ClInclude Include="..\heap\DeferGC.h"> 1632 1635 <Filter>heap</Filter> -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r160796 r161230 721 721 2A4EC90B1860D6C20094F782 /* WriteBarrierBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2A4EC9091860D6C20094F782 /* WriteBarrierBuffer.cpp */; }; 722 722 2A4EC90C1860D6C20094F782 /* WriteBarrierBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A4EC90A1860D6C20094F782 /* WriteBarrierBuffer.h */; settings = {ATTRIBUTES = (Private, ); }; }; 723 2A68295B1875F80500B6C3E2 /* CopyWriteBarrier.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A68295A1875F80500B6C3E2 /* CopyWriteBarrier.h */; settings = {ATTRIBUTES = (Private, ); }; }; 723 724 2A6F462617E959CE00C45C98 /* HeapOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A6F462517E959CE00C45C98 /* HeapOperation.h */; settings = {ATTRIBUTES = (Private, ); }; }; 724 725 2A7A58EF1808A4C40020BDF7 /* DeferGC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2A7A58EE1808A4C40020BDF7 /* DeferGC.cpp */; }; … … 2028 2029 2A4EC9091860D6C20094F782 /* WriteBarrierBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WriteBarrierBuffer.cpp; sourceTree = "<group>"; }; 2029 2030 2A4EC90A1860D6C20094F782 /* WriteBarrierBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WriteBarrierBuffer.h; sourceTree = "<group>"; }; 2031 2A68295A1875F80500B6C3E2 /* CopyWriteBarrier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CopyWriteBarrier.h; sourceTree = "<group>"; }; 2030 2032 2A6F462517E959CE00C45C98 /* HeapOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeapOperation.h; sourceTree = "<group>"; }; 2031 2033 2A7A58EE1808A4C40020BDF7 /* DeferGC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DeferGC.cpp; sourceTree = "<group>"; }; … … 3213 3215 2A2825CF18341F2D0087FBA9 /* DelayedReleaseScope.h */, 3214 3216 2AAD964918569417001F93BE /* RecursiveAllocationScope.h */, 3217 2A68295A1875F80500B6C3E2 /* CopyWriteBarrier.h */, 3215 3218 ); 3216 3219 path = heap; … … 4374 4377 86ADD1450FDDEA980006EEC2 /* ARMv7Assembler.h in Headers */, 4375 4378 65C0285D1717966800351E35 /* ARMv7DOpcode.h in Headers */, 4379 2A68295B1875F80500B6C3E2 /* CopyWriteBarrier.h in Headers */, 4376 4380 2A4EC90C1860D6C20094F782 /* WriteBarrierBuffer.h in Headers */, 4377 4381 A532439218569709002ED692 /* CodeGeneratorInspector.py in Headers */, -
trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp
r161220 r161230 852 852 ASSERT(!object->structure()->outOfLineCapacity()); 853 853 Butterfly* result = object->growOutOfLineStorage(vm, 0, initialOutOfLineCapacity); 854 object->setButterflyWithoutChangingStructure( result);854 object->setButterflyWithoutChangingStructure(vm, result); 855 855 return reinterpret_cast<char*>(result); 856 856 } … … 862 862 863 863 Butterfly* result = object->growOutOfLineStorage(vm, object->structure()->outOfLineCapacity(), newSize); 864 object->setButterflyWithoutChangingStructure( result);864 object->setButterflyWithoutChangingStructure(vm, result); 865 865 return reinterpret_cast<char*>(result); 866 866 } -
trunk/Source/JavaScriptCore/runtime/JSArray.cpp
r160186 r161230 322 322 newButterfly->arrayStorage()->setVectorLength(newVectorLength); 323 323 newButterfly->arrayStorage()->m_indexBias = newIndexBias; 324 325 m_butterfly = newButterfly; 324 setButterflyWithoutChangingStructure(vm, newButterfly); 326 325 327 326 return true; … … 721 720 // the start of the Butterfly, which needs to point at the first indexed property in the used 722 721 // portion of the vector. 723 m_butterfly = m_butterfly->shift(structure(), count);722 m_butterfly.setWithoutWriteBarrier(m_butterfly->shift(structure(), count)); 724 723 storage = m_butterfly->arrayStorage(); 725 724 storage->m_indexBias += count; … … 858 857 859 858 if (moveFront && storage->m_indexBias >= count) { 860 m_butterfly = storage->butterfly()->unshift(structure(), count);861 storage = m_butterfly->arrayStorage();859 Butterfly* newButterfly = storage->butterfly()->unshift(structure(), count); 860 storage = newButterfly->arrayStorage(); 862 861 storage->m_indexBias -= count; 863 862 storage->setVectorLength(vectorLength + count); 863 setButterflyWithoutChangingStructure(exec->vm(), newButterfly); 864 864 } else if (!moveFront && vectorLength - length >= count) 865 865 storage = storage->butterfly()->arrayStorage(); -
trunk/Source/JavaScriptCore/runtime/JSCell.h
r155357 r161230 147 147 148 148 #if ENABLE(GC_VALIDATION) 149 Structure* unvalidatedStructure() { return m_structure.unvalidatedGet(); }149 Structure* unvalidatedStructure() const { return m_structure.unvalidatedGet(); } 150 150 #endif 151 151 -
trunk/Source/JavaScriptCore/runtime/JSGenericTypedArrayViewInlines.h
r161220 r161230 507 507 508 508 if (thisObject->m_mode == FastTypedArray 509 && !thisObject-> m_butterfly&& size >= sizeof(IndexingHeader)) {509 && !thisObject->butterfly() && size >= sizeof(IndexingHeader)) { 510 510 ASSERT(thisObject->m_vector); 511 511 // Reuse already allocated memory if at all possible. 512 thisObject->m_butterfly =513 static_cast<IndexingHeader*>(thisObject->m_vector)->butterfly() ;512 thisObject->m_butterfly.setWithoutWriteBarrier( 513 static_cast<IndexingHeader*>(thisObject->m_vector)->butterfly()); 514 514 } else { 515 thisObject->m_butterfly = Butterfly::createOrGrowArrayRight( 516 thisObject->m_butterfly, *heap->vm(), thisObject, thisObject->structure(), 517 thisObject->structure()->outOfLineCapacity(), false, 0, 0); 515 VM& vm = *heap->vm(); 516 thisObject->m_butterfly.set(vm, thisObject, Butterfly::createOrGrowArrayRight( 517 thisObject->butterfly(), vm, thisObject, thisObject->structure(), 518 thisObject->structure()->outOfLineCapacity(), false, 0, 0)); 518 519 } 519 520 -
trunk/Source/JavaScriptCore/runtime/JSObject.cpp
r161220 r161230 160 160 } 161 161 162 m_butterfly = newButterfly;162 m_butterfly.setWithoutWriteBarrier(newButterfly); 163 163 visitor.didCopy(butterfly->base(preCapacity, propertyCapacity), capacityInBytes); 164 164 } … … 284 284 case ALL_INT32_INDEXING_TYPES: 285 285 case ALL_CONTIGUOUS_INDEXING_TYPES: { 286 Butterfly* butterfly = thisObject-> m_butterfly;286 Butterfly* butterfly = thisObject->butterfly(); 287 287 if (i >= butterfly->vectorLength()) 288 288 return false; … … 298 298 299 299 case ALL_DOUBLE_INDEXING_TYPES: { 300 Butterfly* butterfly = thisObject-> m_butterfly;300 Butterfly* butterfly = thisObject->butterfly(); 301 301 if (i >= butterfly->vectorLength()) 302 302 return false; … … 438 438 439 439 case ALL_CONTIGUOUS_INDEXING_TYPES: { 440 Butterfly* butterfly = thisObject-> m_butterfly;440 Butterfly* butterfly = thisObject->butterfly(); 441 441 if (propertyName >= butterfly->vectorLength()) 442 442 break; … … 461 461 return; 462 462 } 463 Butterfly* butterfly = thisObject-> m_butterfly;463 Butterfly* butterfly = thisObject->butterfly(); 464 464 if (propertyName >= butterfly->vectorLength()) 465 465 break; … … 550 550 Butterfly* newButterfly = storage->butterfly()->resizeArray(vm, this, structure(), 0, ArrayStorage::sizeFor(0)); 551 551 RELEASE_ASSERT(newButterfly); 552 553 m_butterfly = newButterfly;554 552 newButterfly->arrayStorage()->m_indexBias = 0; 555 553 newButterfly->arrayStorage()->setVectorLength(0); 556 554 newButterfly->arrayStorage()->m_sparseMap.set(vm, this, map); 555 setButterflyWithoutChangingStructure(vm, newButterfly); 557 556 558 557 return newButterfly->arrayStorage(); … … 602 601 unsigned vectorLength = std::max(length, BASE_VECTOR_LEN); 603 602 Butterfly* newButterfly = Butterfly::createOrGrowArrayRight( 604 m_butterfly , vm, this, structure(), structure()->outOfLineCapacity(), false, 0,603 m_butterfly.get(), vm, this, structure(), structure()->outOfLineCapacity(), false, 0, 605 604 elementSize * vectorLength); 606 605 newButterfly->setPublicLength(length); … … 653 652 ASSERT_UNUSED(oldType, !hasIndexedProperties(oldType)); 654 653 Butterfly* newButterfly = Butterfly::createOrGrowArrayRight( 655 m_butterfly , vm, this, structure(), structure()->outOfLineCapacity(), false, 0,654 m_butterfly.get(), vm, this, structure(), structure()->outOfLineCapacity(), false, 0, 656 655 ArrayStorage::sizeFor(vectorLength)); 657 656 RELEASE_ASSERT(newButterfly); … … 1297 1296 case ALL_INT32_INDEXING_TYPES: 1298 1297 case ALL_CONTIGUOUS_INDEXING_TYPES: { 1299 Butterfly* butterfly = thisObject-> m_butterfly;1298 Butterfly* butterfly = thisObject->butterfly(); 1300 1299 if (i >= butterfly->vectorLength()) 1301 1300 return true; … … 1305 1304 1306 1305 case ALL_DOUBLE_INDEXING_TYPES: { 1307 Butterfly* butterfly = thisObject-> m_butterfly;1306 Butterfly* butterfly = thisObject->butterfly(); 1308 1307 if (i >= butterfly->vectorLength()) 1309 1308 return true; … … 1481 1480 case ALL_INT32_INDEXING_TYPES: 1482 1481 case ALL_CONTIGUOUS_INDEXING_TYPES: { 1483 Butterfly* butterfly = object-> m_butterfly;1482 Butterfly* butterfly = object->butterfly(); 1484 1483 unsigned usedLength = butterfly->publicLength(); 1485 1484 for (unsigned i = 0; i < usedLength; ++i) { … … 1492 1491 1493 1492 case ALL_DOUBLE_INDEXING_TYPES: { 1494 Butterfly* butterfly = object-> m_butterfly;1493 Butterfly* butterfly = object->butterfly(); 1495 1494 unsigned usedLength = butterfly->publicLength(); 1496 1495 for (unsigned i = 0; i < usedLength; ++i) { … … 1876 1875 if (i >= MAX_ARRAY_INDEX - 1 1877 1876 || (i >= MIN_SPARSE_ARRAY_INDEX 1878 && !isDenseEnoughForVector(i, countElements<indexingShape>( m_butterfly)))1877 && !isDenseEnoughForVector(i, countElements<indexingShape>(butterfly()))) 1879 1878 || indexIsSufficientlyBeyondLengthForSparseMap(i, m_butterfly->vectorLength())) { 1880 1879 ASSERT(i <= MAX_ARRAY_INDEX); … … 2313 2312 2314 2313 case ALL_INT32_INDEXING_TYPES: 2315 return countElements<Int32Shape>( m_butterfly);2314 return countElements<Int32Shape>(butterfly()); 2316 2315 2317 2316 case ALL_DOUBLE_INDEXING_TYPES: 2318 return countElements<DoubleShape>( m_butterfly);2317 return countElements<DoubleShape>(butterfly()); 2319 2318 2320 2319 case ALL_CONTIGUOUS_INDEXING_TYPES: 2321 return countElements<ContiguousShape>( m_butterfly);2320 return countElements<ContiguousShape>(butterfly()); 2322 2321 2323 2322 default: … … 2353 2352 if (!newButterfly) 2354 2353 return false; 2355 m_butterfly = newButterfly;2356 2354 newButterfly->arrayStorage()->setVectorLength(newVectorLength); 2355 setButterflyWithoutChangingStructure(vm, newButterfly); 2357 2356 return true; 2358 2357 } … … 2367 2366 if (!newButterfly) 2368 2367 return false; 2369 2370 m_butterfly = newButterfly;2371 2368 newButterfly->arrayStorage()->setVectorLength(newVectorLength); 2372 2369 newButterfly->arrayStorage()->m_indexBias = newIndexBias; 2370 setButterflyWithoutChangingStructure(vm, newButterfly); 2373 2371 return true; 2374 2372 } … … 2385 2383 unsigned oldVectorLength = m_butterfly->vectorLength(); 2386 2384 DeferGC deferGC(vm.heap); 2387 m_butterfly =m_butterfly->growArrayRight(2385 m_butterfly.set(vm, this, m_butterfly->growArrayRight( 2388 2386 vm, this, structure(), structure()->outOfLineCapacity(), true, 2389 2387 oldVectorLength * sizeof(EncodedJSValue), 2390 newVectorLength * sizeof(EncodedJSValue)); 2388 newVectorLength * sizeof(EncodedJSValue))); 2389 2390 m_butterfly->setVectorLength(newVectorLength); 2391 2391 2392 if (hasDouble(structure()->indexingType())) { 2392 2393 for (unsigned i = oldVectorLength; i < newVectorLength; ++i) 2393 2394 m_butterfly->contiguousDouble().data()[i] = QNaN; 2394 2395 } 2395 m_butterfly->setVectorLength(newVectorLength);2396 2396 } 2397 2397 -
trunk/Source/JavaScriptCore/runtime/JSObject.h
r161220 r161230 28 28 #include "ArrayStorage.h" 29 29 #include "Butterfly.h" 30 #include "CallFrame.h" 30 31 #include "ClassInfo.h" 31 32 #include "CommonIdentifiers.h" 32 #include "C allFrame.h"33 #include "CopyWriteBarrier.h" 33 34 #include "DeferGC.h" 35 #include "Heap.h" 36 #include "IndexingHeaderInlines.h" 34 37 #include "JSCell.h" 35 38 #include "PropertySlot.h" … … 540 543 } 541 544 542 const Butterfly* butterfly() const { return m_butterfly ; }543 Butterfly* butterfly() { return m_butterfly ; }545 const Butterfly* butterfly() const { return m_butterfly.get(); } 546 Butterfly* butterfly() { return m_butterfly.get(); } 544 547 545 548 ConstPropertyStorage outOfLineStorage() const { return m_butterfly->propertyStorage(); } … … 606 609 607 610 JS_EXPORT_PRIVATE Butterfly* growOutOfLineStorage(VM&, size_t oldSize, size_t newSize); 608 void setButterflyWithoutChangingStructure( Butterfly*); // You probably don't want to call this.611 void setButterflyWithoutChangingStructure(VM&, Butterfly*); 609 612 610 613 void setStructure(VM&, Structure*); … … 976 979 977 980 protected: 978 Butterfly*m_butterfly;981 CopyWriteBarrier<Butterfly> m_butterfly; 979 982 }; 980 983 … … 1136 1139 inline void JSObject::setStructureAndButterfly(VM& vm, Structure* structure, Butterfly* butterfly) 1137 1140 { 1138 m_butterfly = butterfly; 1141 ASSERT(structure); 1142 ASSERT(!butterfly == (!structure->outOfLineCapacity() && !structure->hasIndexingHeader(this))); 1143 m_butterfly.set(vm, this, butterfly); 1139 1144 setStructure(vm, structure); 1140 1145 } … … 1147 1152 } 1148 1153 1149 inline void JSObject::setButterflyWithoutChangingStructure( Butterfly* butterfly)1150 { 1151 m_butterfly = butterfly;1154 inline void JSObject::setButterflyWithoutChangingStructure(VM& vm, Butterfly* butterfly) 1155 { 1156 m_butterfly.set(vm, this, butterfly); 1152 1157 } 1153 1158 … … 1179 1184 inline JSObject::JSObject(VM& vm, Structure* structure, Butterfly* butterfly) 1180 1185 : JSCell(vm, structure) 1181 , m_butterfly( butterfly)1186 , m_butterfly(vm, this, butterfly) 1182 1187 { 1183 1188 vm.heap.ascribeOwner(this, butterfly); … … 1303 1308 1304 1309 DeferGC deferGC(vm.heap); 1305 Butterfly* newButterfly = m_butterfly;1310 Butterfly* newButterfly = butterfly(); 1306 1311 if (structure()->putWillGrowOutOfLineStorage()) 1307 1312 newButterfly = growOutOfLineStorage(vm, structure()->outOfLineCapacity(), structure()->suggestedNewOutOfLineStorageCapacity()); … … 1324 1329 if (Structure* structure = Structure::addPropertyTransitionToExistingStructure(this->structure(), propertyName, attributes, specificFunction, offset)) { 1325 1330 DeferGC deferGC(vm.heap); 1326 Butterfly* newButterfly = m_butterfly; 1327 if (currentCapacity != structure->outOfLineCapacity()) 1331 Butterfly* newButterfly = butterfly(); 1332 if (currentCapacity != structure->outOfLineCapacity()) { 1333 ASSERT(structure != this->structure()); 1328 1334 newButterfly = growOutOfLineStorage(vm, currentCapacity, structure->outOfLineCapacity()); 1335 } 1329 1336 1330 1337 validateOffset(offset); … … 1437 1444 DeferGC deferGC(vm.heap); 1438 1445 ASSERT(!value.isGetterSetter() && !(attributes & Accessor)); 1439 Butterfly* newButterfly = m_butterfly ;1446 Butterfly* newButterfly = m_butterfly.get(); 1440 1447 if (structure()->putWillGrowOutOfLineStorage()) 1441 1448 newButterfly = growOutOfLineStorage(vm, structure()->outOfLineCapacity(), structure()->suggestedNewOutOfLineStorageCapacity()); -
trunk/Source/JavaScriptCore/runtime/MapData.cpp
r158875 r161230 199 199 size_t requiredSize = std::max(m_capacity + (m_capacity / 2) + 1, minimumMapSize); 200 200 void* newStorage = 0; 201 DeferGC defer(*callFrame->heap()); 201 202 if (!callFrame->heap()->tryAllocateStorage(this, requiredSize * sizeof(Entry), &newStorage)) { 202 203 throwOutOfMemoryError(callFrame); 203 204 return false; 204 205 } 205 DeferGC defer(*callFrame->heap());206 206 Entry* newEntries = static_cast<Entry*>(newStorage); 207 207 if (shouldPack()) … … 209 209 else 210 210 replaceBackingStore(newEntries, requiredSize); 211 Heap::writeBarrier(this); 211 212 return true; 212 213 } -
trunk/Source/JavaScriptCore/runtime/Structure.cpp
r159395 r161230 274 274 275 275 if (table) { 276 table = table->copy(vm, 0, numberOfSlotsForLastOffset(m_offset, m_inlineCapacity));276 table = table->copy(vm, structure, numberOfSlotsForLastOffset(m_offset, m_inlineCapacity)); 277 277 structure->m_lock.unlock(); 278 278 }
Note: See TracChangeset
for help on using the changeset viewer.