| Index: src/ast/scopes.h
|
| diff --git a/src/ast/scopes.h b/src/ast/scopes.h
|
| index be7b938f1931b002717d9eba14e55ca597f6e10c..b60d3b188e1f93cd6e68c226762c45496fb41ff8 100644
|
| --- a/src/ast/scopes.h
|
| +++ b/src/ast/scopes.h
|
| @@ -204,6 +204,7 @@ class Scope: public ZoneObject {
|
| // the same name because they may be removed selectively via
|
| // RemoveUnresolved().
|
| DCHECK(!already_resolved());
|
| + DCHECK_EQ(factory->zone(), zone());
|
| VariableProxy* proxy =
|
| factory->NewVariableProxy(name, kind, start_position, end_position);
|
| proxy->set_next_unresolved(unresolved_);
|
| @@ -612,6 +613,13 @@ class Scope: public ZoneObject {
|
| return &sloppy_block_function_map_;
|
| }
|
|
|
| + // To be called during parsing. Do just enough scope analysis that we can
|
| + // discard the Scope for lazily compiled functions. In particular, this
|
| + // records variables which cannot be resolved inside the Scope (we don't yet
|
| + // know what they will resolve to since the outer Scopes are incomplete) and
|
| + // migrates them into migrate_to.
|
| + void AnalyzePartially(Scope* migrate_to, AstNodeFactory* ast_node_factory);
|
| +
|
| // ---------------------------------------------------------------------------
|
| // Debugging.
|
|
|
| @@ -620,6 +628,9 @@ class Scope: public ZoneObject {
|
|
|
| // Check that the scope has positions assigned.
|
| void CheckScopePositions();
|
| +
|
| + // Check that all Scopes in the scope tree use the same Zone.
|
| + void CheckZones();
|
| #endif
|
|
|
| // ---------------------------------------------------------------------------
|
| @@ -780,16 +791,24 @@ class Scope: public ZoneObject {
|
| };
|
|
|
| // Lookup a variable reference given by name recursively starting with this
|
| - // scope. If the code is executed because of a call to 'eval', the context
|
| - // parameter should be set to the calling context of 'eval'.
|
| + // scope, but only until max_outer_scope (if not nullptr). If the code is
|
| + // executed because of a call to 'eval', the context parameter should be set
|
| + // to the calling context of 'eval'.
|
| Variable* LookupRecursive(VariableProxy* proxy, BindingKind* binding_kind,
|
| - AstNodeFactory* factory);
|
| + AstNodeFactory* factory,
|
| + Scope* max_outer_scope = nullptr);
|
| MUST_USE_RESULT
|
| bool ResolveVariable(ParseInfo* info, VariableProxy* proxy,
|
| AstNodeFactory* factory);
|
| MUST_USE_RESULT
|
| bool ResolveVariablesRecursively(ParseInfo* info, AstNodeFactory* factory);
|
|
|
| + // Tries to resolve local variables inside max_outer_scope; migrates those
|
| + // which cannot be resolved into migrate_to.
|
| + void MigrateUnresolvableLocals(Scope* migrate_to,
|
| + AstNodeFactory* ast_node_factory,
|
| + Scope* max_outer_scope);
|
| +
|
| // Scope analysis.
|
| void PropagateScopeInfo(bool outer_scope_calls_sloppy_eval);
|
| bool HasTrivialContext() const;
|
|
|