Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(151)

Side by Side Diff: src/ast/scopes.cc

Issue 2223773002: Move zone_ to Scope (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ast/scopes.h ('k') | src/parsing/parser.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
11 #include "src/messages.h" 11 #include "src/messages.h"
12 #include "src/parsing/parser.h" // for ParseInfo 12 #include "src/parsing/parser.h" // for ParseInfo
13 13
14 namespace v8 { 14 namespace v8 {
15 namespace internal { 15 namespace internal {
16 16
17 // ---------------------------------------------------------------------------- 17 // ----------------------------------------------------------------------------
18 // Implementation of LocalsMap 18 // Implementation of LocalsMap
19 // 19 //
20 // Note: We are storing the handle locations as key values in the hash map. 20 // Note: We are storing the handle locations as key values in the hash map.
21 // When inserting a new variable via Declare(), we rely on the fact that 21 // When inserting a new variable via Declare(), we rely on the fact that
22 // the handle location remains alive for the duration of that variable 22 // the handle location remains alive for the duration of that variable
23 // use. Because a Variable holding a handle with the same location exists 23 // use. Because a Variable holding a handle with the same location exists
24 // this is ensured. 24 // this is ensured.
25 25
26 VariableMap::VariableMap(Zone* zone) 26 VariableMap::VariableMap(Zone* zone)
27 : ZoneHashMap(ZoneHashMap::PointersMatch, 8, ZoneAllocationPolicy(zone)), 27 : ZoneHashMap(ZoneHashMap::PointersMatch, 8, ZoneAllocationPolicy(zone)) {}
28 zone_(zone) {}
29 VariableMap::~VariableMap() {}
30 28
31 Variable* VariableMap::Declare(Scope* scope, const AstRawString* name, 29 Variable* VariableMap::Declare(Zone* zone, Scope* scope,
32 VariableMode mode, Variable::Kind kind, 30 const AstRawString* name, VariableMode mode,
31 Variable::Kind kind,
33 InitializationFlag initialization_flag, 32 InitializationFlag initialization_flag,
34 MaybeAssignedFlag maybe_assigned_flag) { 33 MaybeAssignedFlag maybe_assigned_flag) {
35 // AstRawStrings are unambiguous, i.e., the same string is always represented 34 // AstRawStrings are unambiguous, i.e., the same string is always represented
36 // by the same AstRawString*. 35 // by the same AstRawString*.
37 // FIXME(marja): fix the type of Lookup. 36 // FIXME(marja): fix the type of Lookup.
38 Entry* p = 37 Entry* p =
39 ZoneHashMap::LookupOrInsert(const_cast<AstRawString*>(name), name->hash(), 38 ZoneHashMap::LookupOrInsert(const_cast<AstRawString*>(name), name->hash(),
40 ZoneAllocationPolicy(zone())); 39 ZoneAllocationPolicy(zone));
41 if (p->value == NULL) { 40 if (p->value == NULL) {
42 // The variable has not been declared yet -> insert it. 41 // The variable has not been declared yet -> insert it.
43 DCHECK(p->key == name); 42 DCHECK(p->key == name);
44 p->value = new (zone()) Variable(scope, name, mode, kind, 43 p->value = new (zone) Variable(scope, name, mode, kind, initialization_flag,
45 initialization_flag, maybe_assigned_flag); 44 maybe_assigned_flag);
46 } 45 }
47 return reinterpret_cast<Variable*>(p->value); 46 return reinterpret_cast<Variable*>(p->value);
48 } 47 }
49 48
50 49
51 Variable* VariableMap::Lookup(const AstRawString* name) { 50 Variable* VariableMap::Lookup(const AstRawString* name) {
52 Entry* p = ZoneHashMap::Lookup(const_cast<AstRawString*>(name), name->hash()); 51 Entry* p = ZoneHashMap::Lookup(const_cast<AstRawString*>(name), name->hash());
53 if (p != NULL) { 52 if (p != NULL) {
54 DCHECK(reinterpret_cast<const AstRawString*>(p->key) == name); 53 DCHECK(reinterpret_cast<const AstRawString*>(p->key) == name);
55 DCHECK(p->value != NULL); 54 DCHECK(p->value != NULL);
56 return reinterpret_cast<Variable*>(p->value); 55 return reinterpret_cast<Variable*>(p->value);
57 } 56 }
58 return NULL; 57 return NULL;
59 } 58 }
60 59
60 SloppyBlockFunctionMap::SloppyBlockFunctionMap(Zone* zone)
61 : ZoneHashMap(ZoneHashMap::PointersMatch, 8, ZoneAllocationPolicy(zone)) {}
61 62
62 SloppyBlockFunctionMap::SloppyBlockFunctionMap(Zone* zone) 63 void SloppyBlockFunctionMap::Declare(Zone* zone, const AstRawString* name,
63 : ZoneHashMap(ZoneHashMap::PointersMatch, 8, ZoneAllocationPolicy(zone)),
64 zone_(zone) {}
65 SloppyBlockFunctionMap::~SloppyBlockFunctionMap() {}
66
67
68 void SloppyBlockFunctionMap::Declare(const AstRawString* name,
69 SloppyBlockFunctionStatement* stmt) { 64 SloppyBlockFunctionStatement* stmt) {
70 // AstRawStrings are unambiguous, i.e., the same string is always represented 65 // AstRawStrings are unambiguous, i.e., the same string is always represented
71 // by the same AstRawString*. 66 // by the same AstRawString*.
72 Entry* p = 67 Entry* p =
73 ZoneHashMap::LookupOrInsert(const_cast<AstRawString*>(name), name->hash(), 68 ZoneHashMap::LookupOrInsert(const_cast<AstRawString*>(name), name->hash(),
74 ZoneAllocationPolicy(zone_)); 69 ZoneAllocationPolicy(zone));
75 if (p->value == nullptr) { 70 if (p->value == nullptr) {
76 p->value = new (zone_->New(sizeof(Vector))) Vector(zone_); 71 p->value = new (zone->New(sizeof(Vector))) Vector(zone);
77 } 72 }
78 Vector* delegates = static_cast<Vector*>(p->value); 73 Vector* delegates = static_cast<Vector*>(p->value);
79 delegates->push_back(stmt); 74 delegates->push_back(stmt);
80 } 75 }
81 76
82 77
83 // ---------------------------------------------------------------------------- 78 // ----------------------------------------------------------------------------
84 // Implementation of Scope 79 // Implementation of Scope
85 80
86 Scope::Scope(Zone* zone, Scope* outer_scope, ScopeType scope_type) 81 Scope::Scope(Zone* zone, Scope* outer_scope, ScopeType scope_type)
87 : outer_scope_(outer_scope), 82 : zone_(zone),
83 outer_scope_(outer_scope),
88 variables_(zone), 84 variables_(zone),
89 decls_(4, zone), 85 decls_(4, zone),
90 scope_type_(scope_type), 86 scope_type_(scope_type),
91 already_resolved_(false) { 87 already_resolved_(false) {
92 SetDefaults(); 88 SetDefaults();
93 if (outer_scope == nullptr) { 89 if (outer_scope == nullptr) {
94 // If the outer scope is null, this cannot be a with scope. The outermost 90 // If the outer scope is null, this cannot be a with scope. The outermost
95 // scope must be a script scope. 91 // scope must be a script scope.
96 DCHECK_EQ(SCRIPT_SCOPE, scope_type); 92 DCHECK_EQ(SCRIPT_SCOPE, scope_type);
97 } else { 93 } else {
(...skipping 23 matching lines...) Expand all
121 params_(4, zone), 117 params_(4, zone),
122 sloppy_block_function_map_(zone), 118 sloppy_block_function_map_(zone),
123 module_descriptor_(scope_type == MODULE_SCOPE ? new (zone) 119 module_descriptor_(scope_type == MODULE_SCOPE ? new (zone)
124 ModuleDescriptor(zone) 120 ModuleDescriptor(zone)
125 : NULL) { 121 : NULL) {
126 SetDefaults(); 122 SetDefaults();
127 } 123 }
128 124
129 Scope::Scope(Zone* zone, Scope* inner_scope, ScopeType scope_type, 125 Scope::Scope(Zone* zone, Scope* inner_scope, ScopeType scope_type,
130 Handle<ScopeInfo> scope_info) 126 Handle<ScopeInfo> scope_info)
131 : outer_scope_(nullptr), 127 : zone_(zone),
128 outer_scope_(nullptr),
132 variables_(zone), 129 variables_(zone),
133 decls_(4, zone), 130 decls_(4, zone),
134 scope_info_(scope_info), 131 scope_info_(scope_info),
135 scope_type_(scope_type), 132 scope_type_(scope_type),
136 already_resolved_(true) { 133 already_resolved_(true) {
137 SetDefaults(); 134 SetDefaults();
138 if (!scope_info.is_null()) { 135 if (!scope_info.is_null()) {
139 scope_calls_eval_ = scope_info->CallsEval(); 136 scope_calls_eval_ = scope_info->CallsEval();
140 language_mode_ = scope_info->language_mode(); 137 language_mode_ = scope_info->language_mode();
141 num_heap_slots_ = scope_info_->ContextLength(); 138 num_heap_slots_ = scope_info_->ContextLength();
(...skipping 12 matching lines...) Expand all
154 : scope_info->function_kind()), 151 : scope_info->function_kind()),
155 temps_(4, zone), 152 temps_(4, zone),
156 params_(4, zone), 153 params_(4, zone),
157 sloppy_block_function_map_(zone), 154 sloppy_block_function_map_(zone),
158 module_descriptor_(nullptr) { 155 module_descriptor_(nullptr) {
159 SetDefaults(); 156 SetDefaults();
160 } 157 }
161 158
162 Scope::Scope(Zone* zone, Scope* inner_scope, 159 Scope::Scope(Zone* zone, Scope* inner_scope,
163 const AstRawString* catch_variable_name) 160 const AstRawString* catch_variable_name)
164 : outer_scope_(nullptr), 161 : zone_(zone),
162 outer_scope_(nullptr),
165 variables_(zone), 163 variables_(zone),
166 decls_(0, zone), 164 decls_(0, zone),
167 scope_type_(CATCH_SCOPE), 165 scope_type_(CATCH_SCOPE),
168 already_resolved_(true) { 166 already_resolved_(true) {
169 SetDefaults(); 167 SetDefaults();
170 AddInnerScope(inner_scope); 168 AddInnerScope(inner_scope);
171 num_heap_slots_ = Context::MIN_CONTEXT_SLOTS; 169 num_heap_slots_ = Context::MIN_CONTEXT_SLOTS;
172 Variable* variable = variables_.Declare(this, 170 Variable* variable =
173 catch_variable_name, 171 variables_.Declare(zone, this, catch_variable_name, VAR, Variable::NORMAL,
174 VAR, 172 kCreatedInitialized);
175 Variable::NORMAL,
176 kCreatedInitialized);
177 AllocateHeapSlot(variable); 173 AllocateHeapSlot(variable);
178 } 174 }
179 175
180 void DeclarationScope::SetDefaults() { 176 void DeclarationScope::SetDefaults() {
181 is_declaration_scope_ = true; 177 is_declaration_scope_ = true;
182 has_simple_parameters_ = true; 178 has_simple_parameters_ = true;
183 receiver_ = nullptr; 179 receiver_ = nullptr;
184 new_target_ = nullptr; 180 new_target_ = nullptr;
185 function_ = nullptr; 181 function_ = nullptr;
186 arguments_ = nullptr; 182 arguments_ = nullptr;
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 MaybeAssignedFlag maybe_assigned_flag = 302 MaybeAssignedFlag maybe_assigned_flag =
307 scope_info_->ContextLocalMaybeAssignedFlag(var); 303 scope_info_->ContextLocalMaybeAssignedFlag(var);
308 VariableLocation location = var < scope_info_->ContextLocalCount() 304 VariableLocation location = var < scope_info_->ContextLocalCount()
309 ? VariableLocation::CONTEXT 305 ? VariableLocation::CONTEXT
310 : VariableLocation::GLOBAL; 306 : VariableLocation::GLOBAL;
311 Variable::Kind kind = Variable::NORMAL; 307 Variable::Kind kind = Variable::NORMAL;
312 if (index == scope_info_->ReceiverContextSlotIndex()) { 308 if (index == scope_info_->ReceiverContextSlotIndex()) {
313 kind = Variable::THIS; 309 kind = Variable::THIS;
314 } 310 }
315 311
316 Variable* result = variables_.Declare(this, name, mode, kind, init_flag, 312 Variable* result = variables_.Declare(zone(), this, name, mode, kind,
317 maybe_assigned_flag); 313 init_flag, maybe_assigned_flag);
318 result->AllocateTo(location, index); 314 result->AllocateTo(location, index);
319 } 315 }
320 316
321 // We must read parameters from the end since for multiply declared 317 // We must read parameters from the end since for multiply declared
322 // parameters the value of the last declaration of that parameter is used 318 // parameters the value of the last declaration of that parameter is used
323 // inside a function (and thus we need to look at the last index). Was bug# 319 // inside a function (and thus we need to look at the last index). Was bug#
324 // 1110337. 320 // 1110337.
325 for (int index = scope_info_->ParameterCount() - 1; index >= 0; --index) { 321 for (int index = scope_info_->ParameterCount() - 1; index >= 0; --index) {
326 Handle<String> name_handle(scope_info_->ParameterName(index), isolate); 322 Handle<String> name_handle(scope_info_->ParameterName(index), isolate);
327 const AstRawString* name = ast_value_factory->GetString(name_handle); 323 const AstRawString* name = ast_value_factory->GetString(name_handle);
328 if (!names_seen.insert(name).second) continue; 324 if (!names_seen.insert(name).second) continue;
329 325
330 VariableMode mode = DYNAMIC; 326 VariableMode mode = DYNAMIC;
331 InitializationFlag init_flag = kCreatedInitialized; 327 InitializationFlag init_flag = kCreatedInitialized;
332 MaybeAssignedFlag maybe_assigned_flag = kMaybeAssigned; 328 MaybeAssignedFlag maybe_assigned_flag = kMaybeAssigned;
333 VariableLocation location = VariableLocation::LOOKUP; 329 VariableLocation location = VariableLocation::LOOKUP;
334 Variable::Kind kind = Variable::NORMAL; 330 Variable::Kind kind = Variable::NORMAL;
335 331
336 Variable* result = variables_.Declare(this, name, mode, kind, init_flag, 332 Variable* result = variables_.Declare(zone(), this, name, mode, kind,
337 maybe_assigned_flag); 333 init_flag, maybe_assigned_flag);
338 result->AllocateTo(location, index); 334 result->AllocateTo(location, index);
339 } 335 }
340 336
341 // Internalize function proxy for this scope. 337 // Internalize function proxy for this scope.
342 if (scope_info_->HasFunctionName()) { 338 if (scope_info_->HasFunctionName()) {
343 AstNodeFactory factory(ast_value_factory); 339 AstNodeFactory factory(ast_value_factory);
344 Handle<String> name_handle(scope_info_->FunctionName(), isolate); 340 Handle<String> name_handle(scope_info_->FunctionName(), isolate);
345 const AstRawString* name = ast_value_factory->GetString(name_handle); 341 const AstRawString* name = ast_value_factory->GetString(name_handle);
346 VariableMode mode; 342 VariableMode mode;
347 int index = scope_info_->FunctionContextSlotIndex(*name_handle, &mode); 343 int index = scope_info_->FunctionContextSlotIndex(*name_handle, &mode);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 #endif 397 #endif
402 } 398 }
403 399
404 void DeclarationScope::DeclareThis(AstValueFactory* ast_value_factory) { 400 void DeclarationScope::DeclareThis(AstValueFactory* ast_value_factory) {
405 DCHECK(!already_resolved()); 401 DCHECK(!already_resolved());
406 DCHECK(is_declaration_scope()); 402 DCHECK(is_declaration_scope());
407 DCHECK(has_this_declaration()); 403 DCHECK(has_this_declaration());
408 404
409 bool subclass_constructor = IsSubclassConstructor(function_kind_); 405 bool subclass_constructor = IsSubclassConstructor(function_kind_);
410 Variable* var = variables_.Declare( 406 Variable* var = variables_.Declare(
411 this, ast_value_factory->this_string(), 407 zone(), this, ast_value_factory->this_string(),
412 subclass_constructor ? CONST : VAR, Variable::THIS, 408 subclass_constructor ? CONST : VAR, Variable::THIS,
413 subclass_constructor ? kNeedsInitialization : kCreatedInitialized); 409 subclass_constructor ? kNeedsInitialization : kCreatedInitialized);
414 receiver_ = var; 410 receiver_ = var;
415 } 411 }
416 412
417 void DeclarationScope::DeclareDefaultFunctionVariables( 413 void DeclarationScope::DeclareDefaultFunctionVariables(
418 AstValueFactory* ast_value_factory) { 414 AstValueFactory* ast_value_factory) {
419 DCHECK(is_function_scope()); 415 DCHECK(is_function_scope());
420 DCHECK(!is_arrow_scope()); 416 DCHECK(!is_arrow_scope());
421 // Declare 'arguments' variable which exists in all non arrow functions. 417 // Declare 'arguments' variable which exists in all non arrow functions.
422 // Note that it might never be accessed, in which case it won't be 418 // Note that it might never be accessed, in which case it won't be
423 // allocated during variable allocation. 419 // allocated during variable allocation.
424 arguments_ = 420 arguments_ =
425 variables_.Declare(this, ast_value_factory->arguments_string(), VAR, 421 variables_.Declare(zone(), this, ast_value_factory->arguments_string(),
426 Variable::ARGUMENTS, kCreatedInitialized); 422 VAR, Variable::ARGUMENTS, kCreatedInitialized);
427 423
428 new_target_ = 424 new_target_ =
429 variables_.Declare(this, ast_value_factory->new_target_string(), CONST, 425 variables_.Declare(zone(), this, ast_value_factory->new_target_string(),
430 Variable::NORMAL, kCreatedInitialized); 426 CONST, Variable::NORMAL, kCreatedInitialized);
431 427
432 if (IsConciseMethod(function_kind_) || IsClassConstructor(function_kind_) || 428 if (IsConciseMethod(function_kind_) || IsClassConstructor(function_kind_) ||
433 IsAccessorFunction(function_kind_)) { 429 IsAccessorFunction(function_kind_)) {
434 this_function_ = 430 this_function_ = variables_.Declare(
435 variables_.Declare(this, ast_value_factory->this_function_string(), 431 zone(), this, ast_value_factory->this_function_string(), CONST,
436 CONST, Variable::NORMAL, kCreatedInitialized); 432 Variable::NORMAL, kCreatedInitialized);
437 } 433 }
438 } 434 }
439 435
440 436
441 Scope* Scope::FinalizeBlockScope() { 437 Scope* Scope::FinalizeBlockScope() {
442 DCHECK(is_block_scope()); 438 DCHECK(is_block_scope());
443 439
444 if (variables_.occupancy() > 0 || 440 if (variables_.occupancy() > 0 ||
445 (is_declaration_scope() && calls_sloppy_eval())) { 441 (is_declaration_scope() && calls_sloppy_eval())) {
446 return this; 442 return this;
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
591 } 587 }
592 588
593 Variable::Kind kind = Variable::NORMAL; 589 Variable::Kind kind = Variable::NORMAL;
594 if (location == VariableLocation::CONTEXT && 590 if (location == VariableLocation::CONTEXT &&
595 index == scope_info_->ReceiverContextSlotIndex()) { 591 index == scope_info_->ReceiverContextSlotIndex()) {
596 kind = Variable::THIS; 592 kind = Variable::THIS;
597 } 593 }
598 // TODO(marja, rossberg): Correctly declare FUNCTION, CLASS, NEW_TARGET, and 594 // TODO(marja, rossberg): Correctly declare FUNCTION, CLASS, NEW_TARGET, and
599 // ARGUMENTS bindings as their corresponding Variable::Kind. 595 // ARGUMENTS bindings as their corresponding Variable::Kind.
600 596
601 Variable* var = variables_.Declare(this, name, mode, kind, init_flag, 597 Variable* var = variables_.Declare(zone(), this, name, mode, kind, init_flag,
602 maybe_assigned_flag); 598 maybe_assigned_flag);
603 var->AllocateTo(location, index); 599 var->AllocateTo(location, index);
604 return var; 600 return var;
605 } 601 }
606 602
607 Variable* DeclarationScope::LookupFunctionVar(const AstRawString* name, 603 Variable* DeclarationScope::LookupFunctionVar(const AstRawString* name,
608 AstNodeFactory* factory) { 604 AstNodeFactory* factory) {
609 if (function_ != NULL && function_->proxy()->raw_name() == name) { 605 if (function_ != NULL && function_->proxy()->raw_name() == name) {
610 return function_->proxy()->var(); 606 return function_->proxy()->var();
611 } else if (!scope_info_.is_null()) { 607 } else if (!scope_info_.is_null()) {
(...skipping 30 matching lines...) Expand all
642 Variable* DeclarationScope::DeclareParameter( 638 Variable* DeclarationScope::DeclareParameter(
643 const AstRawString* name, VariableMode mode, bool is_optional, bool is_rest, 639 const AstRawString* name, VariableMode mode, bool is_optional, bool is_rest,
644 bool* is_duplicate, AstValueFactory* ast_value_factory) { 640 bool* is_duplicate, AstValueFactory* ast_value_factory) {
645 DCHECK(!already_resolved()); 641 DCHECK(!already_resolved());
646 DCHECK(is_function_scope()); 642 DCHECK(is_function_scope());
647 DCHECK(!is_optional || !is_rest); 643 DCHECK(!is_optional || !is_rest);
648 Variable* var; 644 Variable* var;
649 if (mode == TEMPORARY) { 645 if (mode == TEMPORARY) {
650 var = NewTemporary(name); 646 var = NewTemporary(name);
651 } else { 647 } else {
652 var = variables_.Declare(this, name, mode, Variable::NORMAL, 648 var = variables_.Declare(zone(), this, name, mode, Variable::NORMAL,
653 kCreatedInitialized); 649 kCreatedInitialized);
654 // TODO(wingo): Avoid O(n^2) check. 650 // TODO(wingo): Avoid O(n^2) check.
655 *is_duplicate = IsDeclaredParameter(name); 651 *is_duplicate = IsDeclaredParameter(name);
656 } 652 }
657 if (!is_optional && !is_rest && arity_ == params_.length()) { 653 if (!is_optional && !is_rest && arity_ == params_.length()) {
658 ++arity_; 654 ++arity_;
659 } 655 }
660 if (is_rest) { 656 if (is_rest) {
661 DCHECK_NULL(rest_parameter_); 657 DCHECK_NULL(rest_parameter_);
662 rest_parameter_ = var; 658 rest_parameter_ = var;
663 rest_index_ = num_parameters(); 659 rest_index_ = num_parameters();
664 } 660 }
665 params_.Add(var, zone()); 661 params_.Add(var, zone());
666 if (name == ast_value_factory->arguments_string()) { 662 if (name == ast_value_factory->arguments_string()) {
667 has_arguments_parameter_ = true; 663 has_arguments_parameter_ = true;
668 } 664 }
669 return var; 665 return var;
670 } 666 }
671 667
672 Variable* Scope::DeclareLocal(const AstRawString* name, VariableMode mode, 668 Variable* Scope::DeclareLocal(const AstRawString* name, VariableMode mode,
673 InitializationFlag init_flag, Variable::Kind kind, 669 InitializationFlag init_flag, Variable::Kind kind,
674 MaybeAssignedFlag maybe_assigned_flag) { 670 MaybeAssignedFlag maybe_assigned_flag) {
675 DCHECK(!already_resolved()); 671 DCHECK(!already_resolved());
676 // This function handles VAR, LET, and CONST modes. DYNAMIC variables are 672 // This function handles VAR, LET, and CONST modes. DYNAMIC variables are
677 // introduced during variable allocation, and TEMPORARY variables are 673 // introduced during variable allocation, and TEMPORARY variables are
678 // allocated via NewTemporary(). 674 // allocated via NewTemporary().
679 DCHECK(IsDeclaredVariableMode(mode)); 675 DCHECK(IsDeclaredVariableMode(mode));
680 return variables_.Declare(this, name, mode, kind, init_flag, 676 return variables_.Declare(zone(), this, name, mode, kind, init_flag,
681 maybe_assigned_flag); 677 maybe_assigned_flag);
682 } 678 }
683 679
684 Variable* DeclarationScope::DeclareDynamicGlobal(const AstRawString* name) { 680 Variable* DeclarationScope::DeclareDynamicGlobal(const AstRawString* name) {
685 DCHECK(is_script_scope()); 681 DCHECK(is_script_scope());
686 return variables_.Declare(this, 682 return variables_.Declare(zone(), this, name, DYNAMIC_GLOBAL,
687 name, 683 Variable::NORMAL, kCreatedInitialized);
688 DYNAMIC_GLOBAL,
689 Variable::NORMAL,
690 kCreatedInitialized);
691 } 684 }
692 685
693 686
694 bool Scope::RemoveUnresolved(VariableProxy* var) { 687 bool Scope::RemoveUnresolved(VariableProxy* var) {
695 if (unresolved_ == var) { 688 if (unresolved_ == var) {
696 unresolved_ = var->next_unresolved(); 689 unresolved_ = var->next_unresolved();
697 var->set_next_unresolved(nullptr); 690 var->set_next_unresolved(nullptr);
698 return true; 691 return true;
699 } 692 }
700 VariableProxy* current = unresolved_; 693 VariableProxy* current = unresolved_;
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after
1259 1252
1260 1253
1261 Variable* Scope::NonLocal(const AstRawString* name, VariableMode mode) { 1254 Variable* Scope::NonLocal(const AstRawString* name, VariableMode mode) {
1262 if (dynamics_ == NULL) dynamics_ = new (zone()) DynamicScopePart(zone()); 1255 if (dynamics_ == NULL) dynamics_ = new (zone()) DynamicScopePart(zone());
1263 VariableMap* map = dynamics_->GetMap(mode); 1256 VariableMap* map = dynamics_->GetMap(mode);
1264 Variable* var = map->Lookup(name); 1257 Variable* var = map->Lookup(name);
1265 if (var == NULL) { 1258 if (var == NULL) {
1266 // Declare a new non-local. 1259 // Declare a new non-local.
1267 InitializationFlag init_flag = (mode == VAR) 1260 InitializationFlag init_flag = (mode == VAR)
1268 ? kCreatedInitialized : kNeedsInitialization; 1261 ? kCreatedInitialized : kNeedsInitialization;
1269 var = map->Declare(NULL, 1262 var = map->Declare(zone(), NULL, name, mode, Variable::NORMAL, init_flag);
1270 name,
1271 mode,
1272 Variable::NORMAL,
1273 init_flag);
1274 // Allocate it by giving it a dynamic lookup. 1263 // Allocate it by giving it a dynamic lookup.
1275 var->AllocateTo(VariableLocation::LOOKUP, -1); 1264 var->AllocateTo(VariableLocation::LOOKUP, -1);
1276 } 1265 }
1277 return var; 1266 return var;
1278 } 1267 }
1279 1268
1280 Variable* Scope::LookupRecursive(VariableProxy* proxy, 1269 Variable* Scope::LookupRecursive(VariableProxy* proxy,
1281 BindingKind* binding_kind, 1270 BindingKind* binding_kind,
1282 AstNodeFactory* factory, 1271 AstNodeFactory* factory,
1283 Scope* max_outer_scope) { 1272 Scope* max_outer_scope) {
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after
1770 function != NULL && function->proxy()->var()->IsContextSlot(); 1759 function != NULL && function->proxy()->var()->IsContextSlot();
1771 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - 1760 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() -
1772 (is_function_var_in_context ? 1 : 0); 1761 (is_function_var_in_context ? 1 : 0);
1773 } 1762 }
1774 1763
1775 1764
1776 int Scope::ContextGlobalCount() const { return num_global_slots(); } 1765 int Scope::ContextGlobalCount() const { return num_global_slots(); }
1777 1766
1778 } // namespace internal 1767 } // namespace internal
1779 } // namespace v8 1768 } // namespace v8
OLDNEW
« no previous file with comments | « src/ast/scopes.h ('k') | src/parsing/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698