Chromium Code Reviews| Index: runtime/vm/scopes.cc |
| =================================================================== |
| --- runtime/vm/scopes.cc (revision 2587) |
| +++ runtime/vm/scopes.cc (working copy) |
| @@ -26,6 +26,7 @@ |
| loop_level_(loop_level), |
| context_level_(LocalScope::kUnitializedContextLevel_), |
| num_context_variables_(0), |
| + end_token_index_(0), |
| variables_(), |
| labels_() { |
| // Hook this node into the children of the parent, unless the parent has a |
| @@ -172,6 +173,45 @@ |
| } |
| +static int CompareVariableRanges( |
| + LocalVariable* const* a, LocalVariable* const* b) { |
| + if ((*a)->token_index() < (*b)->token_index()) return -1; |
| + if ((*a)->token_index() > (*b)->token_index()) return 1; |
| + return 0; |
| +} |
| + |
| + |
| +RawLocalVarDescriptors* LocalScope::GetVarDescriptors() { |
| + GrowableArray<LocalVariable*> vars(8); |
| + CollectLocalVariables(&vars); |
| + vars.Sort(&CompareVariableRanges); |
| + const LocalVarDescriptors& var_desc = |
| + LocalVarDescriptors::Handle(LocalVarDescriptors::New(vars.length())); |
| + for (int i = 0; i < vars.length(); i++) { |
| + LocalVariable *var = vars[i]; |
|
siva
2011/12/20 19:11:26
LocalVariable* var = vars[i];
hausner
2011/12/20 21:43:55
Done.
|
| + var_desc.SetVar(i, var->name(), var->index(), |
| + var->token_index(), var->owner()->end_token_index()); |
| + } |
| + return var_desc.raw(); |
| +} |
| + |
| + |
| +void LocalScope::CollectLocalVariables(GrowableArray<LocalVariable*>* vars) { |
| + for (int i = 0; i < this->variables_.length(); i++) { |
| + LocalVariable* var = variables_[i]; |
| + if ((var->owner() == this) && Scanner::IsIdent(var->name())) { |
| + vars->Add(this->variables_[i]); |
| + } |
| + } |
| + if (child() != NULL) { |
| + child()->CollectLocalVariables(vars); |
| + } |
| + if (sibling() != NULL) { |
| + sibling()->CollectLocalVariables(vars); |
| + } |
| +} |
| + |
| + |
| SourceLabel* LocalScope::LocalLookupLabel(const String& name) const { |
| for (intptr_t i = 0; i < labels_.length(); i++) { |
| SourceLabel* label = labels_[i]; |