⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 100224 in webkit


Ignore:
Timestamp:
Nov 14, 2011, 5:39:52 PM (15 years ago)
Author:
ggaren@apple.com
Message:

A little bit of arguments / activation cleanup
https://bugs.webkit.org/show_bug.cgi?id=72339

Reviewed by Gavin Barraclough.

Renamed copyRegisters => tearOff to match bytecode and other terminology.

Renamed setActivation => didTearOffActivation to indicate that this is a
notification the object may choose to ignore. Moved "Should I ignore?"
code into the arguments object to avoid duplication elsewhere.

  • interpreter/Interpreter.cpp:

(JSC::Interpreter::unwindCallFrame):
(JSC::Interpreter::privateExecute):
(JSC::Interpreter::retrieveArguments):

  • jit/JITStubs.cpp:

(JSC::DEFINE_STUB_FUNCTION):

  • runtime/Arguments.h:

(JSC::Arguments::createAndTearOff):
(JSC::Arguments::didTearOffActivation):
(JSC::Arguments::finishCreationButDontTearOff):
(JSC::Arguments::finishCreation):
(JSC::Arguments::finishCreationAndTearOff):
(JSC::Arguments::tearOff):

  • runtime/JSActivation.h:

(JSC::JSActivation::tearOff): Moved Activation's code into its own header
because that's where it belongs.

