| 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 "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/ast/scopeinfo.h" | 8 #include "src/ast/scopeinfo.h" |
| 9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/messages.h" | 10 #include "src/messages.h" |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 } | 201 } |
| 202 } | 202 } |
| 203 | 203 |
| 204 | 204 |
| 205 Scope* Scope::DeserializeScopeChain(Isolate* isolate, Zone* zone, | 205 Scope* Scope::DeserializeScopeChain(Isolate* isolate, Zone* zone, |
| 206 Context* context, Scope* script_scope) { | 206 Context* context, Scope* script_scope) { |
| 207 // Reconstruct the outer scope chain from a closure's context chain. | 207 // Reconstruct the outer scope chain from a closure's context chain. |
| 208 Scope* current_scope = NULL; | 208 Scope* current_scope = NULL; |
| 209 Scope* innermost_scope = NULL; | 209 Scope* innermost_scope = NULL; |
| 210 while (!context->IsNativeContext()) { | 210 while (!context->IsNativeContext()) { |
| 211 if (context->IsWithContext()) { | 211 if (context->IsWithContext() || context->IsDebugEvaluateContext()) { |
| 212 // For scope analysis, debug-evaluate is equivalent to a with scope. |
| 212 Scope* with_scope = new (zone) | 213 Scope* with_scope = new (zone) |
| 213 Scope(zone, current_scope, WITH_SCOPE, Handle<ScopeInfo>::null(), | 214 Scope(zone, current_scope, WITH_SCOPE, Handle<ScopeInfo>::null(), |
| 214 script_scope->ast_value_factory_); | 215 script_scope->ast_value_factory_); |
| 215 current_scope = with_scope; | 216 current_scope = with_scope; |
| 216 // All the inner scopes are inside a with. | 217 // All the inner scopes are inside a with. |
| 217 for (Scope* s = innermost_scope; s != NULL; s = s->outer_scope()) { | 218 for (Scope* s = innermost_scope; s != NULL; s = s->outer_scope()) { |
| 218 s->scope_inside_with_ = true; | 219 s->scope_inside_with_ = true; |
| 219 } | 220 } |
| 220 } else if (context->IsScriptContext()) { | 221 } else if (context->IsScriptContext()) { |
| 221 ScopeInfo* scope_info = context->scope_info(); | 222 ScopeInfo* scope_info = context->scope_info(); |
| (...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 783 | 784 |
| 784 | 785 |
| 785 | 786 |
| 786 Handle<ScopeInfo> Scope::GetScopeInfo(Isolate* isolate) { | 787 Handle<ScopeInfo> Scope::GetScopeInfo(Isolate* isolate) { |
| 787 if (scope_info_.is_null()) { | 788 if (scope_info_.is_null()) { |
| 788 scope_info_ = ScopeInfo::Create(isolate, zone(), this); | 789 scope_info_ = ScopeInfo::Create(isolate, zone(), this); |
| 789 } | 790 } |
| 790 return scope_info_; | 791 return scope_info_; |
| 791 } | 792 } |
| 792 | 793 |
| 793 | 794 Handle<StringSet> Scope::CollectNonLocals(Handle<StringSet> non_locals) { |
| 794 void Scope::CollectNonLocals(HashMap* non_locals) { | |
| 795 // Collect non-local variables referenced in the scope. | 795 // Collect non-local variables referenced in the scope. |
| 796 // TODO(yangguo): store non-local variables explicitly if we can no longer | 796 // TODO(yangguo): store non-local variables explicitly if we can no longer |
| 797 // rely on unresolved_ to find them. | 797 // rely on unresolved_ to find them. |
| 798 for (int i = 0; i < unresolved_.length(); i++) { | 798 for (int i = 0; i < unresolved_.length(); i++) { |
| 799 VariableProxy* proxy = unresolved_[i]; | 799 VariableProxy* proxy = unresolved_[i]; |
| 800 if (proxy->is_resolved() && proxy->var()->IsStackAllocated()) continue; | 800 if (proxy->is_resolved() && proxy->var()->IsStackAllocated()) continue; |
| 801 Handle<String> name = proxy->name(); | 801 Handle<String> name = proxy->name(); |
| 802 void* key = reinterpret_cast<void*>(name.location()); | 802 non_locals = StringSet::Add(non_locals, name); |
| 803 HashMap::Entry* entry = non_locals->LookupOrInsert(key, name->Hash()); | |
| 804 entry->value = key; | |
| 805 } | 803 } |
| 806 for (int i = 0; i < inner_scopes_.length(); i++) { | 804 for (int i = 0; i < inner_scopes_.length(); i++) { |
| 807 inner_scopes_[i]->CollectNonLocals(non_locals); | 805 non_locals = inner_scopes_[i]->CollectNonLocals(non_locals); |
| 808 } | 806 } |
| 807 return non_locals; |
| 809 } | 808 } |
| 810 | 809 |
| 811 | 810 |
| 812 void Scope::ReportMessage(int start_position, int end_position, | 811 void Scope::ReportMessage(int start_position, int end_position, |
| 813 MessageTemplate::Template message, | 812 MessageTemplate::Template message, |
| 814 const AstRawString* arg) { | 813 const AstRawString* arg) { |
| 815 // Propagate the error to the topmost scope targeted by this scope analysis | 814 // Propagate the error to the topmost scope targeted by this scope analysis |
| 816 // phase. | 815 // phase. |
| 817 Scope* top = this; | 816 Scope* top = this; |
| 818 while (!top->is_script_scope() && !top->outer_scope()->already_resolved()) { | 817 while (!top->is_script_scope() && !top->outer_scope()->already_resolved()) { |
| (...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1500 function_ != NULL && function_->proxy()->var()->IsContextSlot(); | 1499 function_ != NULL && function_->proxy()->var()->IsContextSlot(); |
| 1501 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - | 1500 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - |
| 1502 (is_function_var_in_context ? 1 : 0); | 1501 (is_function_var_in_context ? 1 : 0); |
| 1503 } | 1502 } |
| 1504 | 1503 |
| 1505 | 1504 |
| 1506 int Scope::ContextGlobalCount() const { return num_global_slots(); } | 1505 int Scope::ContextGlobalCount() const { return num_global_slots(); } |
| 1507 | 1506 |
| 1508 } // namespace internal | 1507 } // namespace internal |
| 1509 } // namespace v8 | 1508 } // namespace v8 |
| OLD | NEW |