Changeset 253520 in webkit for trunk/Source/JavaScriptCore/dfg


Ignore:
Timestamp:
Dec 13, 2019, 8:34:45 PM (5 years ago)
Author:
[email protected]
Message:

[JSC] Remove JSFixedArray, and use JSImmutableButterfly instead
https://bugs.webkit.org/show_bug.cgi?id=204402

Reviewed by Mark Lam.

JSTests:

  • stress/new-array-with-spread-cow-double.js: Added.

(shouldBe):
(shouldBeArray):
(test):

  • stress/new-array-with-spread-cow-int.js: Added.

(shouldBe):
(shouldBeArray):
(test):

  • stress/new-array-with-spread-cow.js: Added.

(shouldBe):
(shouldBeArray):
(test):

Source/JavaScriptCore:

This patch removes JSFixedArray, and use JSImmutableButterfly instead. JSFixedArray can be replaced by
JSImmutableButterfly with Contiguous shape. And further, we can create an array from JSImmutableButterfly
generated by Spread node in NewArrayBufferWithSpread.

Currently, we are always creating contiguous JSImmutableButterfly from Spread. If it takes contiguous CoW
array, we can reuse JSImmutableButterfly of the input. But if it is CoW and not contiguous shape (like,
CopyOnWriteArrayWithInt32), we create a JSImmutableButterfly and copy it to this new butterfly. We can
extend it to accept non-contiguous JSImmutableButterfly in the future.

  • JavaScriptCore.xcodeproj/project.pbxproj:
  • Sources.txt:
  • bytecompiler/BytecodeGenerator.cpp:
  • dfg/DFGAbstractInterpreterInlines.h:

(JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):

  • dfg/DFGByteCodeParser.cpp:
  • dfg/DFGClobberize.h:

(JSC::DFG::clobberize):

  • dfg/DFGConstantFoldingPhase.cpp:

(JSC::DFG::ConstantFoldingPhase::foldConstants):

  • dfg/DFGOperations.cpp:
  • dfg/DFGOperations.h:
  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::compileSpread):
(JSC::DFG::SpeculativeJIT::compileNewArrayWithSpread):
(JSC::DFG::SpeculativeJIT::compileObjectKeys):

  • ftl/FTLAbstractHeapRepository.h:
  • ftl/FTLLowerDFGToB3.cpp:

(JSC::FTL::DFG::LowerDFGToB3::compileNewArrayWithSpread):
(JSC::FTL::DFG::LowerDFGToB3::compileSpread):
(JSC::FTL::DFG::LowerDFGToB3::toButterfly):

  • ftl/FTLOperations.cpp:

(JSC::FTL::operationMaterializeObjectInOSR):

  • interpreter/Interpreter.cpp:

(JSC::sizeOfVarargs):
(JSC::loadVarargs):

  • runtime/CommonSlowPaths.cpp:

(JSC::SLOW_PATH_DECL):

  • runtime/JSCast.h:
  • runtime/JSFixedArray.cpp: Removed.
  • runtime/JSFixedArray.h: Removed.
  • runtime/JSImmutableButterfly.h:

(JSC::JSImmutableButterfly::createFromArray):
(JSC::JSImmutableButterfly::offsetOfPublicLength):
(JSC::JSImmutableButterfly::offsetOfVectorLength):

  • runtime/JSType.cpp:

(WTF::printInternal):

  • runtime/JSType.h:
  • runtime/VM.cpp:

(JSC::VM::VM):

  • runtime/VM.h:
