OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/debug/debug-scopes.h" | 5 #include "src/debug/debug-scopes.h" |
6 | 6 |
7 #include "src/ast/scopes.h" | 7 #include "src/ast/scopes.h" |
8 #include "src/debug/debug.h" | 8 #include "src/debug/debug.h" |
9 #include "src/frames-inl.h" | 9 #include "src/frames-inl.h" |
10 #include "src/globals.h" | 10 #include "src/globals.h" |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 if (!nested_scope_chain_.is_empty()) { | 194 if (!nested_scope_chain_.is_empty()) { |
195 DCHECK_EQ(nested_scope_chain_.last().scope_info->scope_type(), | 195 DCHECK_EQ(nested_scope_chain_.last().scope_info->scope_type(), |
196 SCRIPT_SCOPE); | 196 SCRIPT_SCOPE); |
197 nested_scope_chain_.RemoveLast(); | 197 nested_scope_chain_.RemoveLast(); |
198 DCHECK(nested_scope_chain_.is_empty()); | 198 DCHECK(nested_scope_chain_.is_empty()); |
199 } | 199 } |
200 CHECK(context_->IsNativeContext()); | 200 CHECK(context_->IsNativeContext()); |
201 } else if (nested_scope_chain_.is_empty()) { | 201 } else if (nested_scope_chain_.is_empty()) { |
202 context_ = Handle<Context>(context_->previous(), isolate_); | 202 context_ = Handle<Context>(context_->previous(), isolate_); |
203 } else { | 203 } else { |
204 if (nested_scope_chain_.last().scope_info->HasContext()) { | 204 do { |
205 DCHECK(context_->previous() != NULL); | 205 if (nested_scope_chain_.last().scope_info->HasContext()) { |
206 context_ = Handle<Context>(context_->previous(), isolate_); | 206 DCHECK(context_->previous() != NULL); |
207 } | 207 context_ = Handle<Context>(context_->previous(), isolate_); |
208 nested_scope_chain_.RemoveLast(); | 208 } |
| 209 nested_scope_chain_.RemoveLast(); |
| 210 if (nested_scope_chain_.is_empty()) break; |
| 211 // Repeat to skip hidden scopes. |
| 212 } while (nested_scope_chain_.last().is_hidden()); |
209 } | 213 } |
210 UnwrapEvaluationContext(); | 214 UnwrapEvaluationContext(); |
211 } | 215 } |
212 | 216 |
213 | 217 |
214 // Return the type of the current scope. | 218 // Return the type of the current scope. |
215 ScopeIterator::ScopeType ScopeIterator::Type() { | 219 ScopeIterator::ScopeType ScopeIterator::Type() { |
216 DCHECK(!failed_); | 220 DCHECK(!failed_); |
217 if (!nested_scope_chain_.is_empty()) { | 221 if (!nested_scope_chain_.is_empty()) { |
218 Handle<ScopeInfo> scope_info = nested_scope_chain_.last().scope_info; | 222 Handle<ScopeInfo> scope_info = nested_scope_chain_.last().scope_info; |
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
789 isolate_, value, Object::GetPropertyOrElement(extension, key), false); | 793 isolate_, value, Object::GetPropertyOrElement(extension, key), false); |
790 RETURN_ON_EXCEPTION_VALUE( | 794 RETURN_ON_EXCEPTION_VALUE( |
791 isolate_, JSObject::SetOwnPropertyIgnoreAttributes( | 795 isolate_, JSObject::SetOwnPropertyIgnoreAttributes( |
792 scope_object, key, value, NONE), false); | 796 scope_object, key, value, NONE), false); |
793 } | 797 } |
794 return true; | 798 return true; |
795 } | 799 } |
796 | 800 |
797 void ScopeIterator::GetNestedScopeChain(Isolate* isolate, Scope* scope, | 801 void ScopeIterator::GetNestedScopeChain(Isolate* isolate, Scope* scope, |
798 int position) { | 802 int position) { |
799 if (!scope->is_eval_scope() && !scope->is_hidden()) { | 803 if (!scope->is_eval_scope()) { |
800 nested_scope_chain_.Add(ExtendedScopeInfo(scope->GetScopeInfo(isolate), | 804 if (scope->is_hidden()) { |
801 scope->start_position(), | 805 // We need to add this chain element in case the scope has a context |
802 scope->end_position())); | 806 // associated. We need to keep the scope chain and context chain in sync. |
| 807 nested_scope_chain_.Add(ExtendedScopeInfo(scope->GetScopeInfo(isolate))); |
| 808 } else { |
| 809 nested_scope_chain_.Add(ExtendedScopeInfo(scope->GetScopeInfo(isolate), |
| 810 scope->start_position(), |
| 811 scope->end_position())); |
| 812 } |
803 } | 813 } |
804 for (int i = 0; i < scope->inner_scopes()->length(); i++) { | 814 for (int i = 0; i < scope->inner_scopes()->length(); i++) { |
805 Scope* inner_scope = scope->inner_scopes()->at(i); | 815 Scope* inner_scope = scope->inner_scopes()->at(i); |
806 int beg_pos = inner_scope->start_position(); | 816 int beg_pos = inner_scope->start_position(); |
807 int end_pos = inner_scope->end_position(); | 817 int end_pos = inner_scope->end_position(); |
808 DCHECK((beg_pos >= 0 && end_pos >= 0) || inner_scope->is_hidden()); | 818 DCHECK((beg_pos >= 0 && end_pos >= 0) || inner_scope->is_hidden()); |
809 if (beg_pos <= position && position < end_pos) { | 819 if (beg_pos <= position && position < end_pos) { |
810 GetNestedScopeChain(isolate, inner_scope, position); | 820 GetNestedScopeChain(isolate, inner_scope, position); |
811 return; | 821 return; |
812 } | 822 } |
813 } | 823 } |
814 } | 824 } |
815 | 825 |
816 } // namespace internal | 826 } // namespace internal |
817 } // namespace v8 | 827 } // namespace v8 |
OLD | NEW |