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 |