Location:
trunk/Source/JavaScriptCore/dfg
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h

    r253243 r253520  
    26282628            // with StructureRegisterationPhase we must say we produce an original array
    26292629            // 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));
    26322650        } else {
    26332651            setForNode(node,
     
    26502668        }
    26512669
    2652         setForNode(node,
    2653             m_vm.fixedArrayStructure.get());
     2670        setForNode(node, m_vm.immutableButterflyStructures[arrayIndexFromIndexingType(CopyOnWriteArrayWithContiguous) - NumberOfIndexingShapes].get());
    26542671        break;
    26552672       
  • trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp

    r253263 r253520  
    5454#include "InstanceOfStatus.h"
    5555#include "JSCInlines.h"
    56 #include "JSFixedArray.h"
    5756#include "JSImmutableButterfly.h"
    5857#include "JSInternalPromise.h"
  • trunk/Source/JavaScriptCore/dfg/DFGClobberize.h

    r252684 r253520  
    3636#include "DOMJITSignature.h"
    3737#include "InlineCallFrame.h"
    38 #include "JSFixedArray.h"
    3938#include "JSImmutableButterfly.h"
    4039
     
    14211420
    14221421    case NewArrayWithSpread: {
    1423         // This also reads from JSFixedArray's data store, but we don't have any way of describing that yet.
    14241422        read(HeapObjectCount);
     1423        // This appears to read nothing because it's only reading immutable butterfly data.
    14251424        for (unsigned i = 0; i < node->numChildren(); i++) {
    14261425            Node* child = graph.varArgChild(node, i).node();
  • trunk/Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp

    r253243 r253520  
    858858            }
    859859
     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
    860880            case ToNumber: {
    861881                if (m_state.forNode(node->child1()).m_type & ~SpecBytecodeNumber)
  • trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp

    r253458 r253520  
    5555#include "JSBigInt.h"
    5656#include "JSCInlines.h"
    57 #include "JSFixedArray.h"
    5857#include "JSGenericTypedArrayViewConstructorInlines.h"
    5958#include "JSGlobalObjectFunctions.h"
     
    30723071    for (unsigned i = 0; i < numItems; i++) {
    30733072        JSValue value = JSValue::decode(values[i]);
    3074         if (JSFixedArray* array = jsDynamicCast<JSFixedArray*>(vm, value))
    3075             checkedLength += array->size();
     3073        if (JSImmutableButterfly* array = jsDynamicCast<JSImmutableButterfly*>(vm, value))
     3074            checkedLength += array->publicLength();
    30763075        else
    30773076            ++checkedLength;
     
    31013100    for (unsigned i = 0; i < numItems; i++) {
    31023101        JSValue value = JSValue::decode(values[i]);
    3103         if (JSFixedArray* array = jsDynamicCast<JSFixedArray*>(vm, value)) {
     3102        if (JSImmutableButterfly* array = jsDynamicCast<JSImmutableButterfly*>(vm, value)) {
    31043103            // We are spreading.
    3105             for (unsigned i = 0; i < array->size(); i++) {
     3104            for (unsigned i = 0; i < array->publicLength(); i++) {
    31063105                result->putDirectIndex(globalObject, index, array->get(i));
    31073106                RETURN_IF_EXCEPTION(scope, nullptr);
     
    31193118}
    31203119
    3121 JSCell* operationCreateFixedArray(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 (JSFixedArray* result = JSFixedArray::tryCreate(vm, vm.fixedArrayStructure.get(), length))
     3120JSCell* 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))
    31293128        return result;
    31303129
     
    31443143        JSArray* array = jsCast<JSArray*>(iterable);
    31453144        if (array->isIteratorProtocolFastAndNonObservable())
    3146             RELEASE_AND_RETURN(throwScope, JSFixedArray::createFromArray(globalObject, vm, array));
     3145            RELEASE_AND_RETURN(throwScope, JSImmutableButterfly::createFromArray(globalObject, vm, array));
    31473146    }
    31483147
     
    31653164    }
    31663165
    3167     RELEASE_AND_RETURN(throwScope, JSFixedArray::createFromArray(globalObject, vm, array));
     3166    RELEASE_AND_RETURN(throwScope, JSImmutableButterfly::createFromArray(globalObject, vm, array));
    31683167}
    31693168
     
    31783177    ASSERT(array->isIteratorProtocolFastAndNonObservable());
    31793178
    3180     return JSFixedArray::createFromArray(globalObject, vm, array);
     3179    return JSImmutableButterfly::createFromArray(globalObject, vm, array);
    31813180}
    31823181
  • trunk/Source/JavaScriptCore/dfg/DFGOperations.h

    r252825 r253520  
    280280JSCell* JIT_OPERATION operationSpreadGeneric(JSGlobalObject*, JSCell*);
    281281JSCell* JIT_OPERATION operationNewArrayWithSpreadSlow(JSGlobalObject*, void*, uint32_t);
    282 JSCell* JIT_OPERATION operationCreateFixedArray(JSGlobalObject*, unsigned length);
     282JSCell* JIT_OPERATION operationCreateImmutableButterfly(JSGlobalObject*, unsigned length);
    283283
    284284JSCell* JIT_OPERATION operationResolveScope(JSGlobalObject*, JSScope*, UniquedStringImpl*);
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp

    r253263 r253520  
    5555#include "JSAsyncGeneratorFunction.h"
    5656#include "JSCInlines.h"
    57 #include "JSFixedArray.h"
    5857#include "JSGeneratorFunction.h"
    5958#include "JSImmutableButterfly.h"
     
    79037902
    79047903        MacroAssembler::JumpList slowPath;
     7904        MacroAssembler::JumpList done;
    79057905
    79067906        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);
    79077914        m_jit.and32(TrustedImm32(IndexingShapeMask), scratch1GPR);
    79087915        m_jit.sub32(TrustedImm32(Int32Shape), scratch1GPR);
     
    79157922        m_jit.move(lengthGPR, scratch1GPR);
    79167923        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()));
    79217929
    79227930        m_jit.loadPtr(MacroAssembler::Address(argument, JSObject::butterflyOffset()), scratch1GPR);
    7923 
    7924         MacroAssembler::JumpList done;
    79257931
    79267932        m_jit.load8(MacroAssembler::Address(argument, JSCell::indexingTypeAndMiscOffset()), scratch2GPR);
     
    79367942            m_jit.move(TrustedImm64(JSValue::encode(jsUndefined())), scratch2GPR);
    79377943            notEmpty.link(&m_jit);
    7938             m_jit.store64(scratch2GPR, MacroAssembler::BaseIndex(resultGPR, lengthGPR, MacroAssembler::TimesEight, JSFixedArray::offsetOfData()));
     7944            m_jit.store64(scratch2GPR, MacroAssembler::BaseIndex(resultGPR, lengthGPR, MacroAssembler::TimesEight, JSImmutableButterfly::offsetOfData()));
    79397945            m_jit.branchTest32(MacroAssembler::NonZero, lengthGPR).linkTo(loopStart, &m_jit);
    79407946            done.append(m_jit.jump());
     
    79537959            m_jit.boxDouble(doubleFPR, scratch2GPR);
    79547960            doStore.link(&m_jit);
    7955             m_jit.store64(scratch2GPR, MacroAssembler::BaseIndex(resultGPR, lengthGPR, MacroAssembler::TimesEight, JSFixedArray::offsetOfData()));
     7961            m_jit.store64(scratch2GPR, MacroAssembler::BaseIndex(resultGPR, lengthGPR, MacroAssembler::TimesEight, JSImmutableButterfly::offsetOfData()));
    79567962            m_jit.branchTest32(MacroAssembler::NonZero, lengthGPR).linkTo(loopStart, &m_jit);
    79577963            done.append(m_jit.jump());
     
    81438149{
    81448150    ASSERT(node->op() == NewArrayWithSpread);
     8151    JSGlobalObject* globalObject = m_jit.graph().globalObjectFor(node->origin.semantic);
    81458152
    81468153#if USE(JSVALUE64)
     
    81508157
    81518158        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
    81528189        {
    81538190            unsigned startLength = 0;
     
    81648201                if (bitVector->get(i)) {
    81658202                    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));
    81698206                }
    81708207            }
     
    81778214            // non-ArrayStorage shaped array.
    81788215            bool shouldAllowForArrayStorageStructureForLargeArrays = false;
    8179             compileAllocateNewArrayWithSize(m_jit.graph().globalObjectFor(node->origin.semantic), resultGPR, lengthGPR, ArrayWithContiguous, shouldAllowForArrayStorageStructureForLargeArrays);
     8216            compileAllocateNewArrayWithSize(globalObject, resultGPR, lengthGPR, ArrayWithContiguous, shouldAllowForArrayStorageStructureForLargeArrays);
    81808217        }
    81818218
     
    81928229            Edge use = m_jit.graph().varArgChild(node, i);
    81938230            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();
    81998236
    82008237                GPRTemporary item(this);
    82018238                GPRReg itemGPR = item.gpr();
    82028239
    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);
    82098246                auto loopStart = m_jit.label();
    82108247                m_jit.load64(
    8211                     MacroAssembler::BaseIndex(fixedArrayGPR, fixedIndexGPR, MacroAssembler::TimesEight, JSFixedArray::offsetOfData()),
     8248                    MacroAssembler::BaseIndex(immutableButterflyGPR, immutableButterflyIndexGPR, MacroAssembler::TimesEight, JSImmutableButterfly::offsetOfData()),
    82128249                    itemGPR);
    82138250
    82148251                m_jit.store64(itemGPR, MacroAssembler::BaseIndex(storageGPR, indexGPR, MacroAssembler::TimesEight));
    8215                 m_jit.addPtr(TrustedImm32(1), fixedIndexGPR);
     8252                m_jit.addPtr(TrustedImm32(1), immutableButterflyIndexGPR);
    82168253                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);
    82188255
    82198256                done.link(&m_jit);
     
    82408277        Edge use = m_jit.graph().m_varArgChildren[node->firstChild() + i];
    82418278        if (bitVector->get(i)) {
    8242             SpeculateCellOperand fixedArray(this, use);
    8243             GPRReg arrayGPR = fixedArray.gpr();
     8279            SpeculateCellOperand immutableButterfly(this, use);
     8280            GPRReg immutableButterflyGPR = immutableButterfly.gpr();
    82448281#if USE(JSVALUE64)
    8245             m_jit.store64(arrayGPR, &buffer[i]);
     8282            m_jit.store64(immutableButterflyGPR, &buffer[i]);
    82468283#else
    82478284            char* pointer = static_cast<char*>(static_cast<void*>(&buffer[i]));
    8248             m_jit.store32(arrayGPR, pointer + PayloadOffset);
     8285            m_jit.store32(immutableButterflyGPR, pointer + PayloadOffset);
    82498286            m_jit.store32(TrustedImm32(JSValue::CellTag), pointer + TagOffset);
    82508287#endif
     
    82678304    GPRReg resultGPR = result.gpr();
    82688305
    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());
    82708307    m_jit.exceptionCheck();
    82718308    {
     
    1261412651
    1261512652            m_jit.move(scratchGPR, scratch3GPR);
    12616             m_jit.addPtr(TrustedImmPtr(JSImmutableButterfly::offsetOfData()), scratchGPR);
     12653            m_jit.addPtr(TrustedImm32(JSImmutableButterfly::offsetOfData()), scratchGPR);
    1261712654
    1261812655            emitAllocateJSObject<JSArray>(resultGPR, TrustedImmPtr(arrayStructure), scratchGPR, structureGPR, scratch2GPR, slowButArrayBufferCases);
Note: See TracChangeset for help on using the changeset viewer.