Chromium Code Reviews| Index: runtime/vm/scopes.cc |
| =================================================================== |
| --- runtime/vm/scopes.cc (revision 29679) |
| +++ runtime/vm/scopes.cc (working copy) |
| @@ -30,7 +30,8 @@ |
| begin_token_pos_(0), |
| end_token_pos_(0), |
| variables_(), |
| - labels_() { |
| + labels_(), |
| + referenced_() { |
| // Hook this node into the children of the parent, unless the parent has a |
| // different function_level, since the local scope of a nested function can |
| // be discarded after it has been parsed. |
| @@ -82,6 +83,48 @@ |
| } |
| +NameReference* LocalScope::FindReference(const String& name) const { |
| + intptr_t num_references = referenced_.length(); |
| + for (intptr_t i = 0; i < num_references; i++) { |
| + if (name.Equals(referenced_[i]->name())) { |
| + return referenced_[i]; |
| + } |
| + } |
| + return NULL; |
| +} |
| + |
| + |
| +void LocalScope::AddReferencedName(intptr_t token_pos, |
| + const String& name) { |
| + if (LocalLookupVariable(name) != NULL) { |
| + return; |
| + } |
| + NameReference* ref = FindReference(name); |
| + if (ref != NULL) { |
| + ref->set_token_pos(token_pos); |
|
Ivan Posva
2013/11/01 16:35:12
Is it your intent to show the last reference when
hausner
2013/11/01 16:42:51
Yes.
|
| + return; |
| + } |
| + ref = new NameReference(token_pos, name); |
| + referenced_.Add(ref); |
| + // Add name reference in innermost enclosing scopes that do not |
| + // define a local variable with this name. |
| + LocalScope* scope = this->parent(); |
| + while (scope != NULL && (scope->LocalLookupVariable(name) == NULL)) { |
| + scope->referenced_.Add(ref); |
| + scope = scope->parent(); |
| + } |
| +} |
| + |
| + |
| +intptr_t LocalScope::PreviousReferencePos(const String& name) const { |
| + NameReference* ref = FindReference(name); |
| + if (ref != NULL) { |
| + return ref->token_pos(); |
| + } |
| + return -1; |
| +} |
| + |
| + |
| void LocalScope::AllocateContextVariable(LocalVariable* variable, |
| LocalScope** context_owner) { |
| ASSERT(variable->is_captured()); |