| Index: src/parsing/parser-base.h
 | 
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h
 | 
| index e1e3d3412281a274f2a3d03079735cc7c113a2de..777cad1ac79dfdcdceb8872bdc7bd316ffbb42ea 100644
 | 
| --- a/src/parsing/parser-base.h
 | 
| +++ b/src/parsing/parser-base.h
 | 
| @@ -427,23 +427,12 @@ class ParserBase {
 | 
|      FunctionKind kind() const { return scope()->function_kind(); }
 | 
|      FunctionState* outer() const { return outer_function_state_; }
 | 
|  
 | 
| -    void set_generator_object_variable(typename Types::Variable* variable) {
 | 
| -      DCHECK_NOT_NULL(variable);
 | 
| -      DCHECK(IsResumableFunction(kind()));
 | 
| -      DCHECK(scope()->has_forced_context_allocation());
 | 
| -      generator_object_variable_ = variable;
 | 
| -    }
 | 
|      typename Types::Variable* generator_object_variable() const {
 | 
| -      return generator_object_variable_;
 | 
| +      return scope()->generator_object_var();
 | 
|      }
 | 
|  
 | 
| -    void set_promise_variable(typename Types::Variable* variable) {
 | 
| -      DCHECK(variable != NULL);
 | 
| -      DCHECK(IsAsyncFunction(kind()));
 | 
| -      promise_variable_ = variable;
 | 
| -    }
 | 
|      typename Types::Variable* promise_variable() const {
 | 
| -      return promise_variable_;
 | 
| +      return scope()->promise_var();
 | 
|      }
 | 
|  
 | 
|      const ZoneList<DestructuringAssignment>&
 | 
| @@ -1383,6 +1372,15 @@ class ParserBase {
 | 
|      return Call::NOT_EVAL;
 | 
|    }
 | 
|  
 | 
| +  // Convenience method which determines the type of return statement to emit
 | 
| +  // depending on the current function type.
 | 
| +  inline StatementT BuildReturnStatement(ExpressionT expr, int pos) {
 | 
| +    if (V8_UNLIKELY(is_async_function())) {
 | 
| +      return factory()->NewAsyncReturnStatement(expr, pos);
 | 
| +    }
 | 
| +    return factory()->NewReturnStatement(expr, pos);
 | 
| +  }
 | 
| +
 | 
|    // Validation per ES6 object literals.
 | 
|    class ObjectLiteralChecker {
 | 
|     public:
 | 
| @@ -4276,9 +4274,8 @@ ParserBase<Impl>::ParseArrowFunctionLiteral(
 | 
|        } else {
 | 
|          ExpressionT expression = ParseAssignmentExpression(accept_IN, CHECK_OK);
 | 
|          impl()->RewriteNonPattern(CHECK_OK);
 | 
| -        body->Add(
 | 
| -            factory()->NewReturnStatement(expression, expression->position()),
 | 
| -            zone());
 | 
| +        body->Add(BuildReturnStatement(expression, expression->position()),
 | 
| +                  zone());
 | 
|          if (allow_tailcalls() && !is_sloppy(language_mode())) {
 | 
|            // ES6 14.6.1 Static Semantics: IsInTailPosition
 | 
|            impl()->MarkTailPosition(expression);
 | 
| @@ -5183,7 +5180,7 @@ typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseReturnStatement(
 | 
|    }
 | 
|    ExpectSemicolon(CHECK_OK);
 | 
|    return_value = impl()->RewriteReturn(return_value, loc.beg_pos);
 | 
| -  return factory()->NewReturnStatement(return_value, loc.beg_pos);
 | 
| +  return BuildReturnStatement(return_value, loc.beg_pos);
 | 
|  }
 | 
|  
 | 
|  template <typename Impl>
 | 
| 
 |