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

Unified 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, 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/ast/variables.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ast/scopeinfo.cc
diff --git a/src/ast/scopeinfo.cc b/src/ast/scopeinfo.cc
index 7189de33727ebee08a61321ef9f092fe6e6e661e..11ee2311914b4ddddbcdc8fb2e6a9dcdb13ee86a 100644
--- a/src/ast/scopeinfo.cc
+++ b/src/ast/scopeinfo.cc
@@ -116,7 +116,7 @@ Handle<ScopeInfo> ScopeInfo::Create(Isolate* isolate, Zone* zone,
int index = kVariablePartIndex;
// Add parameters.
- DCHECK(index == scope_info->ParameterEntriesIndex());
+ DCHECK_EQ(index, scope_info->ParameterEntriesIndex());
if (scope->is_declaration_scope()) {
for (int i = 0; i < parameter_count; ++i) {
scope_info->set(index++,
@@ -133,57 +133,50 @@ Handle<ScopeInfo> ScopeInfo::Create(Isolate* isolate, Zone* zone,
} else {
first_slot_index = 0;
}
- DCHECK(index == scope_info->StackLocalFirstSlotIndex());
+ DCHECK_EQ(index, scope_info->StackLocalFirstSlotIndex());
scope_info->set(index++, Smi::FromInt(first_slot_index));
- DCHECK(index == scope_info->StackLocalEntriesIndex());
+ DCHECK_EQ(index, scope_info->StackLocalEntriesIndex());
for (int i = 0; i < stack_local_count; ++i) {
DCHECK(stack_locals[i]->index() == first_slot_index + i);
scope_info->set(index++, *stack_locals[i]->name());
}
- // Due to usage analysis, context-allocated locals are not necessarily in
- // increasing order: Some of them may be parameters which are allocated before
- // the non-parameter locals. When the non-parameter locals are sorted
- // according to usage, the allocated slot indices may not be in increasing
- // order with the variable list anymore. Thus, we first need to sort them by
- // context slot index before adding them to the ScopeInfo object.
- context_locals.Sort(&Variable::CompareIndex);
-
- // Add context locals' names.
- DCHECK(index == scope_info->ContextLocalNameEntriesIndex());
- for (int i = 0; i < context_local_count; ++i) {
- scope_info->set(index++, *context_locals[i]->name());
- }
-
- // Add context globals' names.
- DCHECK(index == scope_info->ContextGlobalNameEntriesIndex());
- for (int i = 0; i < context_global_count; ++i) {
- scope_info->set(index++, *context_globals[i]->name());
- }
-
- // Add context locals' info.
- DCHECK(index == scope_info->ContextLocalInfoEntriesIndex());
+ // Add context locals' names and info. Info lies beyond context globals'
+ // names.
+ // Make sure to store them in the order that they appear in the context.
+ DCHECK_EQ(index, scope_info->ContextLocalNameEntriesIndex());
+ int info_index = index + context_local_count + context_global_count;
+ DCHECK_EQ(info_index, scope_info->ContextLocalInfoEntriesIndex());
for (int i = 0; i < context_local_count; ++i) {
Variable* var = context_locals[i];
- uint32_t value =
+ int context_index = var->index() - Context::MIN_CONTEXT_SLOTS;
+ uint32_t info =
ContextLocalMode::encode(var->mode()) |
ContextLocalInitFlag::encode(var->initialization_flag()) |
ContextLocalMaybeAssignedFlag::encode(var->maybe_assigned());
- scope_info->set(index++, Smi::FromInt(value));
+ scope_info->set(index + context_index, *var->name());
+ scope_info->set(info_index + context_index, Smi::FromInt(info));
}
- // Add context globals' info.
- DCHECK(index == scope_info->ContextGlobalInfoEntriesIndex());
+ index += context_local_count;
+
+ // Add context globals' names and info. Info lies beyond context locals' info.
+ DCHECK_EQ(index, scope_info->ContextGlobalNameEntriesIndex());
+ info_index = index + context_global_count + context_local_count;
+ DCHECK_EQ(info_index, scope_info->ContextGlobalInfoEntriesIndex());
for (int i = 0; i < context_global_count; ++i) {
Variable* var = context_globals[i];
+ scope_info->set(index + i, *var->name());
// TODO(ishell): do we need this kind of info for globals here?
- uint32_t value =
+ uint32_t info =
ContextLocalMode::encode(var->mode()) |
ContextLocalInitFlag::encode(var->initialization_flag()) |
ContextLocalMaybeAssignedFlag::encode(var->maybe_assigned());
- scope_info->set(index++, Smi::FromInt(value));
+ scope_info->set(info_index + i, Smi::FromInt(info));
}
+ index += context_local_count + 2 * context_global_count;
+
// If the receiver is allocated, add its index.
DCHECK(index == scope_info->ReceiverEntryIndex());
if (has_receiver) {
« 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