Changeset 51735 in webkit for trunk/JavaScriptCore/parser
- Timestamp:
- Dec 6, 2009, 1:42:03 AM (15 years ago)
- Location:
- trunk/JavaScriptCore/parser
- Files:
-
- 2 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()); -
trunk/JavaScriptCore/parser/Nodes.h
r47775 r51735 41 41 class BytecodeGenerator; 42 42 class FunctionBodyNode; 43 class Label; 43 44 class PropertyListNode; 44 45 class ReadModifyResolveNode; … … 152 153 virtual bool isSimpleArray() const { return false; } 153 154 virtual bool isAdd() const { return false; } 155 virtual bool hasConditionContextCodegen() const { return false; } 156 157 virtual void emitBytecodeInConditionContext(BytecodeGenerator&, Label*, Label*, bool) { ASSERT_NOT_REACHED(); } 154 158 155 159 virtual ExpressionNode* stripUnaryPlus() { return this; } … … 758 762 protected: 759 763 ExpressionNode* expr() { return m_expr; } 764 const ExpressionNode* expr() const { return m_expr; } 760 765 761 766 private: … … 789 794 public: 790 795 LogicalNotNode(JSGlobalData*, ExpressionNode*); 796 private: 797 void emitBytecodeInConditionContext(BytecodeGenerator&, Label* trueTarget, Label* falseTarget, bool fallThroughMeansTrue); 798 virtual bool hasConditionContextCodegen() const { return expr()->hasConditionContextCodegen(); } 791 799 }; 792 800 … … 953 961 private: 954 962 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 963 void emitBytecodeInConditionContext(BytecodeGenerator&, Label* trueTarget, Label* falseTarget, bool fallThroughMeansTrue); 964 virtual bool hasConditionContextCodegen() const { return true; } 955 965 956 966 ExpressionNode* m_expr1;
Note:
See TracChangeset
for help on using the changeset viewer.