Index: src/data-flow.cc |
diff --git a/src/data-flow.cc b/src/data-flow.cc |
index 6b45da02b93040d7e64d616f86f285be7b8c7d00..7460b15e48cb432e8878c016d637c7ca8bf8377d 100644 |
--- a/src/data-flow.cc |
+++ b/src/data-flow.cc |
@@ -239,20 +239,17 @@ void FlowGraphBuilder::VisitBreakStatement(BreakStatement* stmt) { |
void FlowGraphBuilder::VisitReturnStatement(ReturnStatement* stmt) { |
- Visit(stmt->expression()); |
- graph_.AppendInstruction(stmt); |
- graph_.AppendNode(global_exit()); |
+ SetStackOverflow(); |
} |
void FlowGraphBuilder::VisitWithEnterStatement(WithEnterStatement* stmt) { |
- Visit(stmt->expression()); |
- graph_.AppendInstruction(stmt); |
+ SetStackOverflow(); |
} |
void FlowGraphBuilder::VisitWithExitStatement(WithExitStatement* stmt) { |
- graph_.AppendInstruction(stmt); |
+ SetStackOverflow(); |
} |
@@ -262,44 +259,12 @@ void FlowGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) { |
void FlowGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { |
- JoinNode* join = new JoinNode(); |
- FlowGraph original = graph_; |
- graph_ = FlowGraph::Empty(); |
- Visit(stmt->body()); |
- |
- FlowGraph body = graph_; |
- graph_ = FlowGraph::Empty(); |
- Visit(stmt->cond()); |
- |
- BranchNode* branch = new BranchNode(); |
- |
- // Add body, condition and branch. |
- original.AppendNode(join); |
- original.AppendGraph(&body); |
- original.AppendGraph(&graph_); // The condition. |
- original.AppendNode(branch); |
- |
- // Tie the knot. |
- branch->AddSuccessor(join); |
- join->AddPredecessor(branch); |
- |
- graph_ = original; |
+ SetStackOverflow(); |
} |
void FlowGraphBuilder::VisitWhileStatement(WhileStatement* stmt) { |
- JoinNode* join = new JoinNode(); |
- FlowGraph original = graph_; |
- graph_ = FlowGraph::Empty(); |
- Visit(stmt->cond()); |
- |
- BranchNode* branch = new BranchNode(); |
- FlowGraph condition = graph_; |
- graph_ = FlowGraph::Empty(); |
- Visit(stmt->body()); |
- |
- original.Loop(join, &condition, branch, &graph_); |
- graph_ = original; |
+ SetStackOverflow(); |
} |
@@ -324,17 +289,7 @@ void FlowGraphBuilder::VisitForStatement(ForStatement* stmt) { |
void FlowGraphBuilder::VisitForInStatement(ForInStatement* stmt) { |
- Visit(stmt->enumerable()); |
- |
- JoinNode* join = new JoinNode(); |
- FlowGraph empty; |
- BranchNode* branch = new BranchNode(); |
- FlowGraph original = graph_; |
- graph_ = FlowGraph::Empty(); |
- Visit(stmt->body()); |
- |
- original.Loop(join, &empty, branch, &graph_); |
- graph_ = original; |
+ SetStackOverflow(); |
} |
@@ -349,36 +304,23 @@ void FlowGraphBuilder::VisitTryFinallyStatement(TryFinallyStatement* stmt) { |
void FlowGraphBuilder::VisitDebuggerStatement(DebuggerStatement* stmt) { |
- graph_.AppendInstruction(stmt); |
+ SetStackOverflow(); |
} |
void FlowGraphBuilder::VisitFunctionLiteral(FunctionLiteral* expr) { |
- graph_.AppendInstruction(expr); |
+ SetStackOverflow(); |
} |
void FlowGraphBuilder::VisitFunctionBoilerplateLiteral( |
FunctionBoilerplateLiteral* expr) { |
- graph_.AppendInstruction(expr); |
+ SetStackOverflow(); |
} |
void FlowGraphBuilder::VisitConditional(Conditional* expr) { |
- Visit(expr->condition()); |
- |
- BranchNode* branch = new BranchNode(); |
- FlowGraph original = graph_; |
- graph_ = FlowGraph::Empty(); |
- Visit(expr->then_expression()); |
- |
- FlowGraph left = graph_; |
- graph_ = FlowGraph::Empty(); |
- Visit(expr->else_expression()); |
- |
- JoinNode* join = new JoinNode(); |
- original.Split(branch, &left, &graph_, join); |
- graph_ = original; |
+ SetStackOverflow(); |
} |
@@ -398,30 +340,22 @@ void FlowGraphBuilder::VisitLiteral(Literal* expr) { |
void FlowGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { |
- graph_.AppendInstruction(expr); |
+ SetStackOverflow(); |
} |
void FlowGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
- ZoneList<ObjectLiteral::Property*>* properties = expr->properties(); |
- for (int i = 0, len = properties->length(); i < len; i++) { |
- Visit(properties->at(i)->value()); |
- } |
- graph_.AppendInstruction(expr); |
+ SetStackOverflow(); |
} |
void FlowGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
- ZoneList<Expression*>* values = expr->values(); |
- for (int i = 0, len = values->length(); i < len; i++) { |
- Visit(values->at(i)); |
- } |
- graph_.AppendInstruction(expr); |
+ SetStackOverflow(); |
} |
void FlowGraphBuilder::VisitCatchExtensionObject(CatchExtensionObject* expr) { |
- graph_.AppendInstruction(expr); |
+ SetStackOverflow(); |
} |
@@ -445,8 +379,7 @@ void FlowGraphBuilder::VisitAssignment(Assignment* expr) { |
void FlowGraphBuilder::VisitThrow(Throw* expr) { |
- Visit(expr->exception()); |
- graph_.AppendInstruction(expr); |
+ SetStackOverflow(); |
} |
@@ -468,27 +401,34 @@ void FlowGraphBuilder::VisitCall(Call* expr) { |
void FlowGraphBuilder::VisitCallNew(CallNew* expr) { |
- Visit(expr->expression()); |
- ZoneList<Expression*>* arguments = expr->arguments(); |
- for (int i = 0, len = arguments->length(); i < len; i++) { |
- Visit(arguments->at(i)); |
- } |
- graph_.AppendInstruction(expr); |
+ SetStackOverflow(); |
} |
void FlowGraphBuilder::VisitCallRuntime(CallRuntime* expr) { |
- ZoneList<Expression*>* arguments = expr->arguments(); |
- for (int i = 0, len = arguments->length(); i < len; i++) { |
- Visit(arguments->at(i)); |
- } |
- graph_.AppendInstruction(expr); |
+ SetStackOverflow(); |
} |
void FlowGraphBuilder::VisitUnaryOperation(UnaryOperation* expr) { |
- Visit(expr->expression()); |
- graph_.AppendInstruction(expr); |
+ switch (expr->op()) { |
+ case Token::NOT: |
+ case Token::BIT_NOT: |
+ case Token::DELETE: |
+ case Token::TYPEOF: |
+ case Token::VOID: |
+ SetStackOverflow(); |
+ break; |
+ |
+ case Token::ADD: |
+ case Token::SUB: |
+ Visit(expr->expression()); |
+ graph_.AppendInstruction(expr); |
+ break; |
+ |
+ default: |
+ UNREACHABLE(); |
+ } |
} |
@@ -503,48 +443,26 @@ void FlowGraphBuilder::VisitCountOperation(CountOperation* expr) { |
void FlowGraphBuilder::VisitBinaryOperation(BinaryOperation* expr) { |
- Visit(expr->left()); |
switch (expr->op()) { |
case Token::COMMA: |
- Visit(expr->right()); |
+ case Token::OR: |
+ case Token::AND: |
+ SetStackOverflow(); |
break; |
- case Token::OR: { |
- BranchNode* branch = new BranchNode(); |
- FlowGraph original = graph_; |
- graph_ = FlowGraph::Empty(); |
- Visit(expr->right()); |
- FlowGraph empty; |
- JoinNode* join = new JoinNode(); |
- original.Split(branch, &empty, &graph_, join); |
- graph_ = original; |
- break; |
- } |
- |
- case Token::AND: { |
- BranchNode* branch = new BranchNode(); |
- FlowGraph original = graph_; |
- graph_ = FlowGraph::Empty(); |
- Visit(expr->right()); |
- FlowGraph empty; |
- JoinNode* join = new JoinNode(); |
- original.Split(branch, &graph_, &empty, join); |
- graph_ = original; |
- break; |
- } |
- |
case Token::BIT_OR: |
case Token::BIT_XOR: |
case Token::BIT_AND: |
case Token::SHL: |
- case Token::SAR: |
case Token::SHR: |
case Token::ADD: |
case Token::SUB: |
case Token::MUL: |
case Token::DIV: |
case Token::MOD: |
+ case Token::SAR: |
+ Visit(expr->left()); |
Visit(expr->right()); |
graph_.AppendInstruction(expr); |
break; |
@@ -556,14 +474,33 @@ void FlowGraphBuilder::VisitBinaryOperation(BinaryOperation* expr) { |
void FlowGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
- Visit(expr->left()); |
- Visit(expr->right()); |
- graph_.AppendInstruction(expr); |
+ switch (expr->op()) { |
+ case Token::EQ: |
+ case Token::NE: |
+ case Token::EQ_STRICT: |
+ case Token::NE_STRICT: |
+ case Token::INSTANCEOF: |
+ case Token::IN: |
+ SetStackOverflow(); |
+ break; |
+ |
+ case Token::LT: |
+ case Token::GT: |
+ case Token::LTE: |
+ case Token::GTE: |
+ Visit(expr->left()); |
+ Visit(expr->right()); |
+ graph_.AppendInstruction(expr); |
+ break; |
+ |
+ default: |
+ UNREACHABLE(); |
+ } |
} |
void FlowGraphBuilder::VisitThisFunction(ThisFunction* expr) { |
- graph_.AppendInstruction(expr); |
+ SetStackOverflow(); |
} |