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

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

Issue 2272083003: Merge DeclarationScope::temps_ and Scope::ordered_variables_ into Scope::locals_ (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fixes + add cornercase test + still failing cornercase test Created 4 years, 3 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') | test/cctest/interpreter/bytecode_expectations/DoExpression.golden » ('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"
(...skipping 23 matching lines...) Expand all
34 bool* added) { 34 bool* added) {
35 // AstRawStrings are unambiguous, i.e., the same string is always represented 35 // AstRawStrings are unambiguous, i.e., the same string is always represented
36 // by the same AstRawString*. 36 // by the same AstRawString*.
37 // FIXME(marja): fix the type of Lookup. 37 // FIXME(marja): fix the type of Lookup.
38 Entry* p = 38 Entry* p =
39 ZoneHashMap::LookupOrInsert(const_cast<AstRawString*>(name), name->hash(), 39 ZoneHashMap::LookupOrInsert(const_cast<AstRawString*>(name), name->hash(),
40 ZoneAllocationPolicy(zone)); 40 ZoneAllocationPolicy(zone));
41 if (added) *added = p->value == nullptr; 41 if (added) *added = p->value == nullptr;
42 if (p->value == nullptr) { 42 if (p->value == nullptr) {
43 // The variable has not been declared yet -> insert it. 43 // The variable has not been declared yet -> insert it.
44 DCHECK(p->key == name); 44 DCHECK_EQ(name, p->key);
45 p->value = new (zone) Variable(scope, name, mode, kind, initialization_flag, 45 p->value = new (zone) Variable(scope, name, mode, kind, initialization_flag,
46 maybe_assigned_flag); 46 maybe_assigned_flag);
47 } 47 }
48 return reinterpret_cast<Variable*>(p->value); 48 return reinterpret_cast<Variable*>(p->value);
49 } 49 }
50 50
51 void VariableMap::Remove(Variable* var) {
52 const AstRawString* name = var->raw_name();
53 ZoneHashMap::Remove(const_cast<AstRawString*>(name), name->hash());
54 }
55
56 void VariableMap::Add(Zone* zone, Variable* var) {
57 const AstRawString* name = var->raw_name();
58 Entry* p =
59 ZoneHashMap::LookupOrInsert(const_cast<AstRawString*>(name), name->hash(),
60 ZoneAllocationPolicy(zone));
61 DCHECK_NULL(p->value);
62 DCHECK_EQ(name, p->key);
63 p->value = var;
64 }
51 65
52 Variable* VariableMap::Lookup(const AstRawString* name) { 66 Variable* VariableMap::Lookup(const AstRawString* name) {
53 Entry* p = ZoneHashMap::Lookup(const_cast<AstRawString*>(name), name->hash()); 67 Entry* p = ZoneHashMap::Lookup(const_cast<AstRawString*>(name), name->hash());
54 if (p != NULL) { 68 if (p != NULL) {
55 DCHECK(reinterpret_cast<const AstRawString*>(p->key) == name); 69 DCHECK(reinterpret_cast<const AstRawString*>(p->key) == name);
56 DCHECK(p->value != NULL); 70 DCHECK(p->value != NULL);
57 return reinterpret_cast<Variable*>(p->value); 71 return reinterpret_cast<Variable*>(p->value);
58 } 72 }
59 return NULL; 73 return NULL;
60 } 74 }
(...skipping 13 matching lines...) Expand all
74 } 88 }
75 89
76 90
77 // ---------------------------------------------------------------------------- 91 // ----------------------------------------------------------------------------
78 // Implementation of Scope 92 // Implementation of Scope
79 93
80 Scope::Scope(Zone* zone, ScopeType scope_type) 94 Scope::Scope(Zone* zone, ScopeType scope_type)
81 : zone_(zone), 95 : zone_(zone),
82 outer_scope_(nullptr), 96 outer_scope_(nullptr),
83 variables_(zone), 97 variables_(zone),
84 ordered_variables_(4, zone), 98 locals_(4, zone),
85 decls_(4, zone), 99 decls_(4, zone),
86 scope_type_(scope_type) { 100 scope_type_(scope_type) {
87 DCHECK(scope_type == SCRIPT_SCOPE || scope_type == WITH_SCOPE); 101 DCHECK(scope_type == SCRIPT_SCOPE || scope_type == WITH_SCOPE);
88 SetDefaults(); 102 SetDefaults();
89 #ifdef DEBUG 103 #ifdef DEBUG
90 if (scope_type == WITH_SCOPE) { 104 if (scope_type == WITH_SCOPE) {
91 already_resolved_ = true; 105 already_resolved_ = true;
92 } 106 }
93 #endif 107 #endif
94 } 108 }
95 109
96 Scope::Scope(Zone* zone, Scope* outer_scope, ScopeType scope_type) 110 Scope::Scope(Zone* zone, Scope* outer_scope, ScopeType scope_type)
97 : zone_(zone), 111 : zone_(zone),
98 outer_scope_(outer_scope), 112 outer_scope_(outer_scope),
99 variables_(zone), 113 variables_(zone),
100 ordered_variables_(4, zone), 114 locals_(4, zone),
101 decls_(4, zone), 115 decls_(4, zone),
102 scope_type_(scope_type) { 116 scope_type_(scope_type) {
103 DCHECK_NE(SCRIPT_SCOPE, scope_type); 117 DCHECK_NE(SCRIPT_SCOPE, scope_type);
104 SetDefaults(); 118 SetDefaults();
105 set_language_mode(outer_scope->language_mode()); 119 set_language_mode(outer_scope->language_mode());
106 force_context_allocation_ = 120 force_context_allocation_ =
107 !is_function_scope() && outer_scope->has_forced_context_allocation(); 121 !is_function_scope() && outer_scope->has_forced_context_allocation();
108 outer_scope_->AddInnerScope(this); 122 outer_scope_->AddInnerScope(this);
109 } 123 }
110 124
111 Scope::Snapshot::Snapshot(Scope* scope) 125 Scope::Snapshot::Snapshot(Scope* scope)
112 : outer_scope_(scope), 126 : outer_scope_(scope),
113 top_inner_scope_(scope->inner_scope_), 127 top_inner_scope_(scope->inner_scope_),
114 top_unresolved_(scope->unresolved_), 128 top_unresolved_(scope->unresolved_),
115 top_temp_(scope->GetClosureScope()->temps()->length()) {} 129 top_local_(scope->GetClosureScope()->locals_.length()),
130 top_decl_(scope->GetClosureScope()->decls_.length()) {}
116 131
117 DeclarationScope::DeclarationScope(Zone* zone) 132 DeclarationScope::DeclarationScope(Zone* zone)
118 : Scope(zone), 133 : Scope(zone),
119 function_kind_(kNormalFunction), 134 function_kind_(kNormalFunction),
120 temps_(4, zone),
121 params_(4, zone), 135 params_(4, zone),
122 sloppy_block_function_map_(zone) { 136 sloppy_block_function_map_(zone) {
123 SetDefaults(); 137 SetDefaults();
124 } 138 }
125 139
126 DeclarationScope::DeclarationScope(Zone* zone, Scope* outer_scope, 140 DeclarationScope::DeclarationScope(Zone* zone, Scope* outer_scope,
127 ScopeType scope_type, 141 ScopeType scope_type,
128 FunctionKind function_kind) 142 FunctionKind function_kind)
129 : Scope(zone, outer_scope, scope_type), 143 : Scope(zone, outer_scope, scope_type),
130 function_kind_(function_kind), 144 function_kind_(function_kind),
131 temps_(4, zone),
132 params_(4, zone), 145 params_(4, zone),
133 sloppy_block_function_map_(zone) { 146 sloppy_block_function_map_(zone) {
134 SetDefaults(); 147 SetDefaults();
135 asm_function_ = outer_scope_->IsAsmModule(); 148 asm_function_ = outer_scope_->IsAsmModule();
136 } 149 }
137 150
138 ModuleScope::ModuleScope(Zone* zone, DeclarationScope* script_scope, 151 ModuleScope::ModuleScope(Zone* zone, DeclarationScope* script_scope,
139 AstValueFactory* ast_value_factory) 152 AstValueFactory* ast_value_factory)
140 : DeclarationScope(zone, script_scope, MODULE_SCOPE) { 153 : DeclarationScope(zone, script_scope, MODULE_SCOPE) {
141 module_descriptor_ = new (zone) ModuleDescriptor(zone); 154 module_descriptor_ = new (zone) ModuleDescriptor(zone);
142 set_language_mode(STRICT); 155 set_language_mode(STRICT);
143 DeclareThis(ast_value_factory); 156 DeclareThis(ast_value_factory);
144 } 157 }
145 158
146 Scope::Scope(Zone* zone, ScopeType scope_type, Handle<ScopeInfo> scope_info) 159 Scope::Scope(Zone* zone, ScopeType scope_type, Handle<ScopeInfo> scope_info)
147 : zone_(zone), 160 : zone_(zone),
148 outer_scope_(nullptr), 161 outer_scope_(nullptr),
149 variables_(zone), 162 variables_(zone),
150 ordered_variables_(0, zone), 163 locals_(0, zone),
151 decls_(0, zone), 164 decls_(0, zone),
152 scope_info_(scope_info), 165 scope_info_(scope_info),
153 scope_type_(scope_type) { 166 scope_type_(scope_type) {
154 DCHECK(!scope_info.is_null()); 167 DCHECK(!scope_info.is_null());
155 SetDefaults(); 168 SetDefaults();
156 #ifdef DEBUG 169 #ifdef DEBUG
157 already_resolved_ = true; 170 already_resolved_ = true;
158 #endif 171 #endif
159 if (scope_info->CallsEval()) RecordEvalCall(); 172 if (scope_info->CallsEval()) RecordEvalCall();
160 set_language_mode(scope_info->language_mode()); 173 set_language_mode(scope_info->language_mode());
161 num_heap_slots_ = scope_info->ContextLength(); 174 num_heap_slots_ = scope_info->ContextLength();
162 DCHECK_LE(Context::MIN_CONTEXT_SLOTS, num_heap_slots_); 175 DCHECK_LE(Context::MIN_CONTEXT_SLOTS, num_heap_slots_);
163 } 176 }
164 177
165 DeclarationScope::DeclarationScope(Zone* zone, ScopeType scope_type, 178 DeclarationScope::DeclarationScope(Zone* zone, ScopeType scope_type,
166 Handle<ScopeInfo> scope_info) 179 Handle<ScopeInfo> scope_info)
167 : Scope(zone, scope_type, scope_info), 180 : Scope(zone, scope_type, scope_info),
168 function_kind_(scope_info->function_kind()), 181 function_kind_(scope_info->function_kind()),
169 temps_(0, zone),
170 params_(0, zone), 182 params_(0, zone),
171 sloppy_block_function_map_(zone) { 183 sloppy_block_function_map_(zone) {
172 SetDefaults(); 184 SetDefaults();
173 } 185 }
174 186
175 Scope::Scope(Zone* zone, const AstRawString* catch_variable_name) 187 Scope::Scope(Zone* zone, const AstRawString* catch_variable_name)
176 : zone_(zone), 188 : zone_(zone),
177 outer_scope_(nullptr), 189 outer_scope_(nullptr),
178 variables_(zone), 190 variables_(zone),
179 ordered_variables_(0, zone), 191 locals_(0, zone),
180 decls_(0, zone), 192 decls_(0, zone),
181 scope_type_(CATCH_SCOPE) { 193 scope_type_(CATCH_SCOPE) {
182 SetDefaults(); 194 SetDefaults();
183 #ifdef DEBUG 195 #ifdef DEBUG
184 already_resolved_ = true; 196 already_resolved_ = true;
185 #endif 197 #endif
186 Variable* variable = 198 Variable* variable =
187 variables_.Declare(zone, this, catch_variable_name, VAR, Variable::NORMAL, 199 variables_.Declare(zone, this, catch_variable_name, VAR, Variable::NORMAL,
188 kCreatedInitialized); 200 kCreatedInitialized);
189 AllocateHeapSlot(variable); 201 AllocateHeapSlot(variable);
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
523 num_heap_slots_ = 0; 535 num_heap_slots_ = 0;
524 return NULL; 536 return NULL;
525 } 537 }
526 538
527 void Scope::Snapshot::Reparent(DeclarationScope* new_parent) const { 539 void Scope::Snapshot::Reparent(DeclarationScope* new_parent) const {
528 DCHECK_EQ(new_parent, outer_scope_->inner_scope_); 540 DCHECK_EQ(new_parent, outer_scope_->inner_scope_);
529 DCHECK_EQ(new_parent->outer_scope_, outer_scope_); 541 DCHECK_EQ(new_parent->outer_scope_, outer_scope_);
530 DCHECK_EQ(new_parent, new_parent->GetClosureScope()); 542 DCHECK_EQ(new_parent, new_parent->GetClosureScope());
531 DCHECK_NULL(new_parent->inner_scope_); 543 DCHECK_NULL(new_parent->inner_scope_);
532 DCHECK_NULL(new_parent->unresolved_); 544 DCHECK_NULL(new_parent->unresolved_);
533 DCHECK_EQ(0, new_parent->temps()->length()); 545 DCHECK_EQ(0, new_parent->locals_.length());
534 Scope* inner_scope = new_parent->sibling_; 546 Scope* inner_scope = new_parent->sibling_;
535 if (inner_scope != top_inner_scope_) { 547 if (inner_scope != top_inner_scope_) {
536 for (; inner_scope->sibling() != top_inner_scope_; 548 for (; inner_scope->sibling() != top_inner_scope_;
537 inner_scope = inner_scope->sibling()) { 549 inner_scope = inner_scope->sibling()) {
538 inner_scope->outer_scope_ = new_parent; 550 inner_scope->outer_scope_ = new_parent;
539 DCHECK_NE(inner_scope, new_parent); 551 DCHECK_NE(inner_scope, new_parent);
540 } 552 }
541 inner_scope->outer_scope_ = new_parent; 553 inner_scope->outer_scope_ = new_parent;
542 554
543 new_parent->inner_scope_ = new_parent->sibling_; 555 new_parent->inner_scope_ = new_parent->sibling_;
544 inner_scope->sibling_ = nullptr; 556 inner_scope->sibling_ = nullptr;
545 // Reset the sibling rather than the inner_scope_ since we 557 // Reset the sibling rather than the inner_scope_ since we
546 // want to keep new_parent there. 558 // want to keep new_parent there.
547 new_parent->sibling_ = top_inner_scope_; 559 new_parent->sibling_ = top_inner_scope_;
548 } 560 }
549 561
550 if (outer_scope_->unresolved_ != top_unresolved_) { 562 if (outer_scope_->unresolved_ != top_unresolved_) {
551 VariableProxy* last = outer_scope_->unresolved_; 563 VariableProxy* last = outer_scope_->unresolved_;
552 while (last->next_unresolved() != top_unresolved_) { 564 while (last->next_unresolved() != top_unresolved_) {
553 last = last->next_unresolved(); 565 last = last->next_unresolved();
554 } 566 }
555 last->set_next_unresolved(nullptr); 567 last->set_next_unresolved(nullptr);
556 new_parent->unresolved_ = outer_scope_->unresolved_; 568 new_parent->unresolved_ = outer_scope_->unresolved_;
557 outer_scope_->unresolved_ = top_unresolved_; 569 outer_scope_->unresolved_ = top_unresolved_;
558 } 570 }
559 571
560 if (outer_scope_->GetClosureScope()->temps()->length() != top_temp_) { 572 // TODO(verwaest): This currently only moves do-expression declared variables
561 ZoneList<Variable*>* temps = outer_scope_->GetClosureScope()->temps(); 573 // in default arguments that weren't already previously declared with the same
562 for (int i = top_temp_; i < temps->length(); i++) { 574 // name in the closure-scope. See
563 Variable* temp = temps->at(i); 575 // test/mjsunit/harmony/default-parameter-do-expression.js.
564 DCHECK_EQ(temp->scope(), temp->scope()->GetClosureScope()); 576 DeclarationScope* outer_closure = outer_scope_->GetClosureScope();
565 DCHECK_NE(temp->scope(), new_parent); 577 for (int i = top_local_; i < outer_closure->locals_.length(); i++) {
566 temp->set_scope(new_parent); 578 Variable* local = outer_closure->locals_.at(i);
567 new_parent->AddTemporary(temp); 579 DCHECK(local->mode() == TEMPORARY || local->mode() == VAR);
580 DCHECK_EQ(local->scope(), local->scope()->GetClosureScope());
581 DCHECK_NE(local->scope(), new_parent);
582 local->set_scope(new_parent);
583 new_parent->AddLocal(local);
584 if (local->mode() == VAR) {
585 outer_closure->variables_.Remove(local);
586 new_parent->variables_.Add(new_parent->zone(), local);
568 } 587 }
569 temps->Rewind(top_temp_);
570 } 588 }
589 outer_closure->locals_.Rewind(top_local_);
590 outer_closure->decls_.Rewind(top_decl_);
571 } 591 }
572 592
573 void Scope::ReplaceOuterScope(Scope* outer) { 593 void Scope::ReplaceOuterScope(Scope* outer) {
574 DCHECK_NOT_NULL(outer); 594 DCHECK_NOT_NULL(outer);
575 DCHECK_NOT_NULL(outer_scope_); 595 DCHECK_NOT_NULL(outer_scope_);
576 DCHECK(!already_resolved_); 596 DCHECK(!already_resolved_);
577 DCHECK(!outer->already_resolved_); 597 DCHECK(!outer->already_resolved_);
578 DCHECK(!outer_scope_->already_resolved_); 598 DCHECK(!outer_scope_->already_resolved_);
579 outer_scope_->RemoveInnerScope(this); 599 outer_scope_->RemoveInnerScope(this);
580 outer->AddInnerScope(this); 600 outer->AddInnerScope(this);
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
741 } 761 }
742 762
743 763
744 Variable* Scope::NewTemporary(const AstRawString* name) { 764 Variable* Scope::NewTemporary(const AstRawString* name) {
745 DeclarationScope* scope = GetClosureScope(); 765 DeclarationScope* scope = GetClosureScope();
746 Variable* var = new(zone()) Variable(scope, 766 Variable* var = new(zone()) Variable(scope,
747 name, 767 name,
748 TEMPORARY, 768 TEMPORARY,
749 Variable::NORMAL, 769 Variable::NORMAL,
750 kCreatedInitialized); 770 kCreatedInitialized);
751 scope->AddTemporary(var); 771 scope->AddLocal(var);
adamk 2016/08/25 17:37:10 This means that it's now possible to close over te
adamk 2016/08/25 17:40:12 Okay, I was confused, these still aren't lookup-ab
752 return var; 772 return var;
753 } 773 }
754 774
755 void Scope::AddDeclaration(Declaration* declaration) { 775 void Scope::AddDeclaration(Declaration* declaration) {
756 DCHECK(!already_resolved_); 776 DCHECK(!already_resolved_);
757 decls_.Add(declaration, zone()); 777 decls_.Add(declaration, zone());
758 } 778 }
759 779
760 780
761 Declaration* Scope::CheckConflictingVarDeclarations() { 781 Declaration* Scope::CheckConflictingVarDeclarations() {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 } 823 }
804 DCHECK(false); 824 DCHECK(false);
805 } 825 }
806 } 826 }
807 return nullptr; 827 return nullptr;
808 } 828 }
809 829
810 void Scope::CollectStackAndContextLocals(ZoneList<Variable*>* stack_locals, 830 void Scope::CollectStackAndContextLocals(ZoneList<Variable*>* stack_locals,
811 ZoneList<Variable*>* context_locals, 831 ZoneList<Variable*>* context_locals,
812 ZoneList<Variable*>* context_globals) { 832 ZoneList<Variable*>* context_globals) {
813 DCHECK(stack_locals != NULL); 833 // TODO(verwaest): Just pass out locals_ directly and walk it?
814 DCHECK(context_locals != NULL); 834 DCHECK_NOT_NULL(stack_locals);
815 DCHECK(context_globals != NULL); 835 DCHECK_NOT_NULL(context_locals);
836 DCHECK_NOT_NULL(context_globals);
816 837
817 // Collect temporaries which are always allocated on the stack, unless the 838 for (int i = 0; i < locals_.length(); i++) {
818 // context as a whole has forced context allocation. 839 Variable* var = locals_[i];
819 if (is_declaration_scope()) {
820 ZoneList<Variable*>* temps = AsDeclarationScope()->temps();
821 for (int i = 0; i < temps->length(); i++) {
822 Variable* var = (*temps)[i];
823 if (var->is_used()) {
824 if (var->IsContextSlot()) {
825 DCHECK(has_forced_context_allocation());
826 context_locals->Add(var, zone());
827 } else if (var->IsStackLocal()) {
828 stack_locals->Add(var, zone());
829 } else {
830 DCHECK(var->IsParameter());
831 }
832 }
833 }
834 }
835
836 for (int i = 0; i < ordered_variables_.length(); i++) {
837 Variable* var = ordered_variables_[i];
838 if (var->IsStackLocal()) { 840 if (var->IsStackLocal()) {
839 stack_locals->Add(var, zone()); 841 stack_locals->Add(var, zone());
840 } else if (var->IsContextSlot()) { 842 } else if (var->IsContextSlot()) {
841 context_locals->Add(var, zone()); 843 context_locals->Add(var, zone());
842 } else if (var->IsGlobalSlot()) { 844 } else if (var->IsGlobalSlot()) {
843 context_globals->Add(var, zone()); 845 context_globals->Add(var, zone());
844 } 846 }
845 } 847 }
846 } 848 }
847 849
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
1154 PrintF("%d heap slots (including %d global slots)\n", num_heap_slots_, 1156 PrintF("%d heap slots (including %d global slots)\n", num_heap_slots_,
1155 num_global_slots_); 1157 num_global_slots_);
1156 } 1158 }
1157 1159
1158 // Print locals. 1160 // Print locals.
1159 if (function != nullptr) { 1161 if (function != nullptr) {
1160 Indent(n1, "// function var:\n"); 1162 Indent(n1, "// function var:\n");
1161 PrintVar(n1, function); 1163 PrintVar(n1, function);
1162 } 1164 }
1163 1165
1164 if (is_declaration_scope()) {
1165 bool printed_header = false;
1166 ZoneList<Variable*>* temps = AsDeclarationScope()->temps();
1167 for (int i = 0; i < temps->length(); i++) {
1168 if (!printed_header) {
1169 printed_header = true;
1170 Indent(n1, "// temporary vars:\n");
1171 }
1172 PrintVar(n1, (*temps)[i]);
1173 }
1174 }
1175
1176 if (variables_.Start() != NULL) { 1166 if (variables_.Start() != NULL) {
1177 Indent(n1, "// local vars:\n"); 1167 Indent(n1, "// local vars:\n");
1178 PrintMap(n1, &variables_, true); 1168 PrintMap(n1, &variables_, true);
1179 1169
1180 Indent(n1, "// dynamic vars:\n"); 1170 Indent(n1, "// dynamic vars:\n");
1181 PrintMap(n1, &variables_, false); 1171 PrintMap(n1, &variables_, false);
1182 } 1172 }
1183 1173
1184 // Print inner scopes (disable by providing negative n). 1174 // Print inner scopes (disable by providing negative n).
1185 if (n >= 0) { 1175 if (n >= 0) {
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
1547 var->AllocateTo(VariableLocation::GLOBAL, num_heap_slots_++); 1537 var->AllocateTo(VariableLocation::GLOBAL, num_heap_slots_++);
1548 num_global_slots_++; 1538 num_global_slots_++;
1549 } else { 1539 } else {
1550 // There must be only DYNAMIC_GLOBAL in the script scope. 1540 // There must be only DYNAMIC_GLOBAL in the script scope.
1551 DCHECK(!is_script_scope() || DYNAMIC_GLOBAL == var->mode()); 1541 DCHECK(!is_script_scope() || DYNAMIC_GLOBAL == var->mode());
1552 } 1542 }
1553 } 1543 }
1554 } 1544 }
1555 1545
1556 void Scope::AllocateNonParameterLocalsAndDeclaredGlobals() { 1546 void Scope::AllocateNonParameterLocalsAndDeclaredGlobals() {
1557 // All variables that have no rewrite yet are non-parameter locals. 1547 for (int i = 0; i < locals_.length(); i++) {
1558 if (is_declaration_scope()) { 1548 AllocateNonParameterLocal(locals_[i]);
1559 ZoneList<Variable*>* temps = AsDeclarationScope()->temps(); 1549 }
1560 for (int i = 0; i < temps->length(); i++) { 1550
1561 AllocateNonParameterLocal((*temps)[i]); 1551 if (FLAG_global_var_shortcuts) {
1552 for (int i = 0; i < locals_.length(); i++) {
1553 AllocateDeclaredGlobal(locals_[i]);
1562 } 1554 }
1563 } 1555 }
1564 1556
1565 for (int i = 0; i < ordered_variables_.length(); i++) {
1566 AllocateNonParameterLocal(ordered_variables_[i]);
1567 }
1568
1569 if (FLAG_global_var_shortcuts) {
1570 for (int i = 0; i < ordered_variables_.length(); i++) {
1571 AllocateDeclaredGlobal(ordered_variables_[i]);
1572 }
1573 }
1574
1575 if (is_declaration_scope()) { 1557 if (is_declaration_scope()) {
1576 AsDeclarationScope()->AllocateLocals(); 1558 AsDeclarationScope()->AllocateLocals();
1577 } 1559 }
1578 } 1560 }
1579 1561
1580 void DeclarationScope::AllocateLocals() { 1562 void DeclarationScope::AllocateLocals() {
1581 // For now, function_ must be allocated at the very end. If it gets 1563 // For now, function_ must be allocated at the very end. If it gets
1582 // allocated in the context, it must be the last slot in the context, 1564 // allocated in the context, it must be the last slot in the context,
1583 // because of the current ScopeInfo implementation (see 1565 // because of the current ScopeInfo implementation (see
1584 // ScopeInfo::ScopeInfo(FunctionScope* scope) constructor). 1566 // ScopeInfo::ScopeInfo(FunctionScope* scope) constructor).
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1673 function != nullptr && function->IsContextSlot(); 1655 function != nullptr && function->IsContextSlot();
1674 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - 1656 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() -
1675 (is_function_var_in_context ? 1 : 0); 1657 (is_function_var_in_context ? 1 : 0);
1676 } 1658 }
1677 1659
1678 1660
1679 int Scope::ContextGlobalCount() const { return num_global_slots(); } 1661 int Scope::ContextGlobalCount() const { return num_global_slots(); }
1680 1662
1681 } // namespace internal 1663 } // namespace internal
1682 } // namespace v8 1664 } // namespace v8
OLDNEW
« no previous file with comments | « src/ast/scopes.h ('k') | test/cctest/interpreter/bytecode_expectations/DoExpression.golden » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698