Changeset 224564 in webkit
- Timestamp:
- Nov 7, 2017, 10:29:31 PM (8 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r224550 r224564 1 2017-11-07 Saam Barati <sbarati@apple.com> 2 3 Only cage double butterfly accesses 4 https://bugs.webkit.org/show_bug.cgi?id=179202 5 6 Reviewed by Mark Lam. 7 8 This patch removes caging from all butterfly accesses except double loads/stores. 9 This is a performance vs security tradeoff. Double loads/stores are the only butterfly 10 loads/stores that can write arbitrary bit patterns, so we choose to keep them safe 11 by caging. The other load/stores we are no longer caging to get back performance on 12 various benchmarks. 13 14 * bytecode/AccessCase.cpp: 15 (JSC::AccessCase::generateImpl): 16 * bytecode/InlineAccess.cpp: 17 (JSC::InlineAccess::dumpCacheSizesAndCrash): 18 (JSC::InlineAccess::generateSelfPropertyAccess): 19 (JSC::InlineAccess::generateSelfPropertyReplace): 20 (JSC::InlineAccess::generateArrayLength): 21 * dfg/DFGFixedButterflyAccessUncagingPhase.cpp: 22 * dfg/DFGSpeculativeJIT.cpp: 23 (JSC::DFG::SpeculativeJIT::compileCreateRest): 24 (JSC::DFG::SpeculativeJIT::compileSpread): 25 (JSC::DFG::SpeculativeJIT::compileNewArrayWithSpread): 26 * dfg/DFGSpeculativeJIT64.cpp: 27 (JSC::DFG::SpeculativeJIT::compile): 28 * ftl/FTLLowerDFGToB3.cpp: 29 (JSC::FTL::DFG::LowerDFGToB3::compileGetDirectPname): 30 * jit/JITPropertyAccess.cpp: 31 (JSC::JIT::emitContiguousLoad): 32 (JSC::JIT::emitArrayStorageLoad): 33 (JSC::JIT::emitGenericContiguousPutByVal): 34 (JSC::JIT::emitArrayStoragePutByVal): 35 (JSC::JIT::emit_op_get_from_scope): 36 (JSC::JIT::emit_op_put_to_scope): 37 * llint/LowLevelInterpreter64.asm: 38 * runtime/AuxiliaryBarrier.h: 39 (JSC::AuxiliaryBarrier::operator-> const): 40 * runtime/Butterfly.h: 41 (JSC::Butterfly::caged): 42 (JSC::Butterfly::contiguousDouble): 43 * runtime/JSArray.cpp: 44 (JSC::JSArray::setLength): 45 (JSC::JSArray::pop): 46 (JSC::JSArray::shiftCountWithAnyIndexingType): 47 (JSC::JSArray::unshiftCountWithAnyIndexingType): 48 (JSC::JSArray::fillArgList): 49 (JSC::JSArray::copyToArguments): 50 * runtime/JSArrayInlines.h: 51 (JSC::JSArray::pushInline): 52 * runtime/JSObject.cpp: 53 (JSC::JSObject::heapSnapshot): 54 (JSC::JSObject::createInitialIndexedStorage): 55 (JSC::JSObject::createArrayStorage): 56 (JSC::JSObject::convertUndecidedToInt32): 57 (JSC::JSObject::ensureLengthSlow): 58 (JSC::JSObject::reallocateAndShrinkButterfly): 59 (JSC::JSObject::allocateMoreOutOfLineStorage): 60 * runtime/JSObject.h: 61 (JSC::JSObject::canGetIndexQuickly): 62 (JSC::JSObject::getIndexQuickly): 63 (JSC::JSObject::tryGetIndexQuickly const): 64 (JSC::JSObject::canSetIndexQuickly): 65 (JSC::JSObject::butterfly const): 66 (JSC::JSObject::butterfly): 67 1 68 2017-11-07 Mark Lam <mark.lam@apple.com> 2 69 -
trunk/Source/JavaScriptCore/bytecode/AccessCase.cpp
r224539 r224564 625 625 CCallHelpers::Address(baseForAccessGPR, JSObject::butterflyOffset()), 626 626 loadedValueGPR); 627 jit.cage(Gigacage::JSValue, loadedValueGPR);628 627 storageGPR = loadedValueGPR; 629 628 } … … 976 975 977 976 jit.loadPtr(CCallHelpers::Address(baseGPR, JSObject::butterflyOffset()), scratchGPR3); 978 jit.cage(Gigacage::JSValue, scratchGPR3);979 977 980 978 // We have scratchGPR = new storage, scratchGPR3 = old storage, … … 1057 1055 offsetInInlineStorage(m_offset) * sizeof(JSValue))); 1058 1056 } else { 1059 if (!allocating) {1057 if (!allocating) 1060 1058 jit.loadPtr(CCallHelpers::Address(baseGPR, JSObject::butterflyOffset()), scratchGPR); 1061 jit.cage(Gigacage::JSValue, scratchGPR);1062 }1063 1059 jit.storeValue( 1064 1060 valueRegs, … … 1096 1092 case ArrayLength: { 1097 1093 jit.loadPtr(CCallHelpers::Address(baseGPR, JSObject::butterflyOffset()), scratchGPR); 1098 jit.cage(Gigacage::JSValue, scratchGPR);1099 1094 jit.load32(CCallHelpers::Address(scratchGPR, ArrayStorage::lengthOffset()), scratchGPR); 1100 1095 state.failAndIgnore.append( -
trunk/Source/JavaScriptCore/bytecode/InlineAccess.cpp
r224258 r224564 58 58 CCallHelpers::NotEqual, value, CCallHelpers::TrustedImm32(IsArray | ContiguousShape)); 59 59 jit.loadPtr(CCallHelpers::Address(base, JSObject::butterflyOffset()), value); 60 jit.cage(Gigacage::JSValue, value);61 60 jit.load32(CCallHelpers::Address(value, ArrayStorage::lengthOffset()), value); 62 61 jit.boxInt32(scratchGPR, regs); … … 75 74 CCallHelpers::Address(base, JSObject::butterflyOffset()), 76 75 value); 77 jit.cage(Gigacage::JSValue, value);78 76 GPRReg storageGPR = value; 79 77 jit.loadValue( … … 119 117 120 118 jit.loadPtr(MacroAssembler::Address(base, JSObject::butterflyOffset()), value); 121 jit.cage(Gigacage::JSValue, value);122 119 jit.storeValue( 123 120 regs, … … 174 171 else { 175 172 jit.loadPtr(CCallHelpers::Address(base, JSObject::butterflyOffset()), value.payloadGPR()); 176 jit.cage(Gigacage::JSValue, value.payloadGPR());177 173 storage = value.payloadGPR(); 178 174 } … … 236 232 ASSERT(storage != InvalidGPRReg); 237 233 jit.loadPtr(CCallHelpers::Address(base, JSObject::butterflyOffset()), storage); 238 jit.cage(Gigacage::JSValue, storage);239 234 } 240 235 … … 275 270 CCallHelpers::NotEqual, scratch, CCallHelpers::TrustedImm32(array->indexingType())); 276 271 jit.loadPtr(CCallHelpers::Address(base, JSObject::butterflyOffset()), value.payloadGPR()); 277 jit.cage(Gigacage::JSValue, value.payloadGPR());278 272 jit.load32(CCallHelpers::Address(value.payloadGPR(), ArrayStorage::lengthOffset()), value.payloadGPR()); 279 273 jit.boxInt32(value.payloadGPR(), value); -
trunk/Source/JavaScriptCore/dfg/DFGFixedButterflyAccessUncagingPhase.cpp
r220118 r224564 76 76 if (!accessesOverlap(m_graph, node, Heap)) 77 77 break; 78 78 79 Node* toExclude = nullptr; 80 if (node->hasArrayMode() && node->arrayMode().type() != Array::Double) { 81 switch (node->op()) { 82 case ArrayPush: 83 toExclude = m_graph.varArgChild(node, 0).node(); 84 break; 85 case ArrayIndexOf: 86 toExclude = m_graph.varArgChild(node, node->numChildren() == 3 ? 2 : 3).node(); 87 break; 88 case ArrayPop: 89 toExclude = node->child2().node(); 90 break; 91 case HasIndexedProperty: 92 toExclude = node->child3().node(); 93 break; 94 case GetByVal: 95 toExclude = node->child3().node(); 96 break; 97 case PutByVal: 98 toExclude = m_graph.varArgChild(node, 3).node(); 99 break; 100 default: 101 break; 102 } 103 } 104 79 105 m_graph.doToChildren( 80 106 node, 81 107 [&] (Edge& edge) { 82 changed |= needCaging.add(edge.node()); 108 if (edge.node() != toExclude) 109 changed |= needCaging.add(edge.node()); 83 110 }); 84 111 break; -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r224280 r224564 7270 7270 7271 7271 m_jit.loadPtr(MacroAssembler::Address(arrayResultGPR, JSObject::butterflyOffset()), butterflyGPR); 7272 m_jit.cage(Gigacage::JSValue, butterflyGPR);7273 7272 7274 7273 CCallHelpers::Jump skipLoop = m_jit.branch32(MacroAssembler::Equal, arrayLengthGPR, TrustedImm32(0)); … … 7340 7339 7341 7340 m_jit.loadPtr(MacroAssembler::Address(argument, JSObject::butterflyOffset()), lengthGPR); 7342 m_jit.cage(Gigacage::JSValue, lengthGPR); 7341 m_jit.cage(Gigacage::JSValue, lengthGPR); // We may do a double memcpy loop below, so we conservatively cage. 7343 7342 m_jit.load32(MacroAssembler::Address(lengthGPR, Butterfly::offsetOfPublicLength()), lengthGPR); 7344 7343 static_assert(sizeof(JSValue) == 8 && 1 << 3 == 8, "This is strongly assumed in the code below."); … … 7351 7350 7352 7351 m_jit.loadPtr(MacroAssembler::Address(argument, JSObject::butterflyOffset()), scratch1GPR); 7353 m_jit.cage(Gigacage::JSValue, scratch1GPR); 7352 m_jit.cage(Gigacage::JSValue, scratch1GPR); // We may do a double memcpy loop below, so we conservatively cage. 7354 7353 7355 7354 MacroAssembler::JumpList done; … … 7374 7373 isDoubleArray.link(&m_jit); 7375 7374 { 7376 7377 7375 done.append(m_jit.branchTest32(MacroAssembler::Zero, lengthGPR)); 7378 7376 auto loopStart = m_jit.label(); … … 7461 7459 m_jit.move(TrustedImm32(0), indexGPR); 7462 7460 m_jit.loadPtr(MacroAssembler::Address(resultGPR, JSObject::butterflyOffset()), storageGPR); 7463 m_jit.cage(Gigacage::JSValue, storageGPR);7464 7461 7465 7462 for (unsigned i = 0; i < node->numChildren(); ++i) { -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
r224302 r224564 5784 5784 outOfLineAccess.link(&m_jit); 5785 5785 m_jit.loadPtr(MacroAssembler::Address(baseGPR, JSObject::butterflyOffset()), scratch2GPR); 5786 m_jit.cage(Gigacage::JSValue, scratch2GPR);5787 5786 m_jit.move(indexGPR, scratch1GPR); 5788 5787 m_jit.sub32(MacroAssembler::Address(enumeratorGPR, JSPropertyNameEnumerator::cachedInlineCapacityOffset()), scratch1GPR); -
trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp
r224302 r224564 9350 9350 int32_t offsetOfFirstProperty = static_cast<int32_t>(offsetInButterfly(firstOutOfLineOffset)) * sizeof(EncodedJSValue); 9351 9351 ValueFromBlock outOfLineResult = m_out.anchor( 9352 m_out.load64(m_out.baseIndex(m_heaps.properties.atAnyNumber(), caged(Gigacage::JSValue, storage), realIndex, ScaleEight, offsetOfFirstProperty)));9352 m_out.load64(m_out.baseIndex(m_heaps.properties.atAnyNumber(), storage, realIndex, ScaleEight, offsetOfFirstProperty))); 9353 9353 m_out.jump(continuation); 9354 9354 -
trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp
r223824 r224564 188 188 badType = patchableBranch32(NotEqual, regT2, TrustedImm32(expectedShape)); 189 189 loadPtr(Address(regT0, JSObject::butterflyOffset()), regT2); 190 cage(Gigacage::JSValue, regT2);191 190 slowCases.append(branch32(AboveOrEqual, regT1, Address(regT2, Butterfly::offsetOfPublicLength()))); 192 191 load64(BaseIndex(regT2, regT1, TimesEight), regT0); … … 204 203 205 204 loadPtr(Address(regT0, JSObject::butterflyOffset()), regT2); 206 cage(Gigacage::JSValue, regT2);207 205 slowCases.append(branch32(AboveOrEqual, regT1, Address(regT2, ArrayStorage::vectorLengthOffset()))); 208 206 … … 346 344 347 345 loadPtr(Address(regT0, JSObject::butterflyOffset()), regT2); 348 cage(Gigacage::JSValue, regT2); 346 if (indexingShape == DoubleShape) 347 cage(Gigacage::JSValue, regT2); 349 348 Jump outOfBounds = branch32(AboveOrEqual, regT1, Address(regT2, Butterfly::offsetOfPublicLength())); 350 349 … … 402 401 badType = patchableBranch32(NotEqual, regT2, TrustedImm32(ArrayStorageShape)); 403 402 loadPtr(Address(regT0, JSObject::butterflyOffset()), regT2); 404 cage(Gigacage::JSValue, regT2);405 403 slowCases.append(branch32(AboveOrEqual, regT1, Address(regT2, ArrayStorage::vectorLengthOffset()))); 406 404 … … 878 876 } 879 877 loadPtr(Address(base, JSObject::butterflyOffset()), scratch); 880 cage(Gigacage::JSValue, scratch);881 878 neg32(offset); 882 879 signExtend32ToPtr(offset, offset); … … 998 995 999 996 loadPtr(Address(regT0, JSObject::butterflyOffset()), regT0); 1000 cage(Gigacage::JSValue, regT0);1001 997 loadPtr(operandSlot, regT1); 1002 998 negPtr(regT1); -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
r224487 r224564 1225 1225 macro loadPropertyAtVariableOffset(propertyOffsetAsInt, objectAndStorage, value) 1226 1226 bilt propertyOffsetAsInt, firstOutOfLineOffset, .isInline 1227 load Caged(_g_gigacageBasePtrs + Gigacage::BasePtrs::jsValue, constexpr JSVALUE_GIGACAGE_MASK, JSObject::m_butterfly[objectAndStorage], objectAndStorage, value)1227 loadp JSObject::m_butterfly[objectAndStorage], objectAndStorage 1228 1228 negi propertyOffsetAsInt 1229 1229 sxi2q propertyOffsetAsInt, propertyOffsetAsInt … … 1236 1236 1237 1237 1238 macro storePropertyAtVariableOffset(propertyOffsetAsInt, objectAndStorage, value , scratch)1238 macro storePropertyAtVariableOffset(propertyOffsetAsInt, objectAndStorage, value) 1239 1239 bilt propertyOffsetAsInt, firstOutOfLineOffset, .isInline 1240 load Caged(_g_gigacageBasePtrs + Gigacage::BasePtrs::jsValue, constexpr JSVALUE_GIGACAGE_MASK, JSObject::m_butterfly[objectAndStorage], objectAndStorage, scratch)1240 loadp JSObject::m_butterfly[objectAndStorage], objectAndStorage 1241 1241 negi propertyOffsetAsInt 1242 1242 sxi2q propertyOffsetAsInt, propertyOffsetAsInt … … 1461 1461 loadConstantOrVariable(t1, t2) 1462 1462 loadisFromInstruction(5, t1) 1463 storePropertyAtVariableOffset(t1, t0, t2 , t3)1463 storePropertyAtVariableOffset(t1, t0, t2) 1464 1464 writeBarrierOnOperands(1, 3) 1465 1465 dispatch(constexpr op_put_by_id_length) … … 2322 2322 loadConstantOrVariable(t1, t2) 2323 2323 loadisFromInstruction(6, t1) 2324 storePropertyAtVariableOffset(t1, t0, t2 , t3)2324 storePropertyAtVariableOffset(t1, t0, t2) 2325 2325 end 2326 2326 -
trunk/Source/JavaScriptCore/runtime/AuxiliaryBarrier.h
r220352 r224564 57 57 template<typename U> 58 58 void setWithoutBarrier(U&& value) { m_value = std::forward<U>(value); } 59 60 T operator->() const { return get(); } 59 61 60 62 private: -
trunk/Source/JavaScriptCore/runtime/Butterfly.h
r218794 r224564 28 28 #include "IndexingHeader.h" 29 29 #include "PropertyStorage.h" 30 #include <wtf/Gigacage.h> 30 31 #include <wtf/Noncopyable.h> 31 32 … … 103 104 104 105 char* pointer() { return reinterpret_cast<char*>(this); } 106 Butterfly* caged() { return Gigacage::caged(Gigacage::JSValue, this); } 105 107 106 108 static ptrdiff_t offsetOfIndexingHeader() { return IndexingHeader::offsetOfIndexingHeader(); } … … 130 132 ContiguousJSValues contiguousInt32() { return ContiguousJSValues(indexingPayload<WriteBarrier<Unknown>>(), vectorLength()); } 131 133 132 ContiguousDoubles contiguousDouble() { return ContiguousDoubles( indexingPayload<double>(), vectorLength()); }134 ContiguousDoubles contiguousDouble() { return ContiguousDoubles(caged()->indexingPayload<double>(), vectorLength()); } 133 135 ContiguousJSValues contiguous() { return ContiguousJSValues(indexingPayload<WriteBarrier<Unknown>>(), vectorLength()); } 134 136 -
trunk/Source/JavaScriptCore/runtime/ButterflyInlines.h
r220352 r224564 108 108 return create(vm, intendedOwner, 0, newPropertyCapacity, false, IndexingHeader(), 0); 109 109 110 oldButterfly = oldButterfly->caged(); 111 110 112 size_t preCapacity = oldButterfly->indexingHeader()->preCapacity(structure); 111 113 size_t indexingPayloadSizeInBytes = oldButterfly->indexingHeader()->indexingPayloadSizeInBytes(structure); -
trunk/Source/JavaScriptCore/runtime/JSArray.cpp
r223746 r224564 559 559 auto scope = DECLARE_THROW_SCOPE(vm); 560 560 561 Butterfly* butterfly = m_butterfly.getMayBeNull();561 Butterfly* butterfly = this->butterfly(); 562 562 switch (indexingType()) { 563 563 case ArrayClass: … … 629 629 auto scope = DECLARE_THROW_SCOPE(vm); 630 630 631 Butterfly* butterfly = m_butterfly.getMayBeNull();631 Butterfly* butterfly = this->butterfly(); 632 632 633 633 switch (indexingType()) { … … 880 880 RELEASE_ASSERT(count > 0); 881 881 882 Butterfly* butterfly = m_butterfly.getMayBeNull();882 Butterfly* butterfly = this->butterfly(); 883 883 884 884 switch (indexingType()) { … … 1036 1036 auto scope = DECLARE_THROW_SCOPE(vm); 1037 1037 1038 Butterfly* butterfly = m_butterfly.getMayBeNull();1038 Butterfly* butterfly = this->butterfly(); 1039 1039 1040 1040 switch (indexingType()) { … … 1059 1059 return false; 1060 1060 } 1061 butterfly = m_butterfly.getMayBeNull();1061 butterfly = this->butterfly(); 1062 1062 1063 1063 // We have to check for holes before we start moving things around so that we don't get halfway … … 1103 1103 return false; 1104 1104 } 1105 butterfly = m_butterfly.getMayBeNull();1105 butterfly = this->butterfly(); 1106 1106 1107 1107 // We have to check for holes before we start moving things around so that we don't get halfway … … 1146 1146 WriteBarrier<Unknown>* vector; 1147 1147 1148 Butterfly* butterfly = m_butterfly.getMayBeNull();1148 Butterfly* butterfly = this->butterfly(); 1149 1149 1150 1150 switch (indexingType()) { … … 1219 1219 ASSERT(length == this->length()); 1220 1220 1221 Butterfly* butterfly = m_butterfly.getMayBeNull();1221 Butterfly* butterfly = this->butterfly(); 1222 1222 switch (indexingType()) { 1223 1223 case ArrayClass: -
trunk/Source/JavaScriptCore/runtime/JSArrayInlines.h
r222827 r224564 89 89 auto scope = DECLARE_THROW_SCOPE(vm); 90 90 91 Butterfly* butterfly = m_butterfly.getMayBeNull();91 Butterfly* butterfly = this->butterfly(); 92 92 93 93 switch (indexingType()) { -
trunk/Source/JavaScriptCore/runtime/JSObject.cpp
r224416 r224564 463 463 } 464 464 465 Butterfly* butterfly = thisObject-> m_butterfly.getMayBeNull();465 Butterfly* butterfly = thisObject->butterfly(); 466 466 if (butterfly) { 467 467 WriteBarrier<Unknown>* data = nullptr; … … 1027 1027 unsigned vectorLength = Butterfly::optimalContiguousVectorLength(propertyCapacity, length); 1028 1028 Butterfly* newButterfly = Butterfly::createOrGrowArrayRight( 1029 m_butterfly.getMayBeNull(), vm, this, structure, propertyCapacity, false, 0,1029 butterfly(), vm, this, structure, propertyCapacity, false, 0, 1030 1030 sizeof(EncodedJSValue) * vectorLength); 1031 1031 newButterfly->setPublicLength(length); … … 1115 1115 ASSERT_UNUSED(oldType, !hasIndexedProperties(oldType)); 1116 1116 1117 Butterfly* newButterfly = createArrayStorageButterfly(vm, this, oldStructure, length, vectorLength, m_butterfly.getMayBeNull());1117 Butterfly* newButterfly = createArrayStorageButterfly(vm, this, oldStructure, length, vectorLength, butterfly()); 1118 1118 ArrayStorage* result = newButterfly->arrayStorage(); 1119 1119 Structure* newStructure = Structure::nonPropertyTransition(vm, oldStructure, suggestedArrayStorageTransition()); … … 1133 1133 ASSERT(hasUndecided(indexingType())); 1134 1134 1135 Butterfly* butterfly = m_butterfly.getMayBeNull();1135 Butterfly* butterfly = this->butterfly(); 1136 1136 for (unsigned i = butterfly->vectorLength(); i--;) 1137 1137 butterfly->contiguousInt32()[i].setWithoutWriteBarrier(JSValue()); … … 3174 3174 bool JSObject::ensureLengthSlow(VM& vm, unsigned length) 3175 3175 { 3176 Butterfly* butterfly = m_butterfly.get();3176 Butterfly* butterfly = this->butterfly()->caged(); 3177 3177 3178 3178 ASSERT(length <= MAX_STORAGE_VECTOR_LENGTH); … … 3234 3234 3235 3235 DeferGC deferGC(vm.heap); 3236 Butterfly* newButterfly = m_butterfly->resizeArray(vm, this, structure(), 0, ArrayStorage::sizeFor(length));3236 Butterfly* newButterfly = butterfly()->caged()->resizeArray(vm, this, structure(), 0, ArrayStorage::sizeFor(length)); 3237 3237 newButterfly->setVectorLength(length); 3238 3238 newButterfly->setPublicLength(length); … … 3248 3248 // capacity, since we might have already mutated the structure in-place. 3249 3249 3250 return Butterfly::createOrGrowPropertyStorage( m_butterfly.getMayBeNull(), vm, this, structure(vm), oldSize, newSize);3250 return Butterfly::createOrGrowPropertyStorage(butterfly(), vm, this, structure(vm), oldSize, newSize); 3251 3251 } 3252 3252 -
trunk/Source/JavaScriptCore/runtime/JSObject.h
r223746 r224564 256 256 bool canGetIndexQuickly(unsigned i) 257 257 { 258 Butterfly* butterfly = m_butterfly.getMayBeNull();258 Butterfly* butterfly = this->butterfly(); 259 259 switch (indexingType()) { 260 260 case ALL_BLANK_INDEXING_TYPES: … … 282 282 JSValue getIndexQuickly(unsigned i) 283 283 { 284 Butterfly* butterfly = m_butterfly.get();284 Butterfly* butterfly = this->butterfly(); 285 285 switch (indexingType()) { 286 286 case ALL_INT32_INDEXING_TYPES: … … 300 300 JSValue tryGetIndexQuickly(unsigned i) const 301 301 { 302 Butterfly* butterfly = m_butterfly.getMayBeNull();302 Butterfly* butterfly = const_cast<JSObject*>(this)->butterfly(); 303 303 switch (indexingType()) { 304 304 case ALL_BLANK_INDEXING_TYPES: … … 354 354 bool canSetIndexQuickly(unsigned i) 355 355 { 356 Butterfly* butterfly = m_butterfly.getMayBeNull();356 Butterfly* butterfly = this->butterfly(); 357 357 switch (indexingType()) { 358 358 case ALL_BLANK_INDEXING_TYPES: … … 670 670 } 671 671 672 const Butterfly* butterfly() const { return m_butterfly.get MayBeNull(); }673 Butterfly* butterfly() { return m_butterfly.get MayBeNull(); }672 const Butterfly* butterfly() const { return m_butterfly.get(); } 673 Butterfly* butterfly() { return m_butterfly.get(); } 674 674 675 675 ConstPropertyStorage outOfLineStorage() const { return m_butterfly->propertyStorage(); } … … 1053 1053 1054 1054 protected: 1055 CagedBarrierPtr<Gigacage::JSValue, Butterfly> m_butterfly;1055 AuxiliaryBarrier<Butterfly*> m_butterfly; 1056 1056 #if USE(JSVALUE32_64) 1057 1057 private:
Note:
See TracChangeset
for help on using the changeset viewer.