| Index: src/parsing/pattern-rewriter.cc
|
| diff --git a/src/parsing/pattern-rewriter.cc b/src/parsing/pattern-rewriter.cc
|
| index 91d75495469b9f966641eec51f772d016a056dc6..808c0c096458cf7aa0f0c8a0809b5abe7e4e3423 100644
|
| --- a/src/parsing/pattern-rewriter.cc
|
| +++ b/src/parsing/pattern-rewriter.cc
|
| @@ -677,9 +677,29 @@
|
| RelocInfo::kNoPosition);
|
| }
|
|
|
| + // Two cases for scope rewriting the scope of default parameters:
|
| + // - Eagerly parsed arrow functions are initially parsed as having
|
| + // initializers in the enclosing scope, but when the arrow is encountered,
|
| + // need to be in the scope of the function.
|
| + // - When an extra declaration scope needs to be inserted to account for
|
| + // a sloppy eval in a default parameter or function body, the initializer
|
| + // needs to be in that new inner scope which was added after initial
|
| + // parsing.
|
| + // Each of these cases can be handled by rewriting the contents of the
|
| + // initializer to the current scope. The source scope is typically the outer
|
| + // scope when one case occurs; when both cases occur, both scopes need to
|
| + // be included as the outer scope. (Both rewritings still need to be done
|
| + // to account for lazily parsed arrow functions which hit the second case.)
|
| + // TODO(littledan): Remove the outer_scope parameter of
|
| + // RewriteParameterInitializerScope
|
| if (IsBindingContext() &&
|
| descriptor_->declaration_kind == DeclarationDescriptor::PARAMETER &&
|
| - scope()->is_arrow_scope()) {
|
| + (scope()->is_arrow_scope() || scope()->is_block_scope())) {
|
| + if (scope()->outer_scope()->is_arrow_scope() && scope()->is_block_scope()) {
|
| + RewriteParameterInitializerScope(parser_->stack_limit(), initializer,
|
| + scope()->outer_scope()->outer_scope(),
|
| + scope());
|
| + }
|
| RewriteParameterInitializerScope(parser_->stack_limit(), initializer,
|
| scope()->outer_scope(), scope());
|
| }
|
|
|