Reviewers: fschneider, Message: Tiny change and review.
Description: Fast-compiler: Added trivial implementations of while and do/while. Please review this at http://codereview.chromium.org/372055 Affected files: M src/compiler.cc M src/fast-codegen.cc Index: src/compiler.cc diff --git a/src/compiler.cc b/src/compiler.cc index 22384bf8d1b8c35c4e1b605dca3cf44f7ef6e39b..75060b0a7b715f0439649e92db3cf7c513a44b39 100644 --- a/src/compiler.cc +++ b/src/compiler.cc @@ -708,12 +708,20 @@ void CodeGenSelector::VisitSwitchStatement(SwitchStatement* stmt) { void CodeGenSelector::VisitDoWhileStatement(DoWhileStatement* stmt) { - BAILOUT("DoWhileStatement"); + // We do not handle loops with breaks or continue statements in their + // body. We will bailout when we hit those statements in the body. + ProcessExpression(stmt->cond(), Expression::kTest); + CHECK_BAILOUT; + Visit(stmt->body()); } void CodeGenSelector::VisitWhileStatement(WhileStatement* stmt) { - BAILOUT("WhileStatement"); + // We do not handle loops with breaks or continue statements in their + // body. We will bailout when we hit those statements in the body. + ProcessExpression(stmt->cond(), Expression::kTest); + CHECK_BAILOUT; + Visit(stmt->body()); } Index: src/fast-codegen.cc diff --git a/src/fast-codegen.cc b/src/fast-codegen.cc index f5a6157de94761041b0e0ca674c3142703db771b..bb5ed8ab08c1e75290ec6d13c968160c472cd677 100644 --- a/src/fast-codegen.cc +++ b/src/fast-codegen.cc @@ -304,12 +304,53 @@ void FastCodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) { void FastCodeGenerator::VisitDoWhileStatement(DoWhileStatement* stmt) { - UNREACHABLE(); + Comment cmnt(masm_, "[ DoWhileStatement"); + increment_loop_depth(); + Label body, exit; + + // Emit the test at the bottom of the loop. + __ bind(&body); + Visit(stmt->body()); + + // We are not in an expression context because we have been compiling + // statements. Set up a test expression context for the condition. + ASSERT_EQ(NULL, true_label_); + ASSERT_EQ(NULL, false_label_); + true_label_ = &body; + false_label_ = &exit; + ASSERT(stmt->cond()->context() == Expression::kTest); + Visit(stmt->cond()); + + __ bind(&exit); + + decrement_loop_depth(); } void FastCodeGenerator::VisitWhileStatement(WhileStatement* stmt) { - UNREACHABLE(); + Comment cmnt(masm_, "[ WhileStatement"); + increment_loop_depth(); + Label test, body, exit; + + // Emit the test at the bottom of the loop. + __ jmp(&test); + + __ bind(&body); + Visit(stmt->body()); + + __ bind(&test); + // We are not in an expression context because we have been compiling + // statements. Set up a test expression context for the condition. + ASSERT_EQ(NULL, true_label_); + ASSERT_EQ(NULL, false_label_); + true_label_ = &body; + false_label_ = &exit; + ASSERT(stmt->cond()->context() == Expression::kTest); + Visit(stmt->cond()); + + __ bind(&exit); + + decrement_loop_depth(); } --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
