| Index: src/full-codegen.h
|
| diff --git a/src/full-codegen.h b/src/full-codegen.h
|
| index fc0fe6d25b89f5ecd71093bbc6e26d672f7f6718..87951ebffce478f8e391b2bebe7a6cc329aa1010 100644
|
| --- a/src/full-codegen.h
|
| +++ b/src/full-codegen.h
|
| @@ -113,6 +113,7 @@ class FullCodeGenerator: public AstVisitor {
|
| class TryFinally;
|
| class Finally;
|
| class ForIn;
|
| + class TestContext;
|
|
|
| class NestedStatement BASE_EMBEDDED {
|
| public:
|
| @@ -298,7 +299,11 @@ class FullCodeGenerator: public AstVisitor {
|
| // Helper function to convert a pure value into a test context. The value
|
| // is expected on the stack or the accumulator, depending on the platform.
|
| // See the platform-specific implementation for details.
|
| - void DoTest(Label* if_true, Label* if_false, Label* fall_through);
|
| + void DoTest(Expression* condition,
|
| + Label* if_true,
|
| + Label* if_false,
|
| + Label* fall_through);
|
| + void DoTest(const TestContext* context);
|
|
|
| // Helper function to split control flow and avoid a branch to the
|
| // fall-through label if it is set up.
|
| @@ -347,7 +352,7 @@ class FullCodeGenerator: public AstVisitor {
|
| Label* if_true,
|
| Label* if_false,
|
| Label* fall_through) {
|
| - TestContext context(this, if_true, if_false, fall_through);
|
| + TestContext context(this, expr, if_true, if_false, fall_through);
|
| VisitInCurrentContext(expr);
|
| }
|
|
|
| @@ -670,11 +675,13 @@ class FullCodeGenerator: public AstVisitor {
|
|
|
| class TestContext : public ExpressionContext {
|
| public:
|
| - explicit TestContext(FullCodeGenerator* codegen,
|
| - Label* true_label,
|
| - Label* false_label,
|
| - Label* fall_through)
|
| + TestContext(FullCodeGenerator* codegen,
|
| + Expression* condition,
|
| + Label* true_label,
|
| + Label* false_label,
|
| + Label* fall_through)
|
| : ExpressionContext(codegen),
|
| + condition_(condition),
|
| true_label_(true_label),
|
| false_label_(false_label),
|
| fall_through_(fall_through) { }
|
| @@ -684,6 +691,7 @@ class FullCodeGenerator: public AstVisitor {
|
| return reinterpret_cast<const TestContext*>(context);
|
| }
|
|
|
| + Expression* condition() const { return condition_; }
|
| Label* true_label() const { return true_label_; }
|
| Label* false_label() const { return false_label_; }
|
| Label* fall_through() const { return fall_through_; }
|
| @@ -704,6 +712,7 @@ class FullCodeGenerator: public AstVisitor {
|
| virtual bool IsTest() const { return true; }
|
|
|
| private:
|
| + Expression* condition_;
|
| Label* true_label_;
|
| Label* false_label_;
|
| Label* fall_through_;
|
|
|