diff options
author | Konstantin Tokarev <annulen@yandex.ru> | 2017-06-01 15:54:01 +0300 |
---|---|---|
committer | Konstantin Tokarev <annulen@yandex.ru> | 2017-06-02 14:07:43 +0000 |
commit | 0a3506ebe5d7f431f0dd4dffa24ac32063b90ff1 (patch) | |
tree | f3d0b92fe7bc5b31426a838c354616fff335e82b /Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp | |
parent | 881da28418d380042aa95a97f0cbd42560a64f7c (diff) | |
download | qtwebkit-0a3506ebe5d7f431f0dd4dffa24ac32063b90ff1.tar.gz |
Import WebKit commit 3ca7a25a550e473d60bbbe321475c6c0ef114b31
Change-Id: I480668a0cb8114dccf7a1195190a993282875759
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp')
-rw-r--r-- | Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp b/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp index 6aefe61e3..8e93a7e95 100644 --- a/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp +++ b/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp @@ -562,9 +562,15 @@ private: { flushDirect(operand, findArgumentPosition(operand)); } - + void flushDirect(VirtualRegister operand, ArgumentPosition* argumentPosition) { + addFlushOrPhantomLocal<Flush>(operand, argumentPosition); + } + + template<NodeType nodeType> + void addFlushOrPhantomLocal(VirtualRegister operand, ArgumentPosition* argumentPosition) + { ASSERT(!operand.isConstant()); Node* node = m_currentBlock->variablesAtTail.operand(operand); @@ -576,12 +582,17 @@ private: else variable = newVariableAccessData(operand); - node = addToGraph(Flush, OpInfo(variable)); + node = addToGraph(nodeType, OpInfo(variable)); m_currentBlock->variablesAtTail.operand(operand) = node; if (argumentPosition) argumentPosition->addVariable(variable); } - + + void phantomLocalDirect(VirtualRegister operand) + { + addFlushOrPhantomLocal<PhantomLocal>(operand, findArgumentPosition(operand)); + } + void flush(InlineStackEntry* inlineStackEntry) { int numArguments; @@ -602,8 +613,32 @@ private: void flushForTerminal() { - for (InlineStackEntry* inlineStackEntry = m_inlineStackTop; inlineStackEntry; inlineStackEntry = inlineStackEntry->m_caller) + CodeOrigin origin = currentCodeOrigin(); + unsigned bytecodeIndex = origin.bytecodeIndex; + + for (InlineStackEntry* inlineStackEntry = m_inlineStackTop; inlineStackEntry; inlineStackEntry = inlineStackEntry->m_caller) { flush(inlineStackEntry); + + ASSERT(origin.inlineCallFrame == inlineStackEntry->m_inlineCallFrame); + InlineCallFrame* inlineCallFrame = inlineStackEntry->m_inlineCallFrame; + CodeBlock* codeBlock = m_graph.baselineCodeBlockFor(inlineCallFrame); + FullBytecodeLiveness& fullLiveness = m_graph.livenessFor(codeBlock); + const FastBitVector& livenessAtBytecode = fullLiveness.getLiveness(bytecodeIndex); + + for (unsigned local = codeBlock->m_numCalleeLocals; local--;) { + if (livenessAtBytecode.get(local)) { + VirtualRegister reg = virtualRegisterForLocal(local); + if (inlineCallFrame) + reg = inlineStackEntry->remapOperand(reg); + phantomLocalDirect(reg); + } + } + + if (inlineCallFrame) { + bytecodeIndex = inlineCallFrame->directCaller.bytecodeIndex; + origin = inlineCallFrame->directCaller; + } + } } void flushForReturn() |