Location:
trunk/Source/JavaScriptCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r100223 r100224  
     12011-11-14  Geoffrey Garen  <ggaren@apple.com>
     2
     3        A little bit of arguments / activation cleanup
     4        https://bugs.webkit.org/show_bug.cgi?id=72339
     5
     6        Reviewed by Gavin Barraclough.
     7       
     8        Renamed copyRegisters => tearOff to match bytecode and other terminology.
     9       
     10        Renamed setActivation => didTearOffActivation to indicate that this is a
     11        notification the object may choose to ignore. Moved "Should I ignore?"
     12        code into the arguments object to avoid duplication elsewhere.
     13
     14        * interpreter/Interpreter.cpp:
     15        (JSC::Interpreter::unwindCallFrame):
     16        (JSC::Interpreter::privateExecute):
     17        (JSC::Interpreter::retrieveArguments):
     18        * jit/JITStubs.cpp:
     19        (JSC::DEFINE_STUB_FUNCTION):
     20        * runtime/Arguments.h:
     21        (JSC::Arguments::createAndTearOff):
     22        (JSC::Arguments::didTearOffActivation):
     23        (JSC::Arguments::finishCreationButDontTearOff):
     24        (JSC::Arguments::finishCreation):
     25        (JSC::Arguments::finishCreationAndTearOff):
     26        (JSC::Arguments::tearOff):
     27
     28        * runtime/JSActivation.h:
     29        (JSC::JSActivation::tearOff): Moved Activation's code into its own header
     30        because that's where it belongs.
     31
    1322011-11-14  Gavin Barraclough  <barraclough@apple.com>
    233
  • trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp

    r100165 r100224  
    696696        callFrame->setScopeChain(scopeChain);
    697697        JSActivation* activation = asActivation(scopeChain->object.get());
    698         activation->copyRegisters(*scopeChain->globalData);
    699         if (JSValue arguments = callFrame->uncheckedR(unmodifiedArgumentsRegister(oldCodeBlock->argumentsRegister())).jsValue()) {
    700             if (!oldCodeBlock->isStrictMode())
    701                 asArguments(arguments)->setActivation(callFrame->globalData(), activation);
    702         }
     698        activation->tearOff(*scopeChain->globalData);
     699        if (JSValue arguments = callFrame->uncheckedR(unmodifiedArgumentsRegister(oldCodeBlock->argumentsRegister())).jsValue())
     700            asArguments(arguments)->didTearOffActivation(callFrame->globalData(), activation);
    703701    } else if (oldCodeBlock->usesArguments() && !oldCodeBlock->isStrictMode()) {
    704702        if (JSValue arguments = callFrame->uncheckedR(unmodifiedArgumentsRegister(oldCodeBlock->argumentsRegister())).jsValue())
    705             asArguments(arguments)->copyRegisters(callFrame->globalData());
     703            asArguments(arguments)->tearOff(callFrame->globalData());
    706704    }
    707705
     
    44544452        JSValue activationValue = callFrame->r(activation).jsValue();
    44554453        if (activationValue) {
    4456             asActivation(activationValue)->copyRegisters(*globalData);
    4457 
    4458             if (JSValue argumentsValue = callFrame->r(unmodifiedArgumentsRegister(arguments)).jsValue()) {
    4459                 if (!codeBlock->isStrictMode())
    4460                     asArguments(argumentsValue)->setActivation(*globalData, asActivation(activationValue));
    4461             }
     4454            asActivation(activationValue)->tearOff(*globalData);
     4455
     4456            if (JSValue argumentsValue = callFrame->r(unmodifiedArgumentsRegister(arguments)).jsValue())
     4457                asArguments(argumentsValue)->didTearOffActivation(*globalData, asActivation(activationValue));
    44624458        } else if (JSValue argumentsValue = callFrame->r(unmodifiedArgumentsRegister(arguments)).jsValue()) {
    44634459            if (!codeBlock->isStrictMode())
    4464                 asArguments(argumentsValue)->copyRegisters(*globalData);
     4460                asArguments(argumentsValue)->tearOff(*globalData);
    44654461        }
    44664462
     
    44844480
    44854481        if (JSValue arguments = callFrame->r(unmodifiedArgumentsRegister(src1)).jsValue())
    4486             asArguments(arguments)->copyRegisters(*globalData);
     4482            asArguments(arguments)->tearOff(*globalData);
    44874483
    44884484        vPC += OPCODE_LENGTH(op_tear_off_arguments);
     
    51455141    }
    51465142
    5147     return Arguments::createAndCopyRegisters(functionCallFrame->globalData(), functionCallFrame);
     5143    return Arguments::createAndTearOff(functionCallFrame->globalData(), functionCallFrame);
    51485144}
    51495145
  • trunk/Source/JavaScriptCore/jit/JITStubs.cpp

    r100165 r100224  
    23952395        if (JSValue v = stackFrame.args[1].jsValue()) {
    23962396            if (!stackFrame.callFrame->codeBlock()->isStrictMode())
    2397                 asArguments(v)->copyRegisters(*stackFrame.globalData);
     2397                asArguments(v)->tearOff(*stackFrame.globalData);
    23982398        }
    23992399        return;
    24002400    }
    24012401    JSActivation* activation = asActivation(stackFrame.args[0].jsValue());
    2402     activation->copyRegisters(*stackFrame.globalData);
    2403     if (JSValue v = stackFrame.args[1].jsValue()) {
    2404         if (!stackFrame.callFrame->codeBlock()->isStrictMode())
    2405             asArguments(v)->setActivation(*stackFrame.globalData, activation);
    2406     }
     2402    activation->tearOff(*stackFrame.globalData);
     2403    if (JSValue v = stackFrame.args[1].jsValue())
     2404        asArguments(v)->didTearOffActivation(*stackFrame.globalData, activation);
    24072405}
    24082406
     
    24122410
    24132411    ASSERT(stackFrame.callFrame->codeBlock()->usesArguments() && !stackFrame.callFrame->codeBlock()->needsFullScopeChain());
    2414     asArguments(stackFrame.args[0].jsValue())->copyRegisters(*stackFrame.globalData);
     2412    asArguments(stackFrame.args[0].jsValue())->tearOff(*stackFrame.globalData);
    24152413}
    24162414
  • trunk/Source/JavaScriptCore/runtime/Arguments.h

    r100165 r100224  
    7171        }
    7272       
    73         static Arguments* createAndCopyRegisters(JSGlobalData& globalData, CallFrame* callFrame)
     73        static Arguments* createAndTearOff(JSGlobalData& globalData, CallFrame* callFrame)
    7474        {
    7575            Arguments* arguments = new (allocateCell<Arguments>(globalData.heap)) Arguments(callFrame);
    76             arguments->finishCreationAndCopyRegisters(callFrame);
     76            arguments->finishCreationAndTearOff(callFrame);
    7777            return arguments;
    7878        }
     
    112112       
    113113        void copyToRegisters(ExecState* exec, Register* buffer, uint32_t maxSize);
    114         void copyRegisters(JSGlobalData&);
     114        void tearOff(JSGlobalData&);
    115115        bool isTornOff() const { return d->registerArray; }
    116         void setActivation(JSGlobalData& globalData, JSActivation* activation)
    117         {
    118             ASSERT(!d->registerArray);
     116        void didTearOffActivation(JSGlobalData& globalData, JSActivation* activation)
     117        {
     118            if (isTornOff())
     119                return;
    119120            d->activation.set(globalData, this, activation);
    120121            d->registers = &activation->registerAt(0);
     
    129130        static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesVisitChildren | OverridesGetPropertyNames | JSObject::StructureFlags;
    130131
    131         void finishCreationButDontCopyRegisters(CallFrame*);
     132        void finishCreationButDontTearOff(CallFrame*);
    132133        void finishCreation(CallFrame*);
    133         void finishCreationAndCopyRegisters(CallFrame*);
     134        void finishCreationAndTearOff(CallFrame*);
    134135        void finishCreation(CallFrame*, NoParametersType);
    135136
     
    191192    }
    192193   
    193     inline void Arguments::finishCreationButDontCopyRegisters(CallFrame* callFrame)
     194    inline void Arguments::finishCreationButDontTearOff(CallFrame* callFrame)
    194195    {
    195196        Base::finishCreation(callFrame->globalData());
     
    234235    {
    235236        ASSERT(!callFrame->isInlineCallFrame());
    236         finishCreationButDontCopyRegisters(callFrame);
     237        finishCreationButDontTearOff(callFrame);
    237238        if (d->isStrictMode)
    238             copyRegisters(callFrame->globalData());
    239     }
    240 
    241     inline void Arguments::finishCreationAndCopyRegisters(CallFrame* callFrame)
     239            tearOff(callFrame->globalData());
     240    }
     241
     242    inline void Arguments::finishCreationAndTearOff(CallFrame* callFrame)
    242243    {
    243244        Base::finishCreation(callFrame->globalData());
     
    357358        d->isStrictMode = callFrame->codeBlock()->isStrictMode();
    358359        if (d->isStrictMode)
    359             copyRegisters(callFrame->globalData());
    360     }
    361 
    362     inline void Arguments::copyRegisters(JSGlobalData& globalData)
     360            tearOff(callFrame->globalData());
     361    }
     362
     363    inline void Arguments::tearOff(JSGlobalData& globalData)
    363364    {
    364365        ASSERT(!isTornOff());
     
    377378    }
    378379
    379     // This JSActivation function is defined here so it can get at Arguments::setRegisters.
    380     inline void JSActivation::copyRegisters(JSGlobalData& globalData)
    381     {
    382         ASSERT(!m_registerArray);
    383 
    384         size_t numLocals = m_numCapturedVars + m_numParametersMinusThis;
    385 
    386         if (!numLocals)
    387             return;
    388 
    389         int registerOffset = m_numParametersMinusThis + RegisterFile::CallFrameHeaderSize;
    390         size_t registerArraySize = numLocals + RegisterFile::CallFrameHeaderSize;
    391 
    392         OwnArrayPtr<WriteBarrier<Unknown> > registerArray = copyRegisterArray(globalData, m_registers - registerOffset, registerArraySize, m_numParametersMinusThis + 1);
    393         WriteBarrier<Unknown>* registers = registerArray.get() + registerOffset;
    394         setRegisters(registers, registerArray.release());
    395     }
    396 
    397380} // namespace JSC
    398381
  • trunk/Source/JavaScriptCore/runtime/JSActivation.h

    r99768 r100224  
    7070        static JSObject* toThisObject(JSCell*, ExecState*);
    7171
    72         void copyRegisters(JSGlobalData&);
     72        void tearOff(JSGlobalData&);
    7373       
    7474        static const ClassInfo s_info;
     
    115115    }
    116116
     117    inline void JSActivation::tearOff(JSGlobalData& globalData)
     118    {
     119        ASSERT(!m_registerArray);
     120
     121        size_t numLocals = m_numCapturedVars + m_numParametersMinusThis;
     122
     123        if (!numLocals)
     124            return;
     125
     126        int registerOffset = m_numParametersMinusThis + RegisterFile::CallFrameHeaderSize;
     127        size_t registerArraySize = numLocals + RegisterFile::CallFrameHeaderSize;
     128
     129        OwnArrayPtr<WriteBarrier<Unknown> > registerArray = copyRegisterArray(globalData, m_registers - registerOffset, registerArraySize, m_numParametersMinusThis + 1);
     130        WriteBarrier<Unknown>* registers = registerArray.get() + registerOffset;
     131        setRegisters(registers, registerArray.release());
     132    }
     133
    117134} // namespace JSC
    118135
Note: See TracChangeset for help on using the changeset viewer.