| Index: src/fast-codegen.cc
|
| ===================================================================
|
| --- src/fast-codegen.cc (revision 3191)
|
| +++ src/fast-codegen.cc (working copy)
|
| @@ -380,7 +380,36 @@
|
|
|
|
|
| void FastCodeGenerator::VisitConditional(Conditional* expr) {
|
| - UNREACHABLE();
|
| + ASSERT_EQ(Expression::kTest, expr->condition()->context());
|
| + ASSERT_EQ(expr->context(), expr->then_expression()->context());
|
| + ASSERT_EQ(expr->context(), expr->else_expression()->context());
|
| +
|
| +
|
| + Label true_case, false_case, done;
|
| + Label* saved_true = true_label_;
|
| + Label* saved_false = false_label_;
|
| +
|
| + true_label_ = &true_case;
|
| + false_label_ = &false_case;
|
| + Visit(expr->condition());
|
| + true_label_ = saved_true;
|
| + false_label_ = saved_false;
|
| +
|
| + __ bind(&true_case);
|
| + Visit(expr->then_expression());
|
| + // If control flow falls through Visit, jump to done.
|
| + if (expr->context() == Expression::kEffect ||
|
| + expr->context() == Expression::kValue) {
|
| + __ jmp(&done);
|
| + }
|
| +
|
| + __ bind(&false_case);
|
| + Visit(expr->else_expression());
|
| + // If control flow falls through Visit, merge it with true case here.
|
| + if (expr->context() == Expression::kEffect ||
|
| + expr->context() == Expression::kValue) {
|
| + __ bind(&done);
|
| + }
|
| }
|
|
|
|
|
|
|