Modified: trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp (98830 => 98831)
--- trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp 2011-10-30 22:42:24 UTC (rev 98830)
+++ trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp 2011-10-30 22:47:31 UTC (rev 98831)
@@ -255,6 +255,9 @@
void flush(int operand)
{
+ // FIXME: This should check if the same operand had already been flushed to
+ // some other local variable.
+
operand = m_inlineStackTop->remapOperand(operand);
ASSERT(operand < FirstConstantRegisterIndex);
@@ -749,6 +752,7 @@
CodeBlock* m_codeBlock;
CodeBlock* m_profiledBlock;
InlineCallFrame* m_inlineCallFrame;
+ VirtualRegister m_calleeVR; // absolute virtual register, not relative to call frame
ScriptExecutable* executable() { return m_codeBlock->ownerExecutable(); }
@@ -794,7 +798,7 @@
InlineStackEntry* m_caller;
- InlineStackEntry(ByteCodeParser*, CodeBlock*, CodeBlock* profiledBlock, BlockIndex callsiteBlockHead, VirtualRegister calleeVR, VirtualRegister returnValueVR, VirtualRegister inlineCallFrameStart, CodeSpecializationKind);
+ InlineStackEntry(ByteCodeParser*, CodeBlock*, CodeBlock* profiledBlock, BlockIndex callsiteBlockHead, VirtualRegister calleeVR, JSFunction* callee, VirtualRegister returnValueVR, VirtualRegister inlineCallFrameStart, CodeSpecializationKind);
~InlineStackEntry()
{
@@ -965,7 +969,6 @@
// FIXME: Don't flush constants!
- flush(callTarget);
for (int arg = firstArg + 1; arg <= lastArg; ++arg)
flush(arg);
@@ -983,7 +986,7 @@
m_graph.m_blocks[i]->ensureLocals(newNumLocals);
}
- InlineStackEntry inlineStackEntry(this, codeBlock.get(), profiledBlock, m_graph.m_blocks.size() - 1, (VirtualRegister)m_inlineStackTop->remapOperand(callTarget), (VirtualRegister)m_inlineStackTop->remapOperand(usesResult ? resultOperand : InvalidVirtualRegister), (VirtualRegister)inlineCallFrameStart, kind);
+ InlineStackEntry inlineStackEntry(this, codeBlock.get(), profiledBlock, m_graph.m_blocks.size() - 1, (VirtualRegister)m_inlineStackTop->remapOperand(callTarget), expectedFunction, (VirtualRegister)m_inlineStackTop->remapOperand(usesResult ? resultOperand : InvalidVirtualRegister), (VirtualRegister)inlineCallFrameStart, kind);
// This is where the actual inlining really happens.
unsigned oldIndex = m_currentIndex;
@@ -1297,7 +1300,7 @@
case op_get_callee: {
if (m_inlineStackTop->m_inlineCallFrame)
- set(currentInstruction[1].u.operand, getDirect(m_inlineStackTop->m_inlineCallFrame->calleeVR));
+ set(currentInstruction[1].u.operand, getDirect(m_inlineStackTop->m_calleeVR));
else
set(currentInstruction[1].u.operand, addToGraph(GetCallee));
NEXT_OPCODE(op_get_callee);
@@ -2281,10 +2284,11 @@
m_haveBuiltOperandMaps = true;
}
-ByteCodeParser::InlineStackEntry::InlineStackEntry(ByteCodeParser* byteCodeParser, CodeBlock* codeBlock, CodeBlock* profiledBlock, BlockIndex callsiteBlockHead, VirtualRegister calleeVR, VirtualRegister returnValueVR, VirtualRegister inlineCallFrameStart, CodeSpecializationKind kind)
+ByteCodeParser::InlineStackEntry::InlineStackEntry(ByteCodeParser* byteCodeParser, CodeBlock* codeBlock, CodeBlock* profiledBlock, BlockIndex callsiteBlockHead, VirtualRegister calleeVR, JSFunction* callee, VirtualRegister returnValueVR, VirtualRegister inlineCallFrameStart, CodeSpecializationKind kind)
: m_byteCodeParser(byteCodeParser)
, m_codeBlock(codeBlock)
, m_profiledBlock(profiledBlock)
+ , m_calleeVR(calleeVR)
, m_callsiteBlockHead(callsiteBlockHead)
, m_returnValue(returnValueVR)
, m_didReturn(false)
@@ -2294,6 +2298,7 @@
if (m_caller) {
// Inline case.
ASSERT(codeBlock != byteCodeParser->m_codeBlock);
+ ASSERT(callee);
ASSERT(calleeVR != InvalidVirtualRegister);
ASSERT(inlineCallFrameStart != InvalidVirtualRegister);
ASSERT(callsiteBlockHead != NoBlock);
@@ -2301,7 +2306,7 @@
InlineCallFrame inlineCallFrame;
inlineCallFrame.executable.set(*byteCodeParser->m_globalData, byteCodeParser->m_codeBlock->ownerExecutable(), codeBlock->ownerExecutable());
inlineCallFrame.stackOffset = inlineCallFrameStart + RegisterFile::CallFrameHeaderSize;
- inlineCallFrame.calleeVR = calleeVR;
+ inlineCallFrame.callee.set(*byteCodeParser->m_globalData, byteCodeParser->m_codeBlock->ownerExecutable(), callee);
inlineCallFrame.caller = byteCodeParser->currentCodeOrigin();
inlineCallFrame.numArgumentsIncludingThis = codeBlock->m_numParameters;
inlineCallFrame.isCall = isCall(kind);
@@ -2334,6 +2339,7 @@
} else {
// Machine code block case.
ASSERT(codeBlock == byteCodeParser->m_codeBlock);
+ ASSERT(!callee);
ASSERT(calleeVR == InvalidVirtualRegister);
ASSERT(returnValueVR == InvalidVirtualRegister);
ASSERT(inlineCallFrameStart == InvalidVirtualRegister);
@@ -2435,7 +2441,7 @@
// Set during construction.
ASSERT(!m_currentIndex);
- InlineStackEntry inlineStackEntry(this, m_codeBlock, m_profiledBlock, NoBlock, InvalidVirtualRegister, InvalidVirtualRegister, InvalidVirtualRegister, CodeForCall);
+ InlineStackEntry inlineStackEntry(this, m_codeBlock, m_profiledBlock, NoBlock, InvalidVirtualRegister, 0, InvalidVirtualRegister, InvalidVirtualRegister, CodeForCall);
parseCodeBlock();
Modified: trunk/Source/_javascript_Core/dfg/DFGJITCompiler.cpp (98830 => 98831)
--- trunk/Source/_javascript_Core/dfg/DFGJITCompiler.cpp 2011-10-30 22:42:24 UTC (rev 98830)
+++ trunk/Source/_javascript_Core/dfg/DFGJITCompiler.cpp 2011-10-30 22:47:31 UTC (rev 98831)
@@ -534,8 +534,6 @@
void* jumpTarget = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(baselineCodeBlockForCaller->getJITCode().start()) + mapping->m_machineCodeOffset);
- loadPtr(addressFor((VirtualRegister)inlineCallFrame->calleeVR), GPRInfo::regT1);
- loadPtr(MacroAssembler::Address(GPRInfo::regT1, OBJECT_OFFSETOF(JSFunction, m_scopeChain)), GPRInfo::regT2);
GPRReg callerFrameGPR;
if (inlineCallFrame->caller.inlineCallFrame) {
addPtr(Imm32(inlineCallFrame->caller.inlineCallFrame->stackOffset * sizeof(EncodedJSValue)), GPRInfo::callFrameRegister, GPRInfo::regT3);
@@ -544,11 +542,11 @@
callerFrameGPR = GPRInfo::callFrameRegister;
storePtr(TrustedImmPtr(baselineCodeBlock), addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::CodeBlock)));
- storePtr(GPRInfo::regT2, addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ScopeChain)));
+ storePtr(TrustedImmPtr(inlineCallFrame->callee->scope()), addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ScopeChain)));
storePtr(callerFrameGPR, addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::CallerFrame)));
storePtr(TrustedImmPtr(jumpTarget), addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ReturnPC)));
storePtr(TrustedImmPtr(JSValue::encode(jsNumber(inlineCallFrame->numArgumentsIncludingThis))), addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ArgumentCount)));
- storePtr(GPRInfo::regT1, addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::Callee)));
+ storePtr(TrustedImmPtr(inlineCallFrame->callee.get()), addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::Callee)));
}
if (exit.m_codeOrigin.inlineCallFrame)
Modified: trunk/Source/_javascript_Core/dfg/DFGJITCompiler32_64.cpp (98830 => 98831)
--- trunk/Source/_javascript_Core/dfg/DFGJITCompiler32_64.cpp 2011-10-30 22:42:24 UTC (rev 98830)
+++ trunk/Source/_javascript_Core/dfg/DFGJITCompiler32_64.cpp 2011-10-30 22:47:31 UTC (rev 98831)
@@ -490,8 +490,6 @@
void* jumpTarget = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(baselineCodeBlockForCaller->getJITCode().start()) + mapping->m_machineCodeOffset);
- loadPtr(payloadFor((VirtualRegister)inlineCallFrame->calleeVR), GPRInfo::regT4);
- loadPtr(MacroAssembler::Address(GPRInfo::regT4, OBJECT_OFFSETOF(JSFunction, m_scopeChain)), GPRInfo::regT2);
GPRReg callerFrameGPR;
if (inlineCallFrame->caller.inlineCallFrame) {
add32(Imm32(inlineCallFrame->caller.inlineCallFrame->stackOffset * sizeof(EncodedJSValue)), GPRInfo::callFrameRegister, GPRInfo::regT3);
@@ -501,14 +499,14 @@
storePtr(TrustedImmPtr(baselineCodeBlock), addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::CodeBlock)));
store32(Imm32(JSValue::CellTag), tagFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ScopeChain)));
- storePtr(GPRInfo::regT2, payloadFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ScopeChain)));
+ storePtr(TrustedImmPtr(inlineCallFrame->callee->scope()), payloadFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ScopeChain)));
store32(Imm32(JSValue::CellTag), tagFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::CallerFrame)));
storePtr(callerFrameGPR, payloadFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::CallerFrame)));
storePtr(TrustedImmPtr(jumpTarget), payloadFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ReturnPC)));
store32(Imm32(JSValue::Int32Tag), tagFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ArgumentCount)));
store32(Imm32(inlineCallFrame->numArgumentsIncludingThis), payloadFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ArgumentCount)));
store32(Imm32(JSValue::CellTag), tagFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::Callee)));
- storePtr(GPRInfo::regT4, payloadFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::Callee)));
+ storePtr(TrustedImmPtr(inlineCallFrame->callee.get()), payloadFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::Callee)));
}
if (exit.m_codeOrigin.inlineCallFrame)