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