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/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 DeclarationScope::DeclarationScope(Zone* zone, ScopeType scope_type, | 216 DeclarationScope::DeclarationScope(Zone* zone, ScopeType scope_type, |
217 Handle<ScopeInfo> scope_info) | 217 Handle<ScopeInfo> scope_info) |
218 : Scope(zone, scope_type, scope_info), | 218 : Scope(zone, scope_type, scope_info), |
219 function_kind_(scope_info->function_kind()), | 219 function_kind_(scope_info->function_kind()), |
220 params_(0, zone), | 220 params_(0, zone), |
221 sloppy_block_function_map_(zone) { | 221 sloppy_block_function_map_(zone) { |
222 DCHECK_NE(scope_type, SCRIPT_SCOPE); | 222 DCHECK_NE(scope_type, SCRIPT_SCOPE); |
223 SetDefaults(); | 223 SetDefaults(); |
224 } | 224 } |
225 | 225 |
226 Scope::Scope(Zone* zone, const AstRawString* catch_variable_name) | 226 Scope::Scope(Zone* zone, const AstRawString* catch_variable_name, |
| 227 Handle<ScopeInfo> scope_info) |
227 : zone_(zone), | 228 : zone_(zone), |
228 outer_scope_(nullptr), | 229 outer_scope_(nullptr), |
229 variables_(zone), | 230 variables_(zone), |
230 locals_(0, zone), | 231 locals_(0, zone), |
231 decls_(0, zone), | 232 decls_(0, zone), |
| 233 scope_info_(scope_info), |
232 scope_type_(CATCH_SCOPE) { | 234 scope_type_(CATCH_SCOPE) { |
233 SetDefaults(); | 235 SetDefaults(); |
234 #ifdef DEBUG | 236 #ifdef DEBUG |
235 already_resolved_ = true; | 237 already_resolved_ = true; |
236 #endif | 238 #endif |
| 239 // Cache the catch variable, even though it's also available via the |
| 240 // scope_info, as the parser expects that a catch scope always has the catch |
| 241 // variable as first and only variable. |
237 Variable* variable = Declare(zone, this, catch_variable_name, VAR, | 242 Variable* variable = Declare(zone, this, catch_variable_name, VAR, |
238 Variable::NORMAL, kCreatedInitialized); | 243 Variable::NORMAL, kCreatedInitialized); |
239 AllocateHeapSlot(variable); | 244 AllocateHeapSlot(variable); |
240 } | 245 } |
241 | 246 |
242 void DeclarationScope::SetDefaults() { | 247 void DeclarationScope::SetDefaults() { |
243 is_declaration_scope_ = true; | 248 is_declaration_scope_ = true; |
244 has_simple_parameters_ = true; | 249 has_simple_parameters_ = true; |
245 asm_module_ = false; | 250 asm_module_ = false; |
246 asm_function_ = false; | 251 asm_function_ = false; |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 } | 365 } |
361 } else if (context->IsModuleContext()) { | 366 } else if (context->IsModuleContext()) { |
362 ScopeInfo* scope_info = context->closure()->shared()->scope_info(); | 367 ScopeInfo* scope_info = context->closure()->shared()->scope_info(); |
363 DCHECK_EQ(scope_info->scope_type(), MODULE_SCOPE); | 368 DCHECK_EQ(scope_info->scope_type(), MODULE_SCOPE); |
364 outer_scope = new (zone) ModuleScope( | 369 outer_scope = new (zone) ModuleScope( |
365 isolate, Handle<ScopeInfo>(scope_info), ast_value_factory); | 370 isolate, Handle<ScopeInfo>(scope_info), ast_value_factory); |
366 } else { | 371 } else { |
367 DCHECK(context->IsCatchContext()); | 372 DCHECK(context->IsCatchContext()); |
368 String* name = context->catch_name(); | 373 String* name = context->catch_name(); |
369 outer_scope = new (zone) | 374 outer_scope = new (zone) |
370 Scope(zone, ast_value_factory->GetString(handle(name, isolate))); | 375 Scope(zone, ast_value_factory->GetString(handle(name, isolate)), |
| 376 Handle<ScopeInfo>(context->scope_info())); |
371 } | 377 } |
372 if (current_scope != nullptr) { | 378 if (current_scope != nullptr) { |
373 outer_scope->AddInnerScope(current_scope); | 379 outer_scope->AddInnerScope(current_scope); |
374 } | 380 } |
375 current_scope = outer_scope; | 381 current_scope = outer_scope; |
376 if (deserialization_mode == DeserializationMode::kDeserializeOffHeap) { | 382 if (deserialization_mode == DeserializationMode::kDeserializeOffHeap) { |
377 current_scope->DeserializeScopeInfo(isolate, ast_value_factory); | 383 current_scope->DeserializeScopeInfo(isolate, ast_value_factory); |
378 } | 384 } |
379 if (innermost_scope == nullptr) innermost_scope = current_scope; | 385 if (innermost_scope == nullptr) innermost_scope = current_scope; |
380 context = context->previous(); | 386 context = context->previous(); |
(...skipping 1306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1687 Variable* function = | 1693 Variable* function = |
1688 is_function_scope() ? AsDeclarationScope()->function_var() : nullptr; | 1694 is_function_scope() ? AsDeclarationScope()->function_var() : nullptr; |
1689 bool is_function_var_in_context = | 1695 bool is_function_var_in_context = |
1690 function != nullptr && function->IsContextSlot(); | 1696 function != nullptr && function->IsContextSlot(); |
1691 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - | 1697 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - |
1692 (is_function_var_in_context ? 1 : 0); | 1698 (is_function_var_in_context ? 1 : 0); |
1693 } | 1699 } |
1694 | 1700 |
1695 } // namespace internal | 1701 } // namespace internal |
1696 } // namespace v8 | 1702 } // namespace v8 |
OLD | NEW |