Changeset 51735 in webkit for trunk/JavaScriptCore/parser/Nodes.cpp
- Timestamp:
- Dec 6, 2009, 1:42:03 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/parser/Nodes.cpp
r50916 r51735 812 812 } 813 813 814 815 // ------------------------------ LogicalNotNode ----------------------------------- 816 817 void LogicalNotNode::emitBytecodeInConditionContext(BytecodeGenerator& generator, Label* trueTarget, Label* falseTarget, bool fallThroughMeansTrue) 818 { 819 ASSERT(expr()->hasConditionContextCodegen()); 820 821 // reverse the true and false targets 822 generator.emitNodeInConditionContext(expr(), falseTarget, trueTarget, !fallThroughMeansTrue); 823 } 824 825 814 826 // ------------------------------ Binary Operation Nodes ----------------------------------- 815 827 … … 1018 1030 } 1019 1031 1032 void LogicalOpNode::emitBytecodeInConditionContext(BytecodeGenerator& generator, Label* trueTarget, Label* falseTarget, bool fallThroughMeansTrue) 1033 { 1034 if (m_expr1->hasConditionContextCodegen()) { 1035 RefPtr<Label> afterExpr1 = generator.newLabel(); 1036 if (m_operator == OpLogicalAnd) 1037 generator.emitNodeInConditionContext(m_expr1, afterExpr1.get(), falseTarget, true); 1038 else 1039 generator.emitNodeInConditionContext(m_expr1, trueTarget, afterExpr1.get(), false); 1040 generator.emitLabel(afterExpr1.get()); 1041 } else { 1042 RegisterID* temp = generator.emitNode(m_expr1); 1043 if (m_operator == OpLogicalAnd) 1044 generator.emitJumpIfFalse(temp, falseTarget); 1045 else 1046 generator.emitJumpIfTrue(temp, trueTarget); 1047 } 1048 1049 if (m_expr2->hasConditionContextCodegen()) 1050 generator.emitNodeInConditionContext(m_expr2, trueTarget, falseTarget, fallThroughMeansTrue); 1051 else { 1052 RegisterID* temp = generator.emitNode(m_expr2); 1053 if (fallThroughMeansTrue) 1054 generator.emitJumpIfFalse(temp, falseTarget); 1055 else 1056 generator.emitJumpIfTrue(temp, trueTarget); 1057 } 1058 } 1059 1020 1060 // ------------------------------ ConditionalNode ------------------------------ 1021 1061 … … 1026 1066 RefPtr<Label> afterElse = generator.newLabel(); 1027 1067 1028 RegisterID* cond = generator.emitNode(m_logical); 1029 generator.emitJumpIfFalse(cond, beforeElse.get()); 1068 if (m_logical->hasConditionContextCodegen()) { 1069 RefPtr<Label> beforeThen = generator.newLabel(); 1070 generator.emitNodeInConditionContext(m_logical, beforeThen.get(), beforeElse.get(), true); 1071 generator.emitLabel(beforeThen.get()); 1072 } else { 1073 RegisterID* cond = generator.emitNode(m_logical); 1074 generator.emitJumpIfFalse(cond, beforeElse.get()); 1075 } 1030 1076 1031 1077 generator.emitNode(newDst.get(), m_expr1); … … 1344 1390 RefPtr<Label> afterThen = generator.newLabel(); 1345 1391 1346 RegisterID* cond = generator.emitNode(m_condition); 1347 generator.emitJumpIfFalse(cond, afterThen.get()); 1392 if (m_condition->hasConditionContextCodegen()) { 1393 RefPtr<Label> beforeThen = generator.newLabel(); 1394 generator.emitNodeInConditionContext(m_condition, beforeThen.get(), afterThen.get(), true); 1395 generator.emitLabel(beforeThen.get()); 1396 } else { 1397 RegisterID* cond = generator.emitNode(m_condition); 1398 generator.emitJumpIfFalse(cond, afterThen.get()); 1399 } 1348 1400 1349 1401 generator.emitNode(dst, m_ifBlock); … … 1363 1415 RefPtr<Label> afterElse = generator.newLabel(); 1364 1416 1365 RegisterID* cond = generator.emitNode(m_condition); 1366 generator.emitJumpIfFalse(cond, beforeElse.get()); 1417 if (m_condition->hasConditionContextCodegen()) { 1418 RefPtr<Label> beforeThen = generator.newLabel(); 1419 generator.emitNodeInConditionContext(m_condition, beforeThen.get(), beforeElse.get(), true); 1420 generator.emitLabel(beforeThen.get()); 1421 } else { 1422 RegisterID* cond = generator.emitNode(m_condition); 1423 generator.emitJumpIfFalse(cond, beforeElse.get()); 1424 } 1367 1425 1368 1426 generator.emitNode(dst, m_ifBlock); … … 1394 1452 generator.emitLabel(scope->continueTarget()); 1395 1453 generator.emitDebugHook(WillExecuteStatement, m_expr->lineNo(), m_expr->lineNo()); 1396 RegisterID* cond = generator.emitNode(m_expr); 1397 generator.emitJumpIfTrue(cond, topOfLoop.get()); 1454 if (m_expr->hasConditionContextCodegen()) 1455 generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), false); 1456 else { 1457 RegisterID* cond = generator.emitNode(m_expr); 1458 generator.emitJumpIfTrue(cond, topOfLoop.get()); 1459 } 1398 1460 1399 1461 generator.emitLabel(scope->breakTarget()); … … 1416 1478 generator.emitLabel(scope->continueTarget()); 1417 1479 generator.emitDebugHook(WillExecuteStatement, m_expr->lineNo(), m_expr->lineNo()); 1418 RegisterID* cond = generator.emitNode(m_expr); 1419 generator.emitJumpIfTrue(cond, topOfLoop.get()); 1480 1481 if (m_expr->hasConditionContextCodegen()) 1482 generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), false); 1483 else { 1484 RegisterID* cond = generator.emitNode(m_expr); 1485 generator.emitJumpIfTrue(cond, topOfLoop.get()); 1486 } 1420 1487 1421 1488 generator.emitLabel(scope->breakTarget()); … … 1451 1518 generator.emitLabel(condition.get()); 1452 1519 if (m_expr2) { 1453 RegisterID* cond = generator.emitNode(m_expr2); 1454 generator.emitJumpIfTrue(cond, topOfLoop.get()); 1520 if (m_expr2->hasConditionContextCodegen()) 1521 generator.emitNodeInConditionContext(m_expr2, topOfLoop.get(), scope->breakTarget(), false); 1522 else { 1523 RegisterID* cond = generator.emitNode(m_expr2); 1524 generator.emitJumpIfTrue(cond, topOfLoop.get()); 1525 } 1455 1526 } else 1456 1527 generator.emitJump(topOfLoop.get());
Note:
See TracChangeset
for help on using the changeset viewer.