| 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
|
|
|