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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/scopes.h" | 7 #include "src/scopes.h" |
8 | 8 |
9 #include "src/accessors.h" | 9 #include "src/accessors.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 DCHECK(p->value != NULL); | 60 DCHECK(p->value != NULL); |
61 return reinterpret_cast<Variable*>(p->value); | 61 return reinterpret_cast<Variable*>(p->value); |
62 } | 62 } |
63 return NULL; | 63 return NULL; |
64 } | 64 } |
65 | 65 |
66 | 66 |
67 // ---------------------------------------------------------------------------- | 67 // ---------------------------------------------------------------------------- |
68 // Implementation of Scope | 68 // Implementation of Scope |
69 | 69 |
70 Scope::Scope(Scope* outer_scope, ScopeType scope_type, | 70 Scope::Scope(Isolate* isolate, Zone* zone, Scope* outer_scope, |
71 AstValueFactory* ast_value_factory, Zone* zone) | 71 ScopeType scope_type, AstValueFactory* ast_value_factory) |
72 : isolate_(zone->isolate()), | 72 : isolate_(isolate), |
73 inner_scopes_(4, zone), | 73 inner_scopes_(4, zone), |
74 variables_(zone), | 74 variables_(zone), |
75 internals_(4, zone), | 75 internals_(4, zone), |
76 temps_(4, zone), | 76 temps_(4, zone), |
77 params_(4, zone), | 77 params_(4, zone), |
78 unresolved_(16, zone), | 78 unresolved_(16, zone), |
79 decls_(4, zone), | 79 decls_(4, zone), |
80 interface_(FLAG_harmony_modules && | 80 interface_(FLAG_harmony_modules && (scope_type == MODULE_SCOPE || |
81 (scope_type == MODULE_SCOPE || scope_type == SCRIPT_SCOPE) | 81 scope_type == SCRIPT_SCOPE) |
82 ? Interface::NewModule(zone) : NULL), | 82 ? Interface::NewModule(zone) |
| 83 : NULL), |
83 already_resolved_(false), | 84 already_resolved_(false), |
84 ast_value_factory_(ast_value_factory), | 85 ast_value_factory_(ast_value_factory), |
85 zone_(zone) { | 86 zone_(zone) { |
86 SetDefaults(scope_type, outer_scope, Handle<ScopeInfo>::null()); | 87 SetDefaults(scope_type, outer_scope, Handle<ScopeInfo>::null()); |
87 // The outermost scope must be a script scope. | 88 // The outermost scope must be a script scope. |
88 DCHECK(scope_type == SCRIPT_SCOPE || outer_scope != NULL); | 89 DCHECK(scope_type == SCRIPT_SCOPE || outer_scope != NULL); |
89 DCHECK(!HasIllegalRedeclaration()); | 90 DCHECK(!HasIllegalRedeclaration()); |
90 } | 91 } |
91 | 92 |
92 | 93 |
93 Scope::Scope(Scope* inner_scope, | 94 Scope::Scope(Isolate* isolate, Zone* zone, Scope* inner_scope, |
94 ScopeType scope_type, | 95 ScopeType scope_type, Handle<ScopeInfo> scope_info, |
95 Handle<ScopeInfo> scope_info, | 96 AstValueFactory* value_factory) |
96 AstValueFactory* value_factory, | 97 : isolate_(isolate), |
97 Zone* zone) | |
98 : isolate_(zone->isolate()), | |
99 inner_scopes_(4, zone), | 98 inner_scopes_(4, zone), |
100 variables_(zone), | 99 variables_(zone), |
101 internals_(4, zone), | 100 internals_(4, zone), |
102 temps_(4, zone), | 101 temps_(4, zone), |
103 params_(4, zone), | 102 params_(4, zone), |
104 unresolved_(16, zone), | 103 unresolved_(16, zone), |
105 decls_(4, zone), | 104 decls_(4, zone), |
106 interface_(NULL), | 105 interface_(NULL), |
107 already_resolved_(true), | 106 already_resolved_(true), |
108 ast_value_factory_(value_factory), | 107 ast_value_factory_(value_factory), |
109 zone_(zone) { | 108 zone_(zone) { |
110 SetDefaults(scope_type, NULL, scope_info); | 109 SetDefaults(scope_type, NULL, scope_info); |
111 if (!scope_info.is_null()) { | 110 if (!scope_info.is_null()) { |
112 num_heap_slots_ = scope_info_->ContextLength(); | 111 num_heap_slots_ = scope_info_->ContextLength(); |
113 } | 112 } |
114 // Ensure at least MIN_CONTEXT_SLOTS to indicate a materialized context. | 113 // Ensure at least MIN_CONTEXT_SLOTS to indicate a materialized context. |
115 num_heap_slots_ = Max(num_heap_slots_, | 114 num_heap_slots_ = Max(num_heap_slots_, |
116 static_cast<int>(Context::MIN_CONTEXT_SLOTS)); | 115 static_cast<int>(Context::MIN_CONTEXT_SLOTS)); |
117 AddInnerScope(inner_scope); | 116 AddInnerScope(inner_scope); |
118 } | 117 } |
119 | 118 |
120 | 119 |
121 Scope::Scope(Scope* inner_scope, const AstRawString* catch_variable_name, | 120 Scope::Scope(Isolate* isolate, Zone* zone, Scope* inner_scope, |
122 AstValueFactory* value_factory, Zone* zone) | 121 const AstRawString* catch_variable_name, |
123 : isolate_(zone->isolate()), | 122 AstValueFactory* value_factory) |
| 123 : isolate_(isolate), |
124 inner_scopes_(1, zone), | 124 inner_scopes_(1, zone), |
125 variables_(zone), | 125 variables_(zone), |
126 internals_(0, zone), | 126 internals_(0, zone), |
127 temps_(0, zone), | 127 temps_(0, zone), |
128 params_(0, zone), | 128 params_(0, zone), |
129 unresolved_(0, zone), | 129 unresolved_(0, zone), |
130 decls_(0, zone), | 130 decls_(0, zone), |
131 interface_(NULL), | 131 interface_(NULL), |
132 already_resolved_(true), | 132 already_resolved_(true), |
133 ast_value_factory_(value_factory), | 133 ast_value_factory_(value_factory), |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 scope_info_ = scope_info; | 185 scope_info_ = scope_info; |
186 start_position_ = RelocInfo::kNoPosition; | 186 start_position_ = RelocInfo::kNoPosition; |
187 end_position_ = RelocInfo::kNoPosition; | 187 end_position_ = RelocInfo::kNoPosition; |
188 if (!scope_info.is_null()) { | 188 if (!scope_info.is_null()) { |
189 scope_calls_eval_ = scope_info->CallsEval(); | 189 scope_calls_eval_ = scope_info->CallsEval(); |
190 strict_mode_ = scope_info->strict_mode(); | 190 strict_mode_ = scope_info->strict_mode(); |
191 } | 191 } |
192 } | 192 } |
193 | 193 |
194 | 194 |
195 Scope* Scope::DeserializeScopeChain(Context* context, Scope* script_scope, | 195 Scope* Scope::DeserializeScopeChain(Isolate* isolate, Zone* zone, |
196 Zone* zone) { | 196 Context* context, Scope* script_scope) { |
197 // Reconstruct the outer scope chain from a closure's context chain. | 197 // Reconstruct the outer scope chain from a closure's context chain. |
198 Scope* current_scope = NULL; | 198 Scope* current_scope = NULL; |
199 Scope* innermost_scope = NULL; | 199 Scope* innermost_scope = NULL; |
200 bool contains_with = false; | 200 bool contains_with = false; |
201 while (!context->IsNativeContext()) { | 201 while (!context->IsNativeContext()) { |
202 if (context->IsWithContext()) { | 202 if (context->IsWithContext()) { |
203 Scope* with_scope = new(zone) Scope(current_scope, | 203 Scope* with_scope = new (zone) |
204 WITH_SCOPE, | 204 Scope(isolate, zone, current_scope, WITH_SCOPE, |
205 Handle<ScopeInfo>::null(), | 205 Handle<ScopeInfo>::null(), script_scope->ast_value_factory_); |
206 script_scope->ast_value_factory_, | |
207 zone); | |
208 current_scope = with_scope; | 206 current_scope = with_scope; |
209 // All the inner scopes are inside a with. | 207 // All the inner scopes are inside a with. |
210 contains_with = true; | 208 contains_with = true; |
211 for (Scope* s = innermost_scope; s != NULL; s = s->outer_scope()) { | 209 for (Scope* s = innermost_scope; s != NULL; s = s->outer_scope()) { |
212 s->scope_inside_with_ = true; | 210 s->scope_inside_with_ = true; |
213 } | 211 } |
214 } else if (context->IsScriptContext()) { | 212 } else if (context->IsScriptContext()) { |
215 ScopeInfo* scope_info = ScopeInfo::cast(context->extension()); | 213 ScopeInfo* scope_info = ScopeInfo::cast(context->extension()); |
216 current_scope = new(zone) Scope(current_scope, | 214 current_scope = new (zone) Scope( |
217 SCRIPT_SCOPE, | 215 isolate, zone, current_scope, SCRIPT_SCOPE, |
218 Handle<ScopeInfo>(scope_info), | 216 Handle<ScopeInfo>(scope_info), script_scope->ast_value_factory_); |
219 script_scope->ast_value_factory_, | |
220 zone); | |
221 } else if (context->IsModuleContext()) { | 217 } else if (context->IsModuleContext()) { |
222 ScopeInfo* scope_info = ScopeInfo::cast(context->module()->scope_info()); | 218 ScopeInfo* scope_info = ScopeInfo::cast(context->module()->scope_info()); |
223 current_scope = new(zone) Scope(current_scope, | 219 current_scope = new (zone) Scope( |
224 MODULE_SCOPE, | 220 isolate, zone, current_scope, MODULE_SCOPE, |
225 Handle<ScopeInfo>(scope_info), | 221 Handle<ScopeInfo>(scope_info), script_scope->ast_value_factory_); |
226 script_scope->ast_value_factory_, | |
227 zone); | |
228 } else if (context->IsFunctionContext()) { | 222 } else if (context->IsFunctionContext()) { |
229 ScopeInfo* scope_info = context->closure()->shared()->scope_info(); | 223 ScopeInfo* scope_info = context->closure()->shared()->scope_info(); |
230 current_scope = new(zone) Scope(current_scope, | 224 current_scope = new (zone) Scope( |
231 FUNCTION_SCOPE, | 225 isolate, zone, current_scope, FUNCTION_SCOPE, |
232 Handle<ScopeInfo>(scope_info), | 226 Handle<ScopeInfo>(scope_info), script_scope->ast_value_factory_); |
233 script_scope->ast_value_factory_, | |
234 zone); | |
235 if (scope_info->IsAsmFunction()) current_scope->asm_function_ = true; | 227 if (scope_info->IsAsmFunction()) current_scope->asm_function_ = true; |
236 if (scope_info->IsAsmModule()) current_scope->asm_module_ = true; | 228 if (scope_info->IsAsmModule()) current_scope->asm_module_ = true; |
237 } else if (context->IsBlockContext()) { | 229 } else if (context->IsBlockContext()) { |
238 ScopeInfo* scope_info = ScopeInfo::cast(context->extension()); | 230 ScopeInfo* scope_info = ScopeInfo::cast(context->extension()); |
239 current_scope = new(zone) Scope(current_scope, | 231 current_scope = new (zone) Scope( |
240 BLOCK_SCOPE, | 232 isolate, zone, current_scope, BLOCK_SCOPE, |
241 Handle<ScopeInfo>(scope_info), | 233 Handle<ScopeInfo>(scope_info), script_scope->ast_value_factory_); |
242 script_scope->ast_value_factory_, | |
243 zone); | |
244 } else { | 234 } else { |
245 DCHECK(context->IsCatchContext()); | 235 DCHECK(context->IsCatchContext()); |
246 String* name = String::cast(context->extension()); | 236 String* name = String::cast(context->extension()); |
247 current_scope = new (zone) Scope( | 237 current_scope = new (zone) Scope( |
248 current_scope, | 238 isolate, zone, current_scope, |
249 script_scope->ast_value_factory_->GetString(Handle<String>(name)), | 239 script_scope->ast_value_factory_->GetString(Handle<String>(name)), |
250 script_scope->ast_value_factory_, zone); | 240 script_scope->ast_value_factory_); |
251 } | 241 } |
252 if (contains_with) current_scope->RecordWithStatement(); | 242 if (contains_with) current_scope->RecordWithStatement(); |
253 if (innermost_scope == NULL) innermost_scope = current_scope; | 243 if (innermost_scope == NULL) innermost_scope = current_scope; |
254 | 244 |
255 // Forget about a with when we move to a context for a different function. | 245 // Forget about a with when we move to a context for a different function. |
256 if (context->previous()->closure() != context->closure()) { | 246 if (context->previous()->closure() != context->closure()) { |
257 contains_with = false; | 247 contains_with = false; |
258 } | 248 } |
259 context = context->previous(); | 249 context = context->previous(); |
260 } | 250 } |
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
751 Scope* scope = this; | 741 Scope* scope = this; |
752 while (!scope->is_declaration_scope()) { | 742 while (!scope->is_declaration_scope()) { |
753 scope = scope->outer_scope(); | 743 scope = scope->outer_scope(); |
754 } | 744 } |
755 return scope; | 745 return scope; |
756 } | 746 } |
757 | 747 |
758 | 748 |
759 Handle<ScopeInfo> Scope::GetScopeInfo() { | 749 Handle<ScopeInfo> Scope::GetScopeInfo() { |
760 if (scope_info_.is_null()) { | 750 if (scope_info_.is_null()) { |
761 scope_info_ = ScopeInfo::Create(this, zone()); | 751 scope_info_ = ScopeInfo::Create(isolate(), zone(), this); |
762 } | 752 } |
763 return scope_info_; | 753 return scope_info_; |
764 } | 754 } |
765 | 755 |
766 | 756 |
767 void Scope::GetNestedScopeChain( | 757 void Scope::GetNestedScopeChain( |
768 List<Handle<ScopeInfo> >* chain, | 758 List<Handle<ScopeInfo> >* chain, |
769 int position) { | 759 int position) { |
770 if (!is_eval_scope()) chain->Add(Handle<ScopeInfo>(GetScopeInfo())); | 760 if (!is_eval_scope()) chain->Add(Handle<ScopeInfo>(GetScopeInfo())); |
771 | 761 |
(...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1433 } | 1423 } |
1434 | 1424 |
1435 | 1425 |
1436 int Scope::ContextLocalCount() const { | 1426 int Scope::ContextLocalCount() const { |
1437 if (num_heap_slots() == 0) return 0; | 1427 if (num_heap_slots() == 0) return 0; |
1438 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - | 1428 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - |
1439 (function_ != NULL && function_->proxy()->var()->IsContextSlot() ? 1 : 0); | 1429 (function_ != NULL && function_->proxy()->var()->IsContextSlot() ? 1 : 0); |
1440 } | 1430 } |
1441 | 1431 |
1442 } } // namespace v8::internal | 1432 } } // namespace v8::internal |
OLD | NEW |