| OLD | NEW | 
|     1 // Copyright 2012 the V8 project authors. All rights reserved. |     1 // Copyright 2012 the V8 project authors. All rights reserved. | 
|     2 // Use of this source code is governed by a BSD-style license that can be |     2 // Use of this source code is governed by a BSD-style license that can be | 
|     3 // found in the LICENSE file. |     3 // found in the LICENSE file. | 
|     4  |     4  | 
|     5 #include "src/ast/scopes.h" |     5 #include "src/ast/scopes.h" | 
|     6  |     6  | 
|     7 #include <set> |     7 #include <set> | 
|     8  |     8  | 
|     9 #include "src/accessors.h" |     9 #include "src/accessors.h" | 
|    10 #include "src/ast/ast.h" |    10 #include "src/ast/ast.h" | 
| (...skipping 1229 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1240 Scope* Scope::GetOuterScopeWithContext() { |  1240 Scope* Scope::GetOuterScopeWithContext() { | 
|  1241   Scope* scope = outer_scope_; |  1241   Scope* scope = outer_scope_; | 
|  1242   while (scope && !scope->NeedsContext()) { |  1242   while (scope && !scope->NeedsContext()) { | 
|  1243     scope = scope->outer_scope(); |  1243     scope = scope->outer_scope(); | 
|  1244   } |  1244   } | 
|  1245   return scope; |  1245   return scope; | 
|  1246 } |  1246 } | 
|  1247  |  1247  | 
|  1248 Handle<StringSet> DeclarationScope::CollectNonLocals( |  1248 Handle<StringSet> DeclarationScope::CollectNonLocals( | 
|  1249     ParseInfo* info, Handle<StringSet> non_locals) { |  1249     ParseInfo* info, Handle<StringSet> non_locals) { | 
|  1250   VariableProxy* free_variables = FetchFreeVariables(this, true); |  1250   VariableProxy* free_variables = FetchFreeVariables(this, true, info); | 
|  1251   for (VariableProxy* proxy = free_variables; proxy != nullptr; |  1251   for (VariableProxy* proxy = free_variables; proxy != nullptr; | 
|  1252        proxy = proxy->next_unresolved()) { |  1252        proxy = proxy->next_unresolved()) { | 
|  1253     non_locals = StringSet::Add(non_locals, proxy->name()); |  1253     non_locals = StringSet::Add(non_locals, proxy->name()); | 
|  1254   } |  1254   } | 
|  1255   return non_locals; |  1255   return non_locals; | 
|  1256 } |  1256 } | 
|  1257  |  1257  | 
|  1258 void DeclarationScope::ResetAfterPreparsing(AstValueFactory* ast_value_factory, |  1258 void DeclarationScope::ResetAfterPreparsing(AstValueFactory* ast_value_factory, | 
|  1259                                             bool aborted) { |  1259                                             bool aborted) { | 
|  1260   DCHECK(is_function_scope()); |  1260   DCHECK(is_function_scope()); | 
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1727     ResolveVariable(info, proxy); |  1727     ResolveVariable(info, proxy); | 
|  1728   } |  1728   } | 
|  1729  |  1729  | 
|  1730   // Resolve unresolved variables for inner scopes. |  1730   // Resolve unresolved variables for inner scopes. | 
|  1731   for (Scope* scope = inner_scope_; scope != nullptr; scope = scope->sibling_) { |  1731   for (Scope* scope = inner_scope_; scope != nullptr; scope = scope->sibling_) { | 
|  1732     scope->ResolveVariablesRecursively(info); |  1732     scope->ResolveVariablesRecursively(info); | 
|  1733   } |  1733   } | 
|  1734 } |  1734 } | 
|  1735  |  1735  | 
|  1736 VariableProxy* Scope::FetchFreeVariables(DeclarationScope* max_outer_scope, |  1736 VariableProxy* Scope::FetchFreeVariables(DeclarationScope* max_outer_scope, | 
|  1737                                          bool try_to_resolve, |  1737                                          bool try_to_resolve, ParseInfo* info, | 
|  1738                                          VariableProxy* stack) { |  1738                                          VariableProxy* stack) { | 
|  1739   for (VariableProxy *proxy = unresolved_, *next = nullptr; proxy != nullptr; |  1739   for (VariableProxy *proxy = unresolved_, *next = nullptr; proxy != nullptr; | 
|  1740        proxy = next) { |  1740        proxy = next) { | 
|  1741     next = proxy->next_unresolved(); |  1741     next = proxy->next_unresolved(); | 
|  1742     DCHECK(!proxy->is_resolved()); |  1742     DCHECK(!proxy->is_resolved()); | 
|  1743     Variable* var = nullptr; |  1743     Variable* var = nullptr; | 
|  1744     if (try_to_resolve) { |  1744     if (try_to_resolve) { | 
|  1745       var = LookupRecursive(proxy, max_outer_scope->outer_scope()); |  1745       var = LookupRecursive(proxy, max_outer_scope->outer_scope()); | 
|  1746     } |  1746     } | 
|  1747     if (var == nullptr) { |  1747     if (var == nullptr) { | 
|  1748       proxy->set_next_unresolved(stack); |  1748       proxy->set_next_unresolved(stack); | 
|  1749       stack = proxy; |  1749       stack = proxy; | 
 |  1750     } else if (info != nullptr) { | 
 |  1751       ResolveTo(info, proxy, var); | 
|  1750     } else { |  1752     } else { | 
|  1751       var->set_is_used(); |  1753       var->set_is_used(); | 
|  1752     } |  1754     } | 
|  1753   } |  1755   } | 
|  1754  |  1756  | 
|  1755   // Clear unresolved_ as it's in an inconsistent state. |  1757   // Clear unresolved_ as it's in an inconsistent state. | 
|  1756   unresolved_ = nullptr; |  1758   unresolved_ = nullptr; | 
|  1757  |  1759  | 
|  1758   for (Scope* scope = inner_scope_; scope != nullptr; scope = scope->sibling_) { |  1760   for (Scope* scope = inner_scope_; scope != nullptr; scope = scope->sibling_) { | 
|  1759     stack = scope->FetchFreeVariables(max_outer_scope, try_to_resolve, stack); |  1761     stack = | 
 |  1762         scope->FetchFreeVariables(max_outer_scope, try_to_resolve, info, stack); | 
|  1760   } |  1763   } | 
|  1761  |  1764  | 
|  1762   return stack; |  1765   return stack; | 
|  1763 } |  1766 } | 
|  1764  |  1767  | 
|  1765 bool Scope::MustAllocate(Variable* var) { |  1768 bool Scope::MustAllocate(Variable* var) { | 
|  1766   DCHECK(var->location() != VariableLocation::MODULE); |  1769   DCHECK(var->location() != VariableLocation::MODULE); | 
|  1767   // Give var a read/write use if there is a chance it might be accessed |  1770   // Give var a read/write use if there is a chance it might be accessed | 
|  1768   // via an eval() call.  This is only possible if the variable has a |  1771   // via an eval() call.  This is only possible if the variable has a | 
|  1769   // visible name. |  1772   // visible name. | 
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2024   Variable* function = |  2027   Variable* function = | 
|  2025       is_function_scope() ? AsDeclarationScope()->function_var() : nullptr; |  2028       is_function_scope() ? AsDeclarationScope()->function_var() : nullptr; | 
|  2026   bool is_function_var_in_context = |  2029   bool is_function_var_in_context = | 
|  2027       function != nullptr && function->IsContextSlot(); |  2030       function != nullptr && function->IsContextSlot(); | 
|  2028   return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - |  2031   return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - | 
|  2029          (is_function_var_in_context ? 1 : 0); |  2032          (is_function_var_in_context ? 1 : 0); | 
|  2030 } |  2033 } | 
|  2031  |  2034  | 
|  2032 }  // namespace internal |  2035 }  // namespace internal | 
|  2033 }  // namespace v8 |  2036 }  // namespace v8 | 
| OLD | NEW |