| 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();
|
| }
|
|
|
|
|
|
|