- Revision
- 100224
- Author
- [email protected]
- Date
- 2011-11-14 17:39:52 -0800 (Mon, 14 Nov 2011)
Log 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.
Modified Paths
Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (100223 => 100224)
--- trunk/Source/_javascript_Core/ChangeLog 2011-11-15 01:32:34 UTC (rev 100223)
+++ trunk/Source/_javascript_Core/ChangeLog 2011-11-15 01:39:52 UTC (rev 100224)
@@ -1,3 +1,34 @@
+2011-11-14 Geoffrey Garen <[email protected]>
+
+ 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.
+
2011-11-14 Gavin Barraclough <[email protected]>
Should sign the jsc binary
Modified: trunk/Source/_javascript_Core/interpreter/Interpreter.cpp (100223 => 100224)
--- trunk/Source/_javascript_Core/interpreter/Interpreter.cpp 2011-11-15 01:32:34 UTC (rev 100223)
+++ trunk/Source/_javascript_Core/interpreter/Interpreter.cpp 2011-11-15 01:39:52 UTC (rev 100224)
@@ -695,14 +695,12 @@
callFrame->setScopeChain(scopeChain);
JSActivation* activation = asActivation(scopeChain->object.get());
- activation->copyRegisters(*scopeChain->globalData);
- if (JSValue arguments = callFrame->uncheckedR(unmodifiedArgumentsRegister(oldCodeBlock->argumentsRegister())).jsValue()) {
- if (!oldCodeBlock->isStrictMode())
- asArguments(arguments)->setActivation(callFrame->globalData(), activation);
- }
+ activation->tearOff(*scopeChain->globalData);
+ if (JSValue arguments = callFrame->uncheckedR(unmodifiedArgumentsRegister(oldCodeBlock->argumentsRegister())).jsValue())
+ asArguments(arguments)->didTearOffActivation(callFrame->globalData(), activation);
} else if (oldCodeBlock->usesArguments() && !oldCodeBlock->isStrictMode()) {
if (JSValue arguments = callFrame->uncheckedR(unmodifiedArgumentsRegister(oldCodeBlock->argumentsRegister())).jsValue())
- asArguments(arguments)->copyRegisters(callFrame->globalData());
+ asArguments(arguments)->tearOff(callFrame->globalData());
}
CallFrame* callerFrame = callFrame->callerFrame();
@@ -4453,15 +4451,13 @@
ASSERT(codeBlock->needsFullScopeChain());
JSValue activationValue = callFrame->r(activation).jsValue();
if (activationValue) {
- asActivation(activationValue)->copyRegisters(*globalData);
+ asActivation(activationValue)->tearOff(*globalData);
- if (JSValue argumentsValue = callFrame->r(unmodifiedArgumentsRegister(arguments)).jsValue()) {
- if (!codeBlock->isStrictMode())
- asArguments(argumentsValue)->setActivation(*globalData, asActivation(activationValue));
- }
+ if (JSValue argumentsValue = callFrame->r(unmodifiedArgumentsRegister(arguments)).jsValue())
+ asArguments(argumentsValue)->didTearOffActivation(*globalData, asActivation(activationValue));
} else if (JSValue argumentsValue = callFrame->r(unmodifiedArgumentsRegister(arguments)).jsValue()) {
if (!codeBlock->isStrictMode())
- asArguments(argumentsValue)->copyRegisters(*globalData);
+ asArguments(argumentsValue)->tearOff(*globalData);
}
vPC += OPCODE_LENGTH(op_tear_off_activation);
@@ -4483,7 +4479,7 @@
ASSERT(!codeBlock->needsFullScopeChain() && codeBlock->ownerExecutable()->usesArguments());
if (JSValue arguments = callFrame->r(unmodifiedArgumentsRegister(src1)).jsValue())
- asArguments(arguments)->copyRegisters(*globalData);
+ asArguments(arguments)->tearOff(*globalData);
vPC += OPCODE_LENGTH(op_tear_off_arguments);
NEXT_INSTRUCTION();
@@ -5144,7 +5140,7 @@
return arguments;
}
- return Arguments::createAndCopyRegisters(functionCallFrame->globalData(), functionCallFrame);
+ return Arguments::createAndTearOff(functionCallFrame->globalData(), functionCallFrame);
}
JSValue Interpreter::retrieveCaller(CallFrame* callFrame, JSFunction* function) const
Modified: trunk/Source/_javascript_Core/jit/JITStubs.cpp (100223 => 100224)
--- trunk/Source/_javascript_Core/jit/JITStubs.cpp 2011-11-15 01:32:34 UTC (rev 100223)
+++ trunk/Source/_javascript_Core/jit/JITStubs.cpp 2011-11-15 01:39:52 UTC (rev 100224)
@@ -2394,16 +2394,14 @@
if (!activationValue) {
if (JSValue v = stackFrame.args[1].jsValue()) {
if (!stackFrame.callFrame->codeBlock()->isStrictMode())
- asArguments(v)->copyRegisters(*stackFrame.globalData);
+ asArguments(v)->tearOff(*stackFrame.globalData);
}
return;
}
JSActivation* activation = asActivation(stackFrame.args[0].jsValue());
- activation->copyRegisters(*stackFrame.globalData);
- if (JSValue v = stackFrame.args[1].jsValue()) {
- if (!stackFrame.callFrame->codeBlock()->isStrictMode())
- asArguments(v)->setActivation(*stackFrame.globalData, activation);
- }
+ activation->tearOff(*stackFrame.globalData);
+ if (JSValue v = stackFrame.args[1].jsValue())
+ asArguments(v)->didTearOffActivation(*stackFrame.globalData, activation);
}
DEFINE_STUB_FUNCTION(void, op_tear_off_arguments)
@@ -2411,7 +2409,7 @@
STUB_INIT_STACK_FRAME(stackFrame);
ASSERT(stackFrame.callFrame->codeBlock()->usesArguments() && !stackFrame.callFrame->codeBlock()->needsFullScopeChain());
- asArguments(stackFrame.args[0].jsValue())->copyRegisters(*stackFrame.globalData);
+ asArguments(stackFrame.args[0].jsValue())->tearOff(*stackFrame.globalData);
}
DEFINE_STUB_FUNCTION(void, op_profile_will_call)
Modified: trunk/Source/_javascript_Core/runtime/Arguments.h (100223 => 100224)
--- trunk/Source/_javascript_Core/runtime/Arguments.h 2011-11-15 01:32:34 UTC (rev 100223)
+++ trunk/Source/_javascript_Core/runtime/Arguments.h 2011-11-15 01:39:52 UTC (rev 100224)
@@ -70,10 +70,10 @@
return arguments;
}
- static Arguments* createAndCopyRegisters(JSGlobalData& globalData, CallFrame* callFrame)
+ static Arguments* createAndTearOff(JSGlobalData& globalData, CallFrame* callFrame)
{
Arguments* arguments = new (allocateCell<Arguments>(globalData.heap)) Arguments(callFrame);
- arguments->finishCreationAndCopyRegisters(callFrame);
+ arguments->finishCreationAndTearOff(callFrame);
return arguments;
}
@@ -111,11 +111,12 @@
}
void copyToRegisters(ExecState* exec, Register* buffer, uint32_t maxSize);
- void copyRegisters(JSGlobalData&);
+ void tearOff(JSGlobalData&);
bool isTornOff() const { return d->registerArray; }
- void setActivation(JSGlobalData& globalData, JSActivation* activation)
+ void didTearOffActivation(JSGlobalData& globalData, JSActivation* activation)
{
- ASSERT(!d->registerArray);
+ if (isTornOff())
+ return;
d->activation.set(globalData, this, activation);
d->registers = &activation->registerAt(0);
}
@@ -128,9 +129,9 @@
protected:
static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesVisitChildren | OverridesGetPropertyNames | JSObject::StructureFlags;
- void finishCreationButDontCopyRegisters(CallFrame*);
+ void finishCreationButDontTearOff(CallFrame*);
void finishCreation(CallFrame*);
- void finishCreationAndCopyRegisters(CallFrame*);
+ void finishCreationAndTearOff(CallFrame*);
void finishCreation(CallFrame*, NoParametersType);
private:
@@ -190,7 +191,7 @@
{
}
- inline void Arguments::finishCreationButDontCopyRegisters(CallFrame* callFrame)
+ inline void Arguments::finishCreationButDontTearOff(CallFrame* callFrame)
{
Base::finishCreation(callFrame->globalData());
ASSERT(inherits(&s_info));
@@ -233,12 +234,12 @@
inline void Arguments::finishCreation(CallFrame* callFrame)
{
ASSERT(!callFrame->isInlineCallFrame());
- finishCreationButDontCopyRegisters(callFrame);
+ finishCreationButDontTearOff(callFrame);
if (d->isStrictMode)
- copyRegisters(callFrame->globalData());
+ tearOff(callFrame->globalData());
}
- inline void Arguments::finishCreationAndCopyRegisters(CallFrame* callFrame)
+ inline void Arguments::finishCreationAndTearOff(CallFrame* callFrame)
{
Base::finishCreation(callFrame->globalData());
ASSERT(inherits(&s_info));
@@ -356,10 +357,10 @@
d->overrodeCaller = false;
d->isStrictMode = callFrame->codeBlock()->isStrictMode();
if (d->isStrictMode)
- copyRegisters(callFrame->globalData());
+ tearOff(callFrame->globalData());
}
- inline void Arguments::copyRegisters(JSGlobalData& globalData)
+ inline void Arguments::tearOff(JSGlobalData& globalData)
{
ASSERT(!isTornOff());
@@ -376,24 +377,6 @@
d->registerArray = registerArray.release();
}
- // This JSActivation function is defined here so it can get at Arguments::setRegisters.
- inline void JSActivation::copyRegisters(JSGlobalData& globalData)
- {
- ASSERT(!m_registerArray);
-
- size_t numLocals = m_numCapturedVars + m_numParametersMinusThis;
-
- if (!numLocals)
- return;
-
- int registerOffset = m_numParametersMinusThis + RegisterFile::CallFrameHeaderSize;
- size_t registerArraySize = numLocals + RegisterFile::CallFrameHeaderSize;
-
- OwnArrayPtr<WriteBarrier<Unknown> > registerArray = copyRegisterArray(globalData, m_registers - registerOffset, registerArraySize, m_numParametersMinusThis + 1);
- WriteBarrier<Unknown>* registers = registerArray.get() + registerOffset;
- setRegisters(registers, registerArray.release());
- }
-
} // namespace JSC
#endif // Arguments_h
Modified: trunk/Source/_javascript_Core/runtime/JSActivation.h (100223 => 100224)
--- trunk/Source/_javascript_Core/runtime/JSActivation.h 2011-11-15 01:32:34 UTC (rev 100223)
+++ trunk/Source/_javascript_Core/runtime/JSActivation.h 2011-11-15 01:39:52 UTC (rev 100224)
@@ -69,7 +69,7 @@
static JSObject* toThisObject(JSCell*, ExecState*);
- void copyRegisters(JSGlobalData&);
+ void tearOff(JSGlobalData&);
static const ClassInfo s_info;
@@ -114,6 +114,23 @@
return false;
}
+ inline void JSActivation::tearOff(JSGlobalData& globalData)
+ {
+ ASSERT(!m_registerArray);
+
+ size_t numLocals = m_numCapturedVars + m_numParametersMinusThis;
+
+ if (!numLocals)
+ return;
+
+ int registerOffset = m_numParametersMinusThis + RegisterFile::CallFrameHeaderSize;
+ size_t registerArraySize = numLocals + RegisterFile::CallFrameHeaderSize;
+
+ OwnArrayPtr<WriteBarrier<Unknown> > registerArray = copyRegisterArray(globalData, m_registers - registerOffset, registerArraySize, m_numParametersMinusThis + 1);
+ WriteBarrier<Unknown>* registers = registerArray.get() + registerOffset;
+ setRegisters(registers, registerArray.release());
+ }
+
} // namespace JSC
#endif // JSActivation_h