Ignore:
Timestamp:
Feb 10, 2015, 3:16:36 PM (10 years ago)
Author:
[email protected]
Message:

op_call_varargs should only load the length once
https://bugs.webkit.org/show_bug.cgi?id=141440
rdar://problem/19761683

Reviewed by Michael Saboff.

Refactors the pair of calls that set up the varargs frame so that the first call returns the
length, and the second call uses the length returned by the first one. It turns out that this
gave me an opportunity to shorten a lot of the code.

  • interpreter/Interpreter.cpp:

(JSC::sizeFrameForVarargs):
(JSC::loadVarargs):
(JSC::setupVarargsFrame):
(JSC::setupVarargsFrameAndSetThis):

  • interpreter/Interpreter.h:

(JSC::calleeFrameForVarargs):

  • jit/CCallHelpers.h:

(JSC::CCallHelpers::setupArgumentsWithExecState):

  • jit/JIT.h:
  • jit/JITCall.cpp:

(JSC::JIT::compileSetupVarargsFrame):

  • jit/JITCall32_64.cpp:

(JSC::JIT::compileSetupVarargsFrame):

  • jit/JITInlines.h:

(JSC::JIT::callOperation):

  • jit/JITOperations.cpp:
  • jit/JITOperations.h:
  • jit/SetupVarargsFrame.cpp:

(JSC::emitSetVarargsFrame):
(JSC::emitSetupVarargsFrameFastCase):

  • jit/SetupVarargsFrame.h:
  • llint/LLIntSlowPaths.cpp:

(JSC::LLInt::LLINT_SLOW_PATH_DECL):

  • runtime/Arguments.cpp:

(JSC::Arguments::copyToArguments):

  • runtime/Arguments.h:
  • runtime/JSArray.cpp:

(JSC::JSArray::copyToArguments):

  • runtime/JSArray.h:
  • runtime/VM.h:
  • tests/stress/call-varargs-length-effects.js: Added.

(foo):
(bar):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/runtime/JSArray.cpp

    r179862 r179887  
    15711571}
    15721572
    1573 void JSArray::copyToArguments(ExecState* exec, VirtualRegister firstElementDest, uint32_t copyLength, int32_t firstVarArgOffset)
    1574 {
    1575     unsigned i = firstVarArgOffset;
     1573void JSArray::copyToArguments(ExecState* exec, VirtualRegister firstElementDest, unsigned offset, unsigned length)
     1574{
     1575    unsigned i = offset;
    15761576    WriteBarrier<Unknown>* vector;
    15771577    unsigned vectorEnd;
    1578     unsigned length = copyLength + firstVarArgOffset;
     1578    length += offset; // We like to think of the length as being our length, rather than the output length.
    15791579    ASSERT(length == this->length());
    15801580    switch (indexingType()) {
     
    16031603            if (v != v)
    16041604                break;
    1605             exec->r(firstElementDest + i - firstVarArgOffset) = JSValue(JSValue::EncodeAsDouble, v);
     1605            exec->r(firstElementDest + i - offset) = JSValue(JSValue::EncodeAsDouble, v);
    16061606        }
    16071607        break;
     
    16281628        if (!v)
    16291629            break;
    1630         exec->r(firstElementDest + i - firstVarArgOffset) = v.get();
     1630        exec->r(firstElementDest + i - offset) = v.get();
    16311631    }
    16321632   
    16331633    for (; i < length; ++i) {
    1634         exec->r(firstElementDest + i - firstVarArgOffset) = get(exec, i);
     1634        exec->r(firstElementDest + i - offset) = get(exec, i);
    16351635        if (UNLIKELY(exec->vm().exception()))
    16361636            return;
Note: See TracChangeset for help on using the changeset viewer.