| 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/scopes.h" | 5 #include "src/scopes.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
| 9 #include "src/messages.h" | 9 #include "src/messages.h" |
| 10 #include "src/parser.h" | 10 #include "src/parser.h" |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 | 317 |
| 318 if (native ? FLAG_print_builtin_scopes : FLAG_print_scopes) scope->Print(); | 318 if (native ? FLAG_print_builtin_scopes : FLAG_print_scopes) scope->Print(); |
| 319 #endif | 319 #endif |
| 320 | 320 |
| 321 info->set_scope(scope); | 321 info->set_scope(scope); |
| 322 return true; | 322 return true; |
| 323 } | 323 } |
| 324 | 324 |
| 325 | 325 |
| 326 void Scope::Initialize() { | 326 void Scope::Initialize() { |
| 327 bool subclass_constructor = IsSubclassConstructor(function_kind_); | |
| 328 DCHECK(!already_resolved()); | 327 DCHECK(!already_resolved()); |
| 329 | 328 |
| 330 // Add this scope as a new inner scope of the outer scope. | 329 // Add this scope as a new inner scope of the outer scope. |
| 331 if (outer_scope_ != NULL) { | 330 if (outer_scope_ != NULL) { |
| 332 outer_scope_->inner_scopes_.Add(this, zone()); | 331 outer_scope_->inner_scopes_.Add(this, zone()); |
| 333 scope_inside_with_ = outer_scope_->scope_inside_with_ || is_with_scope(); | 332 scope_inside_with_ = outer_scope_->scope_inside_with_ || is_with_scope(); |
| 334 } else { | 333 } else { |
| 335 scope_inside_with_ = is_with_scope(); | 334 scope_inside_with_ = is_with_scope(); |
| 336 } | 335 } |
| 337 | 336 |
| 338 // Declare convenience variables and the receiver. | 337 // Declare convenience variables and the receiver. |
| 339 if (is_declaration_scope() && has_this_declaration()) { | 338 if (is_declaration_scope() && has_this_declaration()) { |
| 339 bool subclass_constructor = IsSubclassConstructor(function_kind_); |
| 340 Variable* var = variables_.Declare( | 340 Variable* var = variables_.Declare( |
| 341 this, ast_value_factory_->this_string(), | 341 this, ast_value_factory_->this_string(), |
| 342 subclass_constructor ? CONST : VAR, Variable::THIS, | 342 subclass_constructor ? CONST : VAR, Variable::THIS, |
| 343 subclass_constructor ? kNeedsInitialization : kCreatedInitialized); | 343 subclass_constructor ? kNeedsInitialization : kCreatedInitialized); |
| 344 receiver_ = var; | 344 receiver_ = var; |
| 345 } | 345 } |
| 346 | 346 |
| 347 if (is_function_scope() && !is_arrow_scope()) { | 347 if (is_function_scope() && !is_arrow_scope()) { |
| 348 // Declare 'arguments' variable which exists in all non arrow functions. | 348 // Declare 'arguments' variable which exists in all non arrow functions. |
| 349 // Note that it might never be accessed, in which case it won't be | 349 // Note that it might never be accessed, in which case it won't be |
| 350 // allocated during variable allocation. | 350 // allocated during variable allocation. |
| 351 variables_.Declare(this, ast_value_factory_->arguments_string(), VAR, | 351 variables_.Declare(this, ast_value_factory_->arguments_string(), VAR, |
| 352 Variable::ARGUMENTS, kCreatedInitialized); | 352 Variable::ARGUMENTS, kCreatedInitialized); |
| 353 | 353 |
| 354 if (subclass_constructor || FLAG_harmony_new_target) { | 354 variables_.Declare(this, ast_value_factory_->new_target_string(), CONST, |
| 355 variables_.Declare(this, ast_value_factory_->new_target_string(), CONST, | 355 Variable::NORMAL, kCreatedInitialized); |
| 356 Variable::NORMAL, kCreatedInitialized); | |
| 357 } | |
| 358 | 356 |
| 359 if (IsConciseMethod(function_kind_) || IsClassConstructor(function_kind_) || | 357 if (IsConciseMethod(function_kind_) || IsClassConstructor(function_kind_) || |
| 360 IsAccessorFunction(function_kind_)) { | 358 IsAccessorFunction(function_kind_)) { |
| 361 variables_.Declare(this, ast_value_factory_->this_function_string(), | 359 variables_.Declare(this, ast_value_factory_->this_function_string(), |
| 362 CONST, Variable::NORMAL, kCreatedInitialized); | 360 CONST, Variable::NORMAL, kCreatedInitialized); |
| 363 } | 361 } |
| 364 } | 362 } |
| 365 } | 363 } |
| 366 | 364 |
| 367 | 365 |
| (...skipping 1284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1652 function_ != NULL && function_->proxy()->var()->IsContextSlot(); | 1650 function_ != NULL && function_->proxy()->var()->IsContextSlot(); |
| 1653 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - | 1651 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - |
| 1654 (is_function_var_in_context ? 1 : 0); | 1652 (is_function_var_in_context ? 1 : 0); |
| 1655 } | 1653 } |
| 1656 | 1654 |
| 1657 | 1655 |
| 1658 int Scope::ContextGlobalCount() const { return num_global_slots(); } | 1656 int Scope::ContextGlobalCount() const { return num_global_slots(); } |
| 1659 | 1657 |
| 1660 } // namespace internal | 1658 } // namespace internal |
| 1661 } // namespace v8 | 1659 } // namespace v8 |
| OLD | NEW |