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

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

Issue 2272293004: Simply use the variable index to put them into the right ScopeInfo slot rather than sorting (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: also add info in the right order, interleaved with adding names 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 | « no previous file | src/ast/variables.h » ('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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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/scopeinfo.h" 5 #include "src/ast/scopeinfo.h"
6 6
7 #include <stdlib.h> 7 #include <stdlib.h>
8 8
9 #include "src/ast/context-slot-cache.h" 9 #include "src/ast/context-slot-cache.h"
10 #include "src/ast/scopes.h" 10 #include "src/ast/scopes.h"
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 HasSimpleParametersField::encode(has_simple_parameters) | 109 HasSimpleParametersField::encode(has_simple_parameters) |
110 FunctionKindField::encode(function_kind); 110 FunctionKindField::encode(function_kind);
111 scope_info->SetFlags(flags); 111 scope_info->SetFlags(flags);
112 scope_info->SetParameterCount(parameter_count); 112 scope_info->SetParameterCount(parameter_count);
113 scope_info->SetStackLocalCount(stack_local_count); 113 scope_info->SetStackLocalCount(stack_local_count);
114 scope_info->SetContextLocalCount(context_local_count); 114 scope_info->SetContextLocalCount(context_local_count);
115 scope_info->SetContextGlobalCount(context_global_count); 115 scope_info->SetContextGlobalCount(context_global_count);
116 116
117 int index = kVariablePartIndex; 117 int index = kVariablePartIndex;
118 // Add parameters. 118 // Add parameters.
119 DCHECK(index == scope_info->ParameterEntriesIndex()); 119 DCHECK_EQ(index, scope_info->ParameterEntriesIndex());
120 if (scope->is_declaration_scope()) { 120 if (scope->is_declaration_scope()) {
121 for (int i = 0; i < parameter_count; ++i) { 121 for (int i = 0; i < parameter_count; ++i) {
122 scope_info->set(index++, 122 scope_info->set(index++,
123 *scope->AsDeclarationScope()->parameter(i)->name()); 123 *scope->AsDeclarationScope()->parameter(i)->name());
124 } 124 }
125 } 125 }
126 126
127 // Add stack locals' names. We are assuming that the stack locals' 127 // Add stack locals' names. We are assuming that the stack locals'
128 // slots are allocated in increasing order, so we can simply add 128 // slots are allocated in increasing order, so we can simply add
129 // them to the ScopeInfo object. 129 // them to the ScopeInfo object.
130 int first_slot_index; 130 int first_slot_index;
131 if (stack_local_count > 0) { 131 if (stack_local_count > 0) {
132 first_slot_index = stack_locals[0]->index(); 132 first_slot_index = stack_locals[0]->index();
133 } else { 133 } else {
134 first_slot_index = 0; 134 first_slot_index = 0;
135 } 135 }
136 DCHECK(index == scope_info->StackLocalFirstSlotIndex()); 136 DCHECK_EQ(index, scope_info->StackLocalFirstSlotIndex());
137 scope_info->set(index++, Smi::FromInt(first_slot_index)); 137 scope_info->set(index++, Smi::FromInt(first_slot_index));
138 DCHECK(index == scope_info->StackLocalEntriesIndex()); 138 DCHECK_EQ(index, scope_info->StackLocalEntriesIndex());
139 for (int i = 0; i < stack_local_count; ++i) { 139 for (int i = 0; i < stack_local_count; ++i) {
140 DCHECK(stack_locals[i]->index() == first_slot_index + i); 140 DCHECK(stack_locals[i]->index() == first_slot_index + i);
141 scope_info->set(index++, *stack_locals[i]->name()); 141 scope_info->set(index++, *stack_locals[i]->name());
142 } 142 }
143 143
144 // Due to usage analysis, context-allocated locals are not necessarily in 144 // Add context locals' names and info. Info lies beyond context globals'
145 // increasing order: Some of them may be parameters which are allocated before 145 // names.
146 // the non-parameter locals. When the non-parameter locals are sorted 146 // Make sure to store them in the order that they appear in the context.
147 // according to usage, the allocated slot indices may not be in increasing 147 DCHECK_EQ(index, scope_info->ContextLocalNameEntriesIndex());
148 // order with the variable list anymore. Thus, we first need to sort them by 148 int info_index = index + context_local_count + context_global_count;
149 // context slot index before adding them to the ScopeInfo object. 149 DCHECK_EQ(info_index, scope_info->ContextLocalInfoEntriesIndex());
150 context_locals.Sort(&Variable::CompareIndex);
151
152 // Add context locals' names.
153 DCHECK(index == scope_info->ContextLocalNameEntriesIndex());
154 for (int i = 0; i < context_local_count; ++i) {
155 scope_info->set(index++, *context_locals[i]->name());
156 }
157
158 // Add context globals' names.
159 DCHECK(index == scope_info->ContextGlobalNameEntriesIndex());
160 for (int i = 0; i < context_global_count; ++i) {
161 scope_info->set(index++, *context_globals[i]->name());
162 }
163
164 // Add context locals' info.
165 DCHECK(index == scope_info->ContextLocalInfoEntriesIndex());
166 for (int i = 0; i < context_local_count; ++i) { 150 for (int i = 0; i < context_local_count; ++i) {
167 Variable* var = context_locals[i]; 151 Variable* var = context_locals[i];
168 uint32_t value = 152 int context_index = var->index() - Context::MIN_CONTEXT_SLOTS;
153 uint32_t info =
169 ContextLocalMode::encode(var->mode()) | 154 ContextLocalMode::encode(var->mode()) |
170 ContextLocalInitFlag::encode(var->initialization_flag()) | 155 ContextLocalInitFlag::encode(var->initialization_flag()) |
171 ContextLocalMaybeAssignedFlag::encode(var->maybe_assigned()); 156 ContextLocalMaybeAssignedFlag::encode(var->maybe_assigned());
172 scope_info->set(index++, Smi::FromInt(value)); 157 scope_info->set(index + context_index, *var->name());
158 scope_info->set(info_index + context_index, Smi::FromInt(info));
173 } 159 }
174 160
175 // Add context globals' info. 161 index += context_local_count;
176 DCHECK(index == scope_info->ContextGlobalInfoEntriesIndex()); 162
163 // Add context globals' names and info. Info lies beyond context locals' info.
164 DCHECK_EQ(index, scope_info->ContextGlobalNameEntriesIndex());
165 info_index = index + context_global_count + context_local_count;
166 DCHECK_EQ(info_index, scope_info->ContextGlobalInfoEntriesIndex());
177 for (int i = 0; i < context_global_count; ++i) { 167 for (int i = 0; i < context_global_count; ++i) {
178 Variable* var = context_globals[i]; 168 Variable* var = context_globals[i];
169 scope_info->set(index + i, *var->name());
179 // TODO(ishell): do we need this kind of info for globals here? 170 // TODO(ishell): do we need this kind of info for globals here?
180 uint32_t value = 171 uint32_t info =
181 ContextLocalMode::encode(var->mode()) | 172 ContextLocalMode::encode(var->mode()) |
182 ContextLocalInitFlag::encode(var->initialization_flag()) | 173 ContextLocalInitFlag::encode(var->initialization_flag()) |
183 ContextLocalMaybeAssignedFlag::encode(var->maybe_assigned()); 174 ContextLocalMaybeAssignedFlag::encode(var->maybe_assigned());
184 scope_info->set(index++, Smi::FromInt(value)); 175 scope_info->set(info_index + i, Smi::FromInt(info));
185 } 176 }
186 177
178 index += context_local_count + 2 * context_global_count;
179
187 // If the receiver is allocated, add its index. 180 // If the receiver is allocated, add its index.
188 DCHECK(index == scope_info->ReceiverEntryIndex()); 181 DCHECK(index == scope_info->ReceiverEntryIndex());
189 if (has_receiver) { 182 if (has_receiver) {
190 int var_index = scope->AsDeclarationScope()->receiver()->index(); 183 int var_index = scope->AsDeclarationScope()->receiver()->index();
191 scope_info->set(index++, Smi::FromInt(var_index)); 184 scope_info->set(index++, Smi::FromInt(var_index));
192 // ?? DCHECK(receiver_info != CONTEXT || var_index == 185 // ?? DCHECK(receiver_info != CONTEXT || var_index ==
193 // scope_info->ContextLength() - 1); 186 // scope_info->ContextLength() - 1);
194 } 187 }
195 188
196 // If present, add the function variable name and its index. 189 // If present, add the function variable name and its index.
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after
695 ContextLocalNameEntriesIndex() + ContextLocalCount(), this); 688 ContextLocalNameEntriesIndex() + ContextLocalCount(), this);
696 } 689 }
697 690
698 PrintF("}\n"); 691 PrintF("}\n");
699 } 692 }
700 #endif // DEBUG 693 #endif // DEBUG
701 694
702 695
703 } // namespace internal 696 } // namespace internal
704 } // namespace v8 697 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/ast/variables.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698