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/Arguments.cpp

    r179862 r179887  
    8888static EncodedJSValue JSC_HOST_CALL argumentsFuncIterator(ExecState*);
    8989
    90 void Arguments::copyToArguments(ExecState* exec, VirtualRegister firstElementDest, uint32_t copyLength, int32_t firstVarArgOffset)
    91 {
    92     uint32_t length = copyLength + firstVarArgOffset;
    93 
    94     if (UNLIKELY(m_overrodeLength)) {
    95         length = min(get(exec, exec->propertyNames().length).toUInt32(exec), length);
    96         for (unsigned i = firstVarArgOffset; i < length; i++)
    97             exec->r(firstElementDest + i - firstVarArgOffset) = get(exec, i);
    98         return;
    99     }
    100     ASSERT(length == this->length(exec));
    101     for (size_t i = firstVarArgOffset; i < length; ++i) {
    102         if (JSValue value = tryGetArgument(i))
    103             exec->r(firstElementDest + i - firstVarArgOffset) = value;
     90void Arguments::copyToArguments(ExecState* exec, VirtualRegister firstElementDest, unsigned offset, unsigned length)
     91{
     92    for (unsigned i = 0; i < length; ++i) {
     93        if (JSValue value = tryGetArgument(i + offset))
     94            exec->r(firstElementDest + i) = value;
    10495        else {
    105             exec->r(firstElementDest + i - firstVarArgOffset) = get(exec, i);
     96            exec->r(firstElementDest + i) = get(exec, i + offset);
    10697            if (UNLIKELY(exec->vm().exception()))
    10798                return;
Note: See TracChangeset for help on using the changeset viewer.