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
-~----------~----~----~----~------~----~------~--~---

Reply via email to