| Index: src/data-flow.cc
|
| ===================================================================
|
| --- src/data-flow.cc (revision 5322)
|
| +++ src/data-flow.cc (working copy)
|
| @@ -50,258 +50,13 @@
|
| #endif
|
|
|
|
|
| -void AstLabeler::Label(CompilationInfo* info) {
|
| - info_ = info;
|
| - VisitStatements(info_->function()->body());
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitStatements(ZoneList<Statement*>* stmts) {
|
| - for (int i = 0, len = stmts->length(); i < len; i++) {
|
| - Visit(stmts->at(i));
|
| - }
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitDeclarations(ZoneList<Declaration*>* decls) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitBlock(Block* stmt) {
|
| - VisitStatements(stmt->statements());
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitExpressionStatement(
|
| - ExpressionStatement* stmt) {
|
| - Visit(stmt->expression());
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitEmptyStatement(EmptyStatement* stmt) {
|
| - // Do nothing.
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitIfStatement(IfStatement* stmt) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitContinueStatement(ContinueStatement* stmt) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitBreakStatement(BreakStatement* stmt) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitReturnStatement(ReturnStatement* stmt) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitWithEnterStatement(
|
| - WithEnterStatement* stmt) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitWithExitStatement(WithExitStatement* stmt) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitSwitchStatement(SwitchStatement* stmt) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitDoWhileStatement(DoWhileStatement* stmt) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitWhileStatement(WhileStatement* stmt) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitForStatement(ForStatement* stmt) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitForInStatement(ForInStatement* stmt) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitTryCatchStatement(TryCatchStatement* stmt) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitTryFinallyStatement(
|
| - TryFinallyStatement* stmt) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitDebuggerStatement(
|
| - DebuggerStatement* stmt) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitFunctionLiteral(FunctionLiteral* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitSharedFunctionInfoLiteral(
|
| - SharedFunctionInfoLiteral* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitConditional(Conditional* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitSlot(Slot* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitVariableProxy(VariableProxy* expr) {
|
| - expr->set_num(next_number_++);
|
| - Variable* var = expr->var();
|
| - if (var->is_global() && !var->is_this()) {
|
| - info_->set_has_globals(true);
|
| - }
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitLiteral(Literal* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitRegExpLiteral(RegExpLiteral* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitObjectLiteral(ObjectLiteral* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitArrayLiteral(ArrayLiteral* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitCatchExtensionObject(
|
| - CatchExtensionObject* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitAssignment(Assignment* expr) {
|
| - Property* prop = expr->target()->AsProperty();
|
| - ASSERT(prop != NULL);
|
| - ASSERT(prop->key()->IsPropertyName());
|
| - VariableProxy* proxy = prop->obj()->AsVariableProxy();
|
| - USE(proxy);
|
| - ASSERT(proxy != NULL && proxy->var()->is_this());
|
| - info()->set_has_this_properties(true);
|
| -
|
| - prop->obj()->set_num(AstNode::kNoNumber);
|
| - prop->key()->set_num(AstNode::kNoNumber);
|
| - Visit(expr->value());
|
| - expr->set_num(next_number_++);
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitThrow(Throw* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitProperty(Property* expr) {
|
| - ASSERT(expr->key()->IsPropertyName());
|
| - VariableProxy* proxy = expr->obj()->AsVariableProxy();
|
| - USE(proxy);
|
| - ASSERT(proxy != NULL && proxy->var()->is_this());
|
| - info()->set_has_this_properties(true);
|
| -
|
| - expr->obj()->set_num(AstNode::kNoNumber);
|
| - expr->key()->set_num(AstNode::kNoNumber);
|
| - expr->set_num(next_number_++);
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitCall(Call* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitCallNew(CallNew* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitCallRuntime(CallRuntime* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitUnaryOperation(UnaryOperation* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitCountOperation(CountOperation* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitBinaryOperation(BinaryOperation* expr) {
|
| - Visit(expr->left());
|
| - Visit(expr->right());
|
| - expr->set_num(next_number_++);
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitCompareOperation(CompareOperation* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitThisFunction(ThisFunction* expr) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void AstLabeler::VisitDeclaration(Declaration* decl) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -AssignedVariablesAnalyzer::AssignedVariablesAnalyzer(FunctionLiteral* fun)
|
| - : fun_(fun),
|
| - av_(fun->scope()->num_parameters() + fun->scope()->num_stack_slots()) {}
|
| -
|
| -
|
| -void AssignedVariablesAnalyzer::Analyze() {
|
| - ASSERT(av_.length() > 0);
|
| +bool AssignedVariablesAnalyzer::Analyze() {
|
| + Scope* scope = fun_->scope();
|
| + int variables = scope->num_parameters() + scope->num_stack_slots();
|
| + if (variables == 0) return true;
|
| + av_.ExpandTo(variables);
|
| VisitStatements(fun_->body());
|
| + return !HasStackOverflow();
|
| }
|
|
|
|
|
| @@ -394,7 +149,7 @@
|
| !var->is_arguments() &&
|
| var->mode() != Variable::CONST &&
|
| (var->is_this() || !av_.Contains(BitIndex(var)))) {
|
| - expr->AsVariableProxy()->set_is_trivial(true);
|
| + expr->AsVariableProxy()->MarkAsTrivial();
|
| }
|
| }
|
|
|
| @@ -489,9 +244,7 @@
|
|
|
| void AssignedVariablesAnalyzer::VisitForStatement(ForStatement* stmt) {
|
| if (stmt->init() != NULL) Visit(stmt->init());
|
| -
|
| if (stmt->cond() != NULL) ProcessExpression(stmt->cond());
|
| -
|
| if (stmt->next() != NULL) Visit(stmt->next());
|
|
|
| // Process loop body. After visiting the loop body av_ contains
|
| @@ -504,7 +257,6 @@
|
| if (var != NULL && !av_.Contains(BitIndex(var))) {
|
| stmt->set_loop_variable(var);
|
| }
|
| -
|
| av_.Union(saved_av);
|
| }
|
|
|
| @@ -712,13 +464,14 @@
|
|
|
| void AssignedVariablesAnalyzer::VisitUnaryOperation(UnaryOperation* expr) {
|
| ASSERT(av_.IsEmpty());
|
| + MarkIfTrivial(expr->expression());
|
| Visit(expr->expression());
|
| }
|
|
|
|
|
| void AssignedVariablesAnalyzer::VisitCountOperation(CountOperation* expr) {
|
| ASSERT(av_.IsEmpty());
|
| -
|
| + if (expr->is_prefix()) MarkIfTrivial(expr->expression());
|
| Visit(expr->expression());
|
|
|
| Variable* var = expr->expression()->AsVariableProxy()->AsVariable();
|
| @@ -744,6 +497,13 @@
|
| }
|
|
|
|
|
| +void AssignedVariablesAnalyzer::VisitCompareToNull(CompareToNull* expr) {
|
| + ASSERT(av_.IsEmpty());
|
| + MarkIfTrivial(expr->expression());
|
| + Visit(expr->expression());
|
| +}
|
| +
|
| +
|
| void AssignedVariablesAnalyzer::VisitThisFunction(ThisFunction* expr) {
|
| // Nothing to do.
|
| ASSERT(av_.IsEmpty());
|
|
|