Chromium Code Reviews| Index: runtime/vm/scopes.cc |
| diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc |
| index 49601a19b984b12f71e18d88ad169e8193f31042..0d4233a5b907652fdd9ae7cb611d545512301f7b 100644 |
| --- a/runtime/vm/scopes.cc |
| +++ b/runtime/vm/scopes.cc |
| @@ -249,6 +249,13 @@ int LocalScope::AllocateVariables(int first_parameter_index, |
| } |
| +// The parser creates internal variables that start with ":" |
| +static bool IsInternalIdentifier(const String& str) { |
| + ASSERT(str.Length() > 0); |
| + return str.CharAt(0) == ':'; |
| +} |
| + |
| + |
| RawLocalVarDescriptors* LocalScope::GetVarDescriptors(const Function& func) { |
| GrowableArray<VarDesc> vars(8); |
| // First enter all variables from scopes of outer functions. |
| @@ -257,9 +264,19 @@ RawLocalVarDescriptors* LocalScope::GetVarDescriptors(const Function& func) { |
| if (!context_scope.IsNull()) { |
| ASSERT(func.IsLocalFunction()); |
| for (int i = 0; i < context_scope.num_variables(); i++) { |
| + String& name = String::Handle(context_scope.NameAt(i)); |
| + RawLocalVarDescriptors::VarInfoKind kind; |
| + if (!IsInternalIdentifier(name)) { |
| + kind = RawLocalVarDescriptors::kContextVar; |
| + } else if (name.raw() == Symbols::AsyncOperation().raw()) { |
| + kind = RawLocalVarDescriptors::kAsyncOperation; |
| + } else { |
| + continue; |
| + } |
| + |
| VarDesc desc; |
| - desc.name = &String::Handle(context_scope.NameAt(i)); |
| - desc.info.set_kind(RawLocalVarDescriptors::kContextVar); |
| + desc.name = &name; |
| + desc.info.set_kind(kind); |
| desc.info.scope_id = context_scope.ContextLevelAt(i); |
| desc.info.begin_pos = begin_token_pos(); |
| desc.info.end_pos = end_token_pos(); |
| @@ -284,13 +301,6 @@ RawLocalVarDescriptors* LocalScope::GetVarDescriptors(const Function& func) { |
| } |
| -// The parser creates internal variables that start with ":" |
| -static bool IsInternalIdentifier(const String& str) { |
| - ASSERT(str.Length() > 0); |
| - return str.CharAt(0) == ':'; |
| -} |
| - |
| - |
| // Add visible variables that are declared in this scope to vars, then |
| // collect visible variables of children, followed by siblings. |
| void LocalScope::CollectLocalVariables(GrowableArray<VarDesc>* vars, |
| @@ -337,6 +347,23 @@ void LocalScope::CollectLocalVariables(GrowableArray<VarDesc>* vars, |
| desc.info.end_pos = 0; |
| desc.info.set_index(var->index()); |
| vars->Add(desc); |
| + } else if (var->name().raw() == Symbols::AsyncOperation().raw()) { |
| + // The async continuation. |
| + ASSERT(var->is_captured()); |
| + VarDesc desc; |
| + desc.name = &var->name(); |
| + desc.info.set_kind(RawLocalVarDescriptors::kAsyncOperation); |
| + if (var->is_captured()) { |
| + ASSERT(var->owner() != NULL); |
| + ASSERT(var->owner()->context_level() >= 0); |
| + desc.info.scope_id = var->owner()->context_level(); |
| + } else { |
| + desc.info.scope_id = *scope_id; |
| + } |
| + desc.info.begin_pos = 0; |
| + desc.info.end_pos = 0; |
| + desc.info.set_index(var->index()); |
| + vars->Add(desc); |
|
Cutch
2015/07/15 17:04:23
do you have a test that checks the var descriptor
rmacnak
2015/07/16 19:42:17
Absence of internal names covered by async_scope_t
|
| } |
| } |
| } |