| Index: src/rewriter.cc
 | 
| diff --git a/src/rewriter.cc b/src/rewriter.cc
 | 
| index 3c9c2fd0351bd3366a0003c80603490f949e0bd5..47843305390bd6506b2b9fa8079e569a5cb0828b 100644
 | 
| --- a/src/rewriter.cc
 | 
| +++ b/src/rewriter.cc
 | 
| @@ -25,6 +25,17 @@ class Processor: public AstVisitor {
 | 
|      InitializeAstVisitor(isolate);
 | 
|    }
 | 
|  
 | 
| +  Processor(Parser* parser, Scope* scope, Variable* result,
 | 
| +            AstValueFactory* ast_value_factory)
 | 
| +      : result_(result),
 | 
| +        result_assigned_(false),
 | 
| +        replacement_(nullptr),
 | 
| +        is_set_(false),
 | 
| +        scope_(scope),
 | 
| +        factory_(ast_value_factory) {
 | 
| +    InitializeAstVisitor(parser->stack_limit());
 | 
| +  }
 | 
| +
 | 
|    virtual ~Processor() { }
 | 
|  
 | 
|    void Process(ZoneList<Statement*>* statements);
 | 
| @@ -34,6 +45,17 @@ class Processor: public AstVisitor {
 | 
|    Scope* scope() { return scope_; }
 | 
|    AstNodeFactory* factory() { return &factory_; }
 | 
|  
 | 
| +  // Returns ".result = value"
 | 
| +  Expression* SetResult(Expression* value) {
 | 
| +    result_assigned_ = true;
 | 
| +    VariableProxy* result_proxy = factory()->NewVariableProxy(result_);
 | 
| +    return factory()->NewAssignment(Token::ASSIGN, result_proxy, value,
 | 
| +                                    RelocInfo::kNoPosition);
 | 
| +  }
 | 
| +
 | 
| +  // Inserts '.result = undefined' in front of the given statement.
 | 
| +  Statement* AssignUndefinedBefore(Statement* s);
 | 
| +
 | 
|   private:
 | 
|    Variable* result_;
 | 
|  
 | 
| @@ -57,17 +79,6 @@ class Processor: public AstVisitor {
 | 
|    Scope* scope_;
 | 
|    AstNodeFactory factory_;
 | 
|  
 | 
| -  // Returns ".result = value"
 | 
| -  Expression* SetResult(Expression* value) {
 | 
| -    result_assigned_ = true;
 | 
| -    VariableProxy* result_proxy = factory()->NewVariableProxy(result_);
 | 
| -    return factory()->NewAssignment(
 | 
| -        Token::ASSIGN, result_proxy, value, RelocInfo::kNoPosition);
 | 
| -  }
 | 
| -
 | 
| -  // Inserts '.result = undefined' in front of the given statement.
 | 
| -  Statement* AssignUndefinedBefore(Statement* s);
 | 
| -
 | 
|    // Node visitors.
 | 
|  #define DEF_VISIT(type) virtual void Visit##type(type* node) override;
 | 
|    AST_NODE_LIST(DEF_VISIT)
 | 
| @@ -362,5 +373,31 @@ bool Rewriter::Rewrite(ParseInfo* info) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| +bool Rewriter::Rewrite(Parser* parser, DoExpression* expr,
 | 
| +                       AstValueFactory* factory) {
 | 
| +  Block* block = expr->block();
 | 
| +  Scope* scope = block->scope();
 | 
| +  ZoneList<Statement*>* body = block->statements();
 | 
| +  VariableProxy* result = expr->result();
 | 
| +  Variable* result_var = result->var();
 | 
| +
 | 
| +  if (!body->is_empty()) {
 | 
| +    Processor processor(parser, scope, result_var, factory);
 | 
| +    processor.Process(body);
 | 
| +    if (processor.HasStackOverflow()) return false;
 | 
| +
 | 
| +    if (!processor.result_assigned()) {
 | 
| +      AstNodeFactory* node_factory = processor.factory();
 | 
| +      Expression* undef =
 | 
| +          node_factory->NewUndefinedLiteral(RelocInfo::kNoPosition);
 | 
| +      Statement* completion = node_factory->NewExpressionStatement(
 | 
| +          processor.SetResult(undef), expr->position());
 | 
| +      body->Add(completion, factory->zone());
 | 
| +    }
 | 
| +  }
 | 
| +  return true;
 | 
| +}
 | 
| +
 | 
| +
 | 
|  }  // namespace internal
 | 
|  }  // namespace v8
 | 
| 
 |