Changeset 147234 in webkit for trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
- Timestamp:
- Mar 29, 2013, 12:12:18 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r147184 r147234 74 74 because the assignment node, "x =", passes r[x] as dst to the number node, "1". 75 75 */ 76 77 void ExpressionNode::emitBytecodeInConditionContext(BytecodeGenerator& generator, Label* trueTarget, Label* falseTarget, FallThroughMode fallThroughMode) 78 { 79 RegisterID* result = generator.emitNode(this); 80 if (fallThroughMode == FallThroughMeansTrue) 81 generator.emitJumpIfFalse(result, falseTarget); 82 else 83 generator.emitJumpIfTrue(result, trueTarget); 84 } 76 85 77 86 // ------------------------------ ThrowableExpressionData -------------------------------- … … 922 931 // ------------------------------ LogicalNotNode ----------------------------------- 923 932 924 void LogicalNotNode::emitBytecodeInConditionContext(BytecodeGenerator& generator, Label* trueTarget, Label* falseTarget, bool fallThroughMeansTrue) 925 { 926 ASSERT(expr()->hasConditionContextCodegen()); 927 933 void LogicalNotNode::emitBytecodeInConditionContext(BytecodeGenerator& generator, Label* trueTarget, Label* falseTarget, FallThroughMode fallThroughMode) 934 { 928 935 // reverse the true and false targets 929 generator.emitNodeInConditionContext(expr(), falseTarget, trueTarget, !fallThroughMeansTrue);936 generator.emitNodeInConditionContext(expr(), falseTarget, trueTarget, invert(fallThroughMode)); 930 937 } 931 938 … … 1165 1172 } 1166 1173 1167 void LogicalOpNode::emitBytecodeInConditionContext(BytecodeGenerator& generator, Label* trueTarget, Label* falseTarget, bool fallThroughMeansTrue) 1168 { 1169 if (m_expr1->hasConditionContextCodegen()) { 1170 RefPtr<Label> afterExpr1 = generator.newLabel(); 1171 if (m_operator == OpLogicalAnd) 1172 generator.emitNodeInConditionContext(m_expr1, afterExpr1.get(), falseTarget, true); 1173 else 1174 generator.emitNodeInConditionContext(m_expr1, trueTarget, afterExpr1.get(), false); 1175 generator.emitLabel(afterExpr1.get()); 1176 } else { 1177 RegisterID* temp = generator.emitNode(m_expr1); 1178 if (m_operator == OpLogicalAnd) 1179 generator.emitJumpIfFalse(temp, falseTarget); 1180 else 1181 generator.emitJumpIfTrue(temp, trueTarget); 1182 } 1183 1184 if (m_expr2->hasConditionContextCodegen()) 1185 generator.emitNodeInConditionContext(m_expr2, trueTarget, falseTarget, fallThroughMeansTrue); 1186 else { 1187 RegisterID* temp = generator.emitNode(m_expr2); 1188 if (fallThroughMeansTrue) 1189 generator.emitJumpIfFalse(temp, falseTarget); 1190 else 1191 generator.emitJumpIfTrue(temp, trueTarget); 1192 } 1174 void LogicalOpNode::emitBytecodeInConditionContext(BytecodeGenerator& generator, Label* trueTarget, Label* falseTarget, FallThroughMode fallThroughMode) 1175 { 1176 RefPtr<Label> afterExpr1 = generator.newLabel(); 1177 if (m_operator == OpLogicalAnd) 1178 generator.emitNodeInConditionContext(m_expr1, afterExpr1.get(), falseTarget, FallThroughMeansTrue); 1179 else 1180 generator.emitNodeInConditionContext(m_expr1, trueTarget, afterExpr1.get(), FallThroughMeansFalse); 1181 generator.emitLabel(afterExpr1.get()); 1182 1183 generator.emitNodeInConditionContext(m_expr2, trueTarget, falseTarget, fallThroughMode); 1193 1184 } 1194 1185 … … 1201 1192 RefPtr<Label> afterElse = generator.newLabel(); 1202 1193 1203 if (m_logical->hasConditionContextCodegen()) { 1204 RefPtr<Label> beforeThen = generator.newLabel(); 1205 generator.emitNodeInConditionContext(m_logical, beforeThen.get(), beforeElse.get(), true); 1206 generator.emitLabel(beforeThen.get()); 1207 } else { 1208 RegisterID* cond = generator.emitNode(m_logical); 1209 generator.emitJumpIfFalse(cond, beforeElse.get()); 1210 } 1194 RefPtr<Label> beforeThen = generator.newLabel(); 1195 generator.emitNodeInConditionContext(m_logical, beforeThen.get(), beforeElse.get(), FallThroughMeansTrue); 1196 generator.emitLabel(beforeThen.get()); 1211 1197 1212 1198 generator.emitNode(newDst.get(), m_expr1); … … 1544 1530 RefPtr<Label> afterThen = generator.newLabel(); 1545 1531 1546 if (m_condition->hasConditionContextCodegen()) { 1547 RefPtr<Label> beforeThen = generator.newLabel(); 1548 generator.emitNodeInConditionContext(m_condition, beforeThen.get(), afterThen.get(), true); 1549 generator.emitLabel(beforeThen.get()); 1550 } else { 1551 RegisterID* cond = generator.emitNode(m_condition); 1552 generator.emitJumpIfFalse(cond, afterThen.get()); 1553 } 1532 RefPtr<Label> beforeThen = generator.newLabel(); 1533 generator.emitNodeInConditionContext(m_condition, beforeThen.get(), afterThen.get(), FallThroughMeansTrue); 1534 generator.emitLabel(beforeThen.get()); 1554 1535 1555 1536 generator.emitNode(dst, m_ifBlock); … … 1569 1550 RefPtr<Label> afterElse = generator.newLabel(); 1570 1551 1571 if (m_condition->hasConditionContextCodegen()) { 1572 RefPtr<Label> beforeThen = generator.newLabel(); 1573 generator.emitNodeInConditionContext(m_condition, beforeThen.get(), beforeElse.get(), true); 1574 generator.emitLabel(beforeThen.get()); 1575 } else { 1576 RegisterID* cond = generator.emitNode(m_condition); 1577 generator.emitJumpIfFalse(cond, beforeElse.get()); 1578 } 1552 RefPtr<Label> beforeThen = generator.newLabel(); 1553 generator.emitNodeInConditionContext(m_condition, beforeThen.get(), beforeElse.get(), FallThroughMeansTrue); 1554 generator.emitLabel(beforeThen.get()); 1579 1555 1580 1556 generator.emitNode(dst, m_ifBlock); … … 1606 1582 generator.emitLabel(scope->continueTarget()); 1607 1583 generator.emitDebugHook(WillExecuteStatement, lastLine(), lastLine(), charPosition()); 1608 if (m_expr->hasConditionContextCodegen()) 1609 generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), false); 1610 else { 1611 RegisterID* cond = generator.emitNode(m_expr); 1612 generator.emitJumpIfTrue(cond, topOfLoop.get()); 1613 } 1584 generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), FallThroughMeansFalse); 1614 1585 1615 1586 generator.emitLabel(scope->breakTarget()); … … 1625 1596 1626 1597 generator.emitDebugHook(WillExecuteStatement, m_expr->lineNo(), m_expr->lineNo(), m_expr->charPosition()); 1627 if (m_expr->hasConditionContextCodegen()) 1628 generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), true); 1629 else { 1630 RegisterID* cond = generator.emitNode(m_expr); 1631 generator.emitJumpIfFalse(cond, scope->breakTarget()); 1632 } 1598 generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), FallThroughMeansTrue); 1633 1599 1634 1600 generator.emitLabel(topOfLoop.get()); … … 1640 1606 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), charPosition()); 1641 1607 1642 if (m_expr->hasConditionContextCodegen()) 1643 generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), false); 1644 else { 1645 RegisterID* cond = generator.emitNode(m_expr); 1646 generator.emitJumpIfTrue(cond, topOfLoop.get()); 1647 } 1608 generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), FallThroughMeansFalse); 1648 1609 1649 1610 generator.emitLabel(scope->breakTarget()); … … 1665 1626 1666 1627 RefPtr<Label> topOfLoop = generator.newLabel(); 1667 if (m_expr2) { 1668 if (m_expr2->hasConditionContextCodegen()) 1669 generator.emitNodeInConditionContext(m_expr2, topOfLoop.get(), scope->breakTarget(), true); 1670 else { 1671 RegisterID* cond = generator.emitNode(m_expr2); 1672 generator.emitJumpIfFalse(cond, scope->breakTarget()); 1673 } 1674 } 1628 if (m_expr2) 1629 generator.emitNodeInConditionContext(m_expr2, topOfLoop.get(), scope->breakTarget(), FallThroughMeansTrue); 1675 1630 1676 1631 generator.emitLabel(topOfLoop.get()); … … 1684 1639 generator.emitNode(generator.ignoredResult(), m_expr3); 1685 1640 1686 if (m_expr2) { 1687 if (m_expr2->hasConditionContextCodegen()) 1688 generator.emitNodeInConditionContext(m_expr2, topOfLoop.get(), scope->breakTarget(), false); 1689 else { 1690 RegisterID* cond = generator.emitNode(m_expr2); 1691 generator.emitJumpIfTrue(cond, topOfLoop.get()); 1692 } 1693 } else 1641 if (m_expr2) 1642 generator.emitNodeInConditionContext(m_expr2, topOfLoop.get(), scope->breakTarget(), FallThroughMeansFalse); 1643 else 1694 1644 generator.emitJump(topOfLoop.get()); 1695 1645
Note:
See TracChangeset
for help on using the changeset viewer.