Index: src/parsing/parameter-initializer-rewriter.cc |
diff --git a/src/parsing/parameter-initializer-rewriter.cc b/src/parsing/parameter-initializer-rewriter.cc |
index 7a19138069ab525422e93f30fd02c86df204cc9f..e25fafc153d6b408a345103eed06105039e11360 100644 |
--- a/src/parsing/parameter-initializer-rewriter.cc |
+++ b/src/parsing/parameter-initializer-rewriter.cc |
@@ -16,8 +16,10 @@ namespace { |
class Rewriter final : public AstExpressionVisitor { |
public: |
- Rewriter(uintptr_t stack_limit, Expression* initializer, Scope* param_scope) |
+ Rewriter(uintptr_t stack_limit, Expression* initializer, Scope* old_scope, |
+ Scope* param_scope) |
: AstExpressionVisitor(stack_limit, initializer), |
+ old_scope_(old_scope), |
param_scope_(param_scope) {} |
private: |
@@ -31,16 +33,18 @@ class Rewriter final : public AstExpressionVisitor { |
void VisitTryCatchStatement(TryCatchStatement* stmt) override; |
void VisitWithStatement(WithStatement* stmt) override; |
+ Scope* old_scope_; |
Scope* param_scope_; |
}; |
void Rewriter::VisitFunctionLiteral(FunctionLiteral* function_literal) { |
- function_literal->scope()->ReplaceOuterScope(param_scope_); |
+ if (function_literal->scope()->outer_scope() == old_scope_) { |
+ function_literal->scope()->ReplaceOuterScope(param_scope_); |
+ } |
} |
void Rewriter::VisitClassLiteral(ClassLiteral* class_literal) { |
- class_literal->scope()->ReplaceOuterScope(param_scope_); |
if (class_literal->extends() != nullptr) { |
Visit(class_literal->extends()); |
} |
@@ -73,29 +77,33 @@ void Rewriter::VisitVariableProxy(VariableProxy* proxy) { |
void Rewriter::VisitBlock(Block* stmt) { |
- if (stmt->scope() != nullptr) |
+ if (stmt->scope() != nullptr && stmt->scope()->outer_scope() == old_scope_) { |
stmt->scope()->ReplaceOuterScope(param_scope_); |
- else |
- VisitStatements(stmt->statements()); |
+ } |
+ VisitStatements(stmt->statements()); |
} |
void Rewriter::VisitTryCatchStatement(TryCatchStatement* stmt) { |
+ if (stmt->scope()->outer_scope() == old_scope_) { |
+ stmt->scope()->ReplaceOuterScope(param_scope_); |
+ } |
Visit(stmt->try_block()); |
- stmt->scope()->ReplaceOuterScope(param_scope_); |
} |
void Rewriter::VisitWithStatement(WithStatement* stmt) { |
Visit(stmt->expression()); |
- stmt->scope()->ReplaceOuterScope(param_scope_); |
+ if (stmt->scope()->outer_scope() == old_scope_) { |
+ stmt->scope()->ReplaceOuterScope(param_scope_); |
+ } |
} |
} // anonymous namespace |
void ReparentParameterExpressionScope(uintptr_t stack_limit, Expression* expr, |
- Scope* param_scope) { |
+ Scope* old_scope, Scope* param_scope) { |
// The only case that uses this code is block scopes for parameters containing |
// sloppy eval. |
DCHECK(param_scope->is_block_scope()); |
@@ -103,7 +111,7 @@ void ReparentParameterExpressionScope(uintptr_t stack_limit, Expression* expr, |
DCHECK(param_scope->calls_sloppy_eval()); |
DCHECK(param_scope->outer_scope()->is_function_scope()); |
- Rewriter rewriter(stack_limit, expr, param_scope); |
+ Rewriter rewriter(stack_limit, expr, old_scope, param_scope); |
rewriter.Run(); |
} |