Index: src/scopes.cc |
=================================================================== |
--- src/scopes.cc (revision 12363) |
+++ src/scopes.cc (working copy) |
@@ -594,6 +594,21 @@ |
} |
+class VarAndOrder { |
+ public: |
+ VarAndOrder(Variable* var, int order) : var_(var), order_(order) { } |
+ Variable* var() const { return var_; } |
+ int order() const { return order_; } |
+ static int Compare(const VarAndOrder* a, const VarAndOrder* b) { |
+ return a->order_ - b->order_; |
+ } |
+ |
+ private: |
+ Variable* var_; |
+ int order_; |
+}; |
+ |
+ |
void Scope::CollectStackAndContextLocals(ZoneList<Variable*>* stack_locals, |
ZoneList<Variable*>* context_locals) { |
ASSERT(stack_locals != NULL); |
@@ -608,19 +623,27 @@ |
} |
} |
+ ZoneList<VarAndOrder> vars(variables_.occupancy(), zone()); |
+ |
// Collect declared local variables. |
for (VariableMap::Entry* p = variables_.Start(); |
p != NULL; |
p = variables_.Next(p)) { |
Variable* var = reinterpret_cast<Variable*>(p->value); |
if (var->is_used()) { |
- if (var->IsStackLocal()) { |
- stack_locals->Add(var, zone()); |
- } else if (var->IsContextSlot()) { |
- context_locals->Add(var, zone()); |
- } |
+ vars.Add(VarAndOrder(var, p->order), zone()); |
} |
} |
+ vars.Sort(VarAndOrder::Compare); |
+ int var_count = vars.length(); |
+ for (int i = 0; i < var_count; i++) { |
+ Variable* var = vars[i].var(); |
+ if (var->IsStackLocal()) { |
+ stack_locals->Add(var, zone()); |
+ } else if (var->IsContextSlot()) { |
+ context_locals->Add(var, zone()); |
+ } |
+ } |
} |
@@ -1256,13 +1279,21 @@ |
AllocateNonParameterLocal(temps_[i]); |
} |
+ ZoneList<VarAndOrder> vars(variables_.occupancy(), zone()); |
+ |
for (VariableMap::Entry* p = variables_.Start(); |
p != NULL; |
p = variables_.Next(p)) { |
Variable* var = reinterpret_cast<Variable*>(p->value); |
- AllocateNonParameterLocal(var); |
+ vars.Add(VarAndOrder(var, p->order), zone()); |
} |
+ vars.Sort(VarAndOrder::Compare); |
+ int var_count = vars.length(); |
+ for (int i = 0; i < var_count; i++) { |
+ AllocateNonParameterLocal(vars[i].var()); |
+ } |
+ |
// For now, function_ must be allocated at the very end. If it gets |
// allocated in the context, it must be the last slot in the context, |
// because of the current ScopeInfo implementation (see |