| 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);
|
| }
|
| }
|
| }
|
|
|