summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp')
-rw-r--r--Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp60
1 files changed, 24 insertions, 36 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp b/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
index 9b879b9e3..c5ffb1fc6 100644
--- a/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
+++ b/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
@@ -247,6 +247,17 @@ private:
setDirect(m_inlineStackTop->remapOperand(operand), value, setMode);
}
+ void setPair(int operand1, NodeIndex value1, int operand2, NodeIndex value2)
+ {
+ // First emit dead SetLocals for the benefit of OSR.
+ set(operand1, value1);
+ set(operand2, value2);
+
+ // Now emit the real SetLocals.
+ set(operand1, value1);
+ set(operand2, value2);
+ }
+
NodeIndex injectLazyOperandSpeculation(NodeIndex nodeIndex)
{
Node& node = m_graph[nodeIndex];
@@ -256,8 +267,7 @@ private:
m_inlineStackTop->m_lazyOperands.prediction(
LazyOperandValueProfileKey(m_currentIndex, node.local()));
#if DFG_ENABLE(DEBUG_VERBOSE)
- dataLogF("Lazy operand [@%u, bc#%u, r%d] prediction: %s\n",
- nodeIndex, m_currentIndex, node.local(), speculationToString(prediction));
+ dataLog("Lazy operand [@", nodeIndex, ", bc#", m_currentIndex, ", r", node.local(), "] prediction: ", SpeculationDump(prediction), "\n");
#endif
node.variableAccessData()->predict(prediction);
return nodeIndex;
@@ -876,7 +886,7 @@ private:
SpeculatedType prediction = m_inlineStackTop->m_profiledBlock->valueProfilePredictionForBytecodeOffset(bytecodeIndex);
#if DFG_ENABLE(DEBUG_VERBOSE)
- dataLogF("Dynamic [@%u, bc#%u] prediction: %s\n", nodeIndex, bytecodeIndex, speculationToString(prediction));
+ dataLog("Dynamic [@", nodeIndex, ", bc#", bytecodeIndex, "] prediction: ", SpeculationDump(prediction), "\n");
#endif
return prediction;
@@ -2299,8 +2309,7 @@ bool ByteCodeParser::parseBlock(unsigned limit)
unsigned srcDst = currentInstruction[2].u.operand;
ASSERT(result != srcDst); // Required for assumptions we make during OSR.
NodeIndex op = get(srcDst);
- set(result, op);
- set(srcDst, makeSafe(addToGraph(ArithAdd, op, one())));
+ setPair(result, op, srcDst, makeSafe(addToGraph(ArithAdd, op, one())));
NEXT_OPCODE(op_post_inc);
}
@@ -2315,8 +2324,7 @@ bool ByteCodeParser::parseBlock(unsigned limit)
unsigned result = currentInstruction[1].u.operand;
unsigned srcDst = currentInstruction[2].u.operand;
NodeIndex op = get(srcDst);
- set(result, op);
- set(srcDst, makeSafe(addToGraph(ArithSub, op, one())));
+ setPair(result, op, srcDst, makeSafe(addToGraph(ArithSub, op, one())));
NEXT_OPCODE(op_post_dec);
}
@@ -3115,21 +3123,11 @@ bool ByteCodeParser::parseBlock(unsigned limit)
NodeIndex base = 0;
NodeIndex value = 0;
- if (parseResolveOperations(prediction, identifier, operations, putToBaseOperation, &base, &value)) {
- // First create OSR hints only.
- set(baseDst, base);
- set(valueDst, value);
-
- // If we try to hoist structure checks into here, then we're guaranteed that they will occur
- // *after* we have already set up the values for OSR.
-
- // Then do the real SetLocals.
- set(baseDst, base);
- set(valueDst, value);
- } else {
+ if (parseResolveOperations(prediction, identifier, operations, putToBaseOperation, &base, &value))
+ setPair(baseDst, base, valueDst, value);
+ else {
addToGraph(ForceOSRExit);
- set(baseDst, addToGraph(GarbageValue));
- set(valueDst, addToGraph(GarbageValue));
+ setPair(baseDst, addToGraph(GarbageValue), valueDst, addToGraph(GarbageValue));
}
NEXT_OPCODE(op_resolve_with_base);
@@ -3143,21 +3141,11 @@ bool ByteCodeParser::parseBlock(unsigned limit)
NodeIndex base = 0;
NodeIndex value = 0;
- if (parseResolveOperations(prediction, identifier, operations, 0, &base, &value)) {
- // First create OSR hints only.
- set(baseDst, base);
- set(valueDst, value);
-
- // If we try to hoist structure checks into here, then we're guaranteed that they will occur
- // *after* we have already set up the values for OSR.
-
- // Then do the real SetLocals.
- set(baseDst, base);
- set(valueDst, value);
- } else {
+ if (parseResolveOperations(prediction, identifier, operations, 0, &base, &value))
+ setPair(baseDst, base, valueDst, value);
+ else {
addToGraph(ForceOSRExit);
- set(baseDst, addToGraph(GarbageValue));
- set(valueDst, addToGraph(GarbageValue));
+ setPair(baseDst, addToGraph(GarbageValue), valueDst, addToGraph(GarbageValue));
}
NEXT_OPCODE(op_resolve_with_this);
@@ -3664,7 +3652,7 @@ void ByteCodeParser::parseCodeBlock()
codeBlock->needsFullScopeChain()?"true":"false",
codeBlock->ownerExecutable()->needsActivation()?"true":"false",
codeBlock->ownerExecutable()->isStrictMode()?"true":"false");
- codeBlock->baselineVersion()->dump(m_exec);
+ codeBlock->baselineVersion()->dump();
#endif
for (unsigned jumpTargetIndex = 0; jumpTargetIndex <= codeBlock->numberOfJumpTargets(); ++jumpTargetIndex) {