Changeset 253520 in webkit for trunk/Source/JavaScriptCore/dfg
- Timestamp:
- Dec 13, 2019, 8:34:45 PM (5 years ago)
- Location:
- trunk/Source/JavaScriptCore/dfg
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h
r253243 r253520 2628 2628 // with StructureRegisterationPhase we must say we produce an original array 2629 2629 // allocation structure. 2630 setForNode(node, 2631 m_graph.globalObjectFor(node->origin.semantic)->originalArrayStructureForIndexingType(ArrayWithContiguous)); 2630 #if USE(JSVALUE64) 2631 BitVector* bitVector = node->bitVector(); 2632 if (node->numChildren() == 1 && bitVector->get(0)) { 2633 Edge use = m_graph.varArgChild(node, 0); 2634 if (use->op() == PhantomSpread) { 2635 if (use->child1()->op() == PhantomNewArrayBuffer) { 2636 auto* immutableButterfly = use->child1()->castOperand<JSImmutableButterfly*>(); 2637 if (hasContiguous(immutableButterfly->indexingType())) { 2638 m_state.setShouldTryConstantFolding(true); 2639 setForNode(node, m_graph.globalObjectFor(node->origin.semantic)->originalArrayStructureForIndexingType(CopyOnWriteArrayWithContiguous)); 2640 break; 2641 } 2642 } 2643 } else { 2644 setForNode(node, m_graph.globalObjectFor(node->origin.semantic)->originalArrayStructureForIndexingType(CopyOnWriteArrayWithContiguous)); 2645 break; 2646 } 2647 } 2648 #endif 2649 setForNode(node, m_graph.globalObjectFor(node->origin.semantic)->originalArrayStructureForIndexingType(ArrayWithContiguous)); 2632 2650 } else { 2633 2651 setForNode(node, … … 2650 2668 } 2651 2669 2652 setForNode(node, 2653 m_vm.fixedArrayStructure.get()); 2670 setForNode(node, m_vm.immutableButterflyStructures[arrayIndexFromIndexingType(CopyOnWriteArrayWithContiguous) - NumberOfIndexingShapes].get()); 2654 2671 break; 2655 2672 -
trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
r253263 r253520 54 54 #include "InstanceOfStatus.h" 55 55 #include "JSCInlines.h" 56 #include "JSFixedArray.h"57 56 #include "JSImmutableButterfly.h" 58 57 #include "JSInternalPromise.h" -
trunk/Source/JavaScriptCore/dfg/DFGClobberize.h
r252684 r253520 36 36 #include "DOMJITSignature.h" 37 37 #include "InlineCallFrame.h" 38 #include "JSFixedArray.h"39 38 #include "JSImmutableButterfly.h" 40 39 … … 1421 1420 1422 1421 case NewArrayWithSpread: { 1423 // This also reads from JSFixedArray's data store, but we don't have any way of describing that yet.1424 1422 read(HeapObjectCount); 1423 // This appears to read nothing because it's only reading immutable butterfly data. 1425 1424 for (unsigned i = 0; i < node->numChildren(); i++) { 1426 1425 Node* child = graph.varArgChild(node, i).node(); -
trunk/Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp
r253243 r253520 858 858 } 859 859 860 case NewArrayWithSpread: { 861 if (m_graph.isWatchingHavingABadTimeWatchpoint(node)) { 862 BitVector* bitVector = node->bitVector(); 863 if (node->numChildren() == 1 && bitVector->get(0)) { 864 Edge use = m_graph.varArgChild(node, 0); 865 if (use->op() == PhantomSpread) { 866 if (use->child1()->op() == PhantomNewArrayBuffer) { 867 auto* immutableButterfly = use->child1()->castOperand<JSImmutableButterfly*>(); 868 if (hasContiguous(immutableButterfly->indexingType())) { 869 node->convertToNewArrayBuffer(m_graph.freeze(immutableButterfly)); 870 changed = true; 871 break; 872 } 873 } 874 } 875 } 876 } 877 break; 878 } 879 860 880 case ToNumber: { 861 881 if (m_state.forNode(node->child1()).m_type & ~SpecBytecodeNumber) -
trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp
r253458 r253520 55 55 #include "JSBigInt.h" 56 56 #include "JSCInlines.h" 57 #include "JSFixedArray.h"58 57 #include "JSGenericTypedArrayViewConstructorInlines.h" 59 58 #include "JSGlobalObjectFunctions.h" … … 3072 3071 for (unsigned i = 0; i < numItems; i++) { 3073 3072 JSValue value = JSValue::decode(values[i]); 3074 if (JS FixedArray* array = jsDynamicCast<JSFixedArray*>(vm, value))3075 checkedLength += array-> size();3073 if (JSImmutableButterfly* array = jsDynamicCast<JSImmutableButterfly*>(vm, value)) 3074 checkedLength += array->publicLength(); 3076 3075 else 3077 3076 ++checkedLength; … … 3101 3100 for (unsigned i = 0; i < numItems; i++) { 3102 3101 JSValue value = JSValue::decode(values[i]); 3103 if (JS FixedArray* array = jsDynamicCast<JSFixedArray*>(vm, value)) {3102 if (JSImmutableButterfly* array = jsDynamicCast<JSImmutableButterfly*>(vm, value)) { 3104 3103 // We are spreading. 3105 for (unsigned i = 0; i < array-> size(); i++) {3104 for (unsigned i = 0; i < array->publicLength(); i++) { 3106 3105 result->putDirectIndex(globalObject, index, array->get(i)); 3107 3106 RETURN_IF_EXCEPTION(scope, nullptr); … … 3119 3118 } 3120 3119 3121 JSCell* operationCreate FixedArray(JSGlobalObject* globalObject, unsigned length)3122 { 3123 VM& vm = globalObject->vm(); 3124 CallFrame* callFrame = DECLARE_CALL_FRAME(vm); 3125 JITOperationPrologueCallFrameTracer tracer(vm, callFrame); 3126 auto scope = DECLARE_THROW_SCOPE(vm); 3127 3128 if (JS FixedArray* result = JSFixedArray::tryCreate(vm, vm.fixedArrayStructure.get(), length))3120 JSCell* operationCreateImmutableButterfly(JSGlobalObject* globalObject, unsigned length) 3121 { 3122 VM& vm = globalObject->vm(); 3123 CallFrame* callFrame = DECLARE_CALL_FRAME(vm); 3124 JITOperationPrologueCallFrameTracer tracer(vm, callFrame); 3125 auto scope = DECLARE_THROW_SCOPE(vm); 3126 3127 if (JSImmutableButterfly* result = JSImmutableButterfly::tryCreate(vm, vm.immutableButterflyStructures[arrayIndexFromIndexingType(CopyOnWriteArrayWithContiguous) - NumberOfIndexingShapes].get(), length)) 3129 3128 return result; 3130 3129 … … 3144 3143 JSArray* array = jsCast<JSArray*>(iterable); 3145 3144 if (array->isIteratorProtocolFastAndNonObservable()) 3146 RELEASE_AND_RETURN(throwScope, JS FixedArray::createFromArray(globalObject, vm, array));3145 RELEASE_AND_RETURN(throwScope, JSImmutableButterfly::createFromArray(globalObject, vm, array)); 3147 3146 } 3148 3147 … … 3165 3164 } 3166 3165 3167 RELEASE_AND_RETURN(throwScope, JS FixedArray::createFromArray(globalObject, vm, array));3166 RELEASE_AND_RETURN(throwScope, JSImmutableButterfly::createFromArray(globalObject, vm, array)); 3168 3167 } 3169 3168 … … 3178 3177 ASSERT(array->isIteratorProtocolFastAndNonObservable()); 3179 3178 3180 return JS FixedArray::createFromArray(globalObject, vm, array);3179 return JSImmutableButterfly::createFromArray(globalObject, vm, array); 3181 3180 } 3182 3181 -
trunk/Source/JavaScriptCore/dfg/DFGOperations.h
r252825 r253520 280 280 JSCell* JIT_OPERATION operationSpreadGeneric(JSGlobalObject*, JSCell*); 281 281 JSCell* JIT_OPERATION operationNewArrayWithSpreadSlow(JSGlobalObject*, void*, uint32_t); 282 JSCell* JIT_OPERATION operationCreate FixedArray(JSGlobalObject*, unsigned length);282 JSCell* JIT_OPERATION operationCreateImmutableButterfly(JSGlobalObject*, unsigned length); 283 283 284 284 JSCell* JIT_OPERATION operationResolveScope(JSGlobalObject*, JSScope*, UniquedStringImpl*); -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r253263 r253520 55 55 #include "JSAsyncGeneratorFunction.h" 56 56 #include "JSCInlines.h" 57 #include "JSFixedArray.h"58 57 #include "JSGeneratorFunction.h" 59 58 #include "JSImmutableButterfly.h" … … 7903 7902 7904 7903 MacroAssembler::JumpList slowPath; 7904 MacroAssembler::JumpList done; 7905 7905 7906 7906 m_jit.load8(MacroAssembler::Address(argument, JSCell::indexingTypeAndMiscOffset()), scratch1GPR); 7907 m_jit.and32(TrustedImm32(IndexingModeMask), scratch1GPR); 7908 auto notShareCase = m_jit.branch32(CCallHelpers::NotEqual, scratch1GPR, TrustedImm32(CopyOnWriteArrayWithContiguous)); 7909 m_jit.loadPtr(MacroAssembler::Address(argument, JSObject::butterflyOffset()), resultGPR); 7910 m_jit.addPtr(TrustedImm32(-static_cast<ptrdiff_t>(JSImmutableButterfly::offsetOfData())), resultGPR); 7911 done.append(m_jit.jump()); 7912 7913 notShareCase.link(&m_jit); 7907 7914 m_jit.and32(TrustedImm32(IndexingShapeMask), scratch1GPR); 7908 7915 m_jit.sub32(TrustedImm32(Int32Shape), scratch1GPR); … … 7915 7922 m_jit.move(lengthGPR, scratch1GPR); 7916 7923 m_jit.lshift32(TrustedImm32(3), scratch1GPR); 7917 m_jit.add32(TrustedImm32(JSFixedArray::offsetOfData()), scratch1GPR); 7918 7919 m_jit.emitAllocateVariableSizedCell<JSFixedArray>(vm(), resultGPR, TrustedImmPtr(m_jit.graph().registerStructure(m_jit.graph().m_vm.fixedArrayStructure.get())), scratch1GPR, scratch1GPR, scratch2GPR, slowPath); 7920 m_jit.store32(lengthGPR, MacroAssembler::Address(resultGPR, JSFixedArray::offsetOfSize())); 7924 m_jit.add32(TrustedImm32(JSImmutableButterfly::offsetOfData()), scratch1GPR); 7925 7926 m_jit.emitAllocateVariableSizedCell<JSImmutableButterfly>(vm(), resultGPR, TrustedImmPtr(m_jit.graph().registerStructure(m_jit.graph().m_vm.immutableButterflyStructures[arrayIndexFromIndexingType(CopyOnWriteArrayWithContiguous) - NumberOfIndexingShapes].get())), scratch1GPR, scratch1GPR, scratch2GPR, slowPath); 7927 m_jit.store32(lengthGPR, MacroAssembler::Address(resultGPR, JSImmutableButterfly::offsetOfPublicLength())); 7928 m_jit.store32(lengthGPR, MacroAssembler::Address(resultGPR, JSImmutableButterfly::offsetOfVectorLength())); 7921 7929 7922 7930 m_jit.loadPtr(MacroAssembler::Address(argument, JSObject::butterflyOffset()), scratch1GPR); 7923 7924 MacroAssembler::JumpList done;7925 7931 7926 7932 m_jit.load8(MacroAssembler::Address(argument, JSCell::indexingTypeAndMiscOffset()), scratch2GPR); … … 7936 7942 m_jit.move(TrustedImm64(JSValue::encode(jsUndefined())), scratch2GPR); 7937 7943 notEmpty.link(&m_jit); 7938 m_jit.store64(scratch2GPR, MacroAssembler::BaseIndex(resultGPR, lengthGPR, MacroAssembler::TimesEight, JS FixedArray::offsetOfData()));7944 m_jit.store64(scratch2GPR, MacroAssembler::BaseIndex(resultGPR, lengthGPR, MacroAssembler::TimesEight, JSImmutableButterfly::offsetOfData())); 7939 7945 m_jit.branchTest32(MacroAssembler::NonZero, lengthGPR).linkTo(loopStart, &m_jit); 7940 7946 done.append(m_jit.jump()); … … 7953 7959 m_jit.boxDouble(doubleFPR, scratch2GPR); 7954 7960 doStore.link(&m_jit); 7955 m_jit.store64(scratch2GPR, MacroAssembler::BaseIndex(resultGPR, lengthGPR, MacroAssembler::TimesEight, JS FixedArray::offsetOfData()));7961 m_jit.store64(scratch2GPR, MacroAssembler::BaseIndex(resultGPR, lengthGPR, MacroAssembler::TimesEight, JSImmutableButterfly::offsetOfData())); 7956 7962 m_jit.branchTest32(MacroAssembler::NonZero, lengthGPR).linkTo(loopStart, &m_jit); 7957 7963 done.append(m_jit.jump()); … … 8143 8149 { 8144 8150 ASSERT(node->op() == NewArrayWithSpread); 8151 JSGlobalObject* globalObject = m_jit.graph().globalObjectFor(node->origin.semantic); 8145 8152 8146 8153 #if USE(JSVALUE64) … … 8150 8157 8151 8158 BitVector* bitVector = node->bitVector(); 8159 8160 if (node->numChildren() == 1 && bitVector->get(0)) { 8161 Edge use = m_jit.graph().varArgChild(node, 0); 8162 SpeculateCellOperand immutableButterfly(this, use); 8163 GPRTemporary result(this); 8164 GPRTemporary butterfly(this); 8165 GPRTemporary scratch1(this); 8166 GPRTemporary scratch2(this); 8167 8168 GPRReg immutableButterflyGPR = immutableButterfly.gpr(); 8169 GPRReg resultGPR = result.gpr(); 8170 GPRReg butterflyGPR = butterfly.gpr(); 8171 GPRReg scratch1GPR = scratch1.gpr(); 8172 GPRReg scratch2GPR = scratch2.gpr(); 8173 8174 RegisteredStructure structure = m_jit.graph().registerStructure(globalObject->originalArrayStructureForIndexingType(CopyOnWriteArrayWithContiguous)); 8175 8176 MacroAssembler::JumpList slowCases; 8177 8178 m_jit.move(immutableButterflyGPR, butterflyGPR); 8179 m_jit.addPtr(TrustedImm32(JSImmutableButterfly::offsetOfData()), butterflyGPR); 8180 8181 emitAllocateJSObject<JSArray>(resultGPR, TrustedImmPtr(structure), butterflyGPR, scratch1GPR, scratch2GPR, slowCases); 8182 8183 addSlowPathGenerator(slowPathCall(slowCases, this, operationNewArrayBuffer, resultGPR, &vm(), structure, immutableButterflyGPR)); 8184 8185 cellResult(resultGPR, node); 8186 return; 8187 } 8188 8152 8189 { 8153 8190 unsigned startLength = 0; … … 8164 8201 if (bitVector->get(i)) { 8165 8202 Edge use = m_jit.graph().varArgChild(node, i); 8166 SpeculateCellOperand fixedArray(this, use);8167 GPRReg fixedArrayGPR = fixedArray.gpr();8168 speculationCheck(Overflow, JSValueRegs(), nullptr, m_jit.branchAdd32(MacroAssembler::Overflow, MacroAssembler::Address( fixedArrayGPR, JSFixedArray::offsetOfSize()), lengthGPR));8203 SpeculateCellOperand immutableButterfly(this, use); 8204 GPRReg immutableButterflyGPR = immutableButterfly.gpr(); 8205 speculationCheck(Overflow, JSValueRegs(), nullptr, m_jit.branchAdd32(MacroAssembler::Overflow, MacroAssembler::Address(immutableButterflyGPR, JSImmutableButterfly::offsetOfPublicLength()), lengthGPR)); 8169 8206 } 8170 8207 } … … 8177 8214 // non-ArrayStorage shaped array. 8178 8215 bool shouldAllowForArrayStorageStructureForLargeArrays = false; 8179 compileAllocateNewArrayWithSize( m_jit.graph().globalObjectFor(node->origin.semantic), resultGPR, lengthGPR, ArrayWithContiguous, shouldAllowForArrayStorageStructureForLargeArrays);8216 compileAllocateNewArrayWithSize(globalObject, resultGPR, lengthGPR, ArrayWithContiguous, shouldAllowForArrayStorageStructureForLargeArrays); 8180 8217 } 8181 8218 … … 8192 8229 Edge use = m_jit.graph().varArgChild(node, i); 8193 8230 if (bitVector->get(i)) { 8194 SpeculateCellOperand fixedArray(this, use);8195 GPRReg fixedArrayGPR = fixedArray.gpr();8196 8197 GPRTemporary fixedIndex(this);8198 GPRReg fixedIndexGPR = fixedIndex.gpr();8231 SpeculateCellOperand immutableButterfly(this, use); 8232 GPRReg immutableButterflyGPR = immutableButterfly.gpr(); 8233 8234 GPRTemporary immutableButterflyIndex(this); 8235 GPRReg immutableButterflyIndexGPR = immutableButterflyIndex.gpr(); 8199 8236 8200 8237 GPRTemporary item(this); 8201 8238 GPRReg itemGPR = item.gpr(); 8202 8239 8203 GPRTemporary fixedLength(this);8204 GPRReg fixedLengthGPR = fixedLength.gpr();8205 8206 m_jit.load32(MacroAssembler::Address( fixedArrayGPR, JSFixedArray::offsetOfSize()), fixedLengthGPR);8207 m_jit.move(TrustedImm32(0), fixedIndexGPR);8208 auto done = m_jit.branchPtr(MacroAssembler::AboveOrEqual, fixedIndexGPR, fixedLengthGPR);8240 GPRTemporary immutableButterflyLength(this); 8241 GPRReg immutableButterflyLengthGPR = immutableButterflyLength.gpr(); 8242 8243 m_jit.load32(MacroAssembler::Address(immutableButterflyGPR, JSImmutableButterfly::offsetOfPublicLength()), immutableButterflyLengthGPR); 8244 m_jit.move(TrustedImm32(0), immutableButterflyIndexGPR); 8245 auto done = m_jit.branchPtr(MacroAssembler::AboveOrEqual, immutableButterflyIndexGPR, immutableButterflyLengthGPR); 8209 8246 auto loopStart = m_jit.label(); 8210 8247 m_jit.load64( 8211 MacroAssembler::BaseIndex( fixedArrayGPR, fixedIndexGPR, MacroAssembler::TimesEight, JSFixedArray::offsetOfData()),8248 MacroAssembler::BaseIndex(immutableButterflyGPR, immutableButterflyIndexGPR, MacroAssembler::TimesEight, JSImmutableButterfly::offsetOfData()), 8212 8249 itemGPR); 8213 8250 8214 8251 m_jit.store64(itemGPR, MacroAssembler::BaseIndex(storageGPR, indexGPR, MacroAssembler::TimesEight)); 8215 m_jit.addPtr(TrustedImm32(1), fixedIndexGPR);8252 m_jit.addPtr(TrustedImm32(1), immutableButterflyIndexGPR); 8216 8253 m_jit.addPtr(TrustedImm32(1), indexGPR); 8217 m_jit.branchPtr(MacroAssembler::Below, fixedIndexGPR, fixedLengthGPR).linkTo(loopStart, &m_jit);8254 m_jit.branchPtr(MacroAssembler::Below, immutableButterflyIndexGPR, immutableButterflyLengthGPR).linkTo(loopStart, &m_jit); 8218 8255 8219 8256 done.link(&m_jit); … … 8240 8277 Edge use = m_jit.graph().m_varArgChildren[node->firstChild() + i]; 8241 8278 if (bitVector->get(i)) { 8242 SpeculateCellOperand fixedArray(this, use);8243 GPRReg arrayGPR = fixedArray.gpr();8279 SpeculateCellOperand immutableButterfly(this, use); 8280 GPRReg immutableButterflyGPR = immutableButterfly.gpr(); 8244 8281 #if USE(JSVALUE64) 8245 m_jit.store64( arrayGPR, &buffer[i]);8282 m_jit.store64(immutableButterflyGPR, &buffer[i]); 8246 8283 #else 8247 8284 char* pointer = static_cast<char*>(static_cast<void*>(&buffer[i])); 8248 m_jit.store32( arrayGPR, pointer + PayloadOffset);8285 m_jit.store32(immutableButterflyGPR, pointer + PayloadOffset); 8249 8286 m_jit.store32(TrustedImm32(JSValue::CellTag), pointer + TagOffset); 8250 8287 #endif … … 8267 8304 GPRReg resultGPR = result.gpr(); 8268 8305 8269 callOperation(operationNewArrayWithSpreadSlow, resultGPR, TrustedImmPtr::weakPointer(m_graph, m_graph.globalObjectFor(node->origin.semantic)), buffer, node->numChildren());8306 callOperation(operationNewArrayWithSpreadSlow, resultGPR, TrustedImmPtr::weakPointer(m_graph, globalObject), buffer, node->numChildren()); 8270 8307 m_jit.exceptionCheck(); 8271 8308 { … … 12614 12651 12615 12652 m_jit.move(scratchGPR, scratch3GPR); 12616 m_jit.addPtr(TrustedImm Ptr(JSImmutableButterfly::offsetOfData()), scratchGPR);12653 m_jit.addPtr(TrustedImm32(JSImmutableButterfly::offsetOfData()), scratchGPR); 12617 12654 12618 12655 emitAllocateJSObject<JSArray>(resultGPR, TrustedImmPtr(arrayStructure), scratchGPR, structureGPR, scratch2GPR, slowButArrayBufferCases);
Note:
See TracChangeset
for help on using the changeset viewer.