| Index: runtime/vm/parser_test.cc
 | 
| ===================================================================
 | 
| --- runtime/vm/parser_test.cc	(revision 41393)
 | 
| +++ runtime/vm/parser_test.cc	(working copy)
 | 
| @@ -263,20 +263,24 @@
 | 
|        "::.main_f\n"
 | 
|        " 0 ContextVar    level=0   begin=14  end=28  name=value\n"
 | 
|        " 1 StackVar      scope=1   begin=16  end=28  name=param\n"
 | 
| +      " 2 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
|  
 | 
|        // Closure call saves current context.
 | 
|        "(dynamic, dynamic) => int.call\n"
 | 
|        " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
 | 
| -      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
 | 
| -      "   name=:saved_current_context_var\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
|  
 | 
|        // function main uses one ctx var at (1); saves caller ctx.
 | 
|        "::.main\n"
 | 
|        " 0 ContextLevel  level=1   scope=1   begin=2   end=37\n"
 | 
| -      " 1 SavedEntryCtx scope=0   begin=0   end=0"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
| +      " 2 SavedEntryCtx scope=0   begin=0   end=0"
 | 
|        "   name=:saved_entry_context_var\n"
 | 
| -      " 2 ContextVar    level=1   begin=7   end=37  name=value\n"
 | 
| -      " 3 StackVar      scope=2   begin=12  end=37  name=f\n",
 | 
| +      " 3 ContextVar    level=1   begin=7   end=37  name=value\n"
 | 
| +      " 4 StackVar      scope=2   begin=12  end=37  name=f\n",
 | 
|        CaptureVarsAtLine(lib, "main", 4));
 | 
|  }
 | 
|  
 | 
| @@ -300,34 +304,40 @@
 | 
|        // function.
 | 
|        "::.a_b_c\n"
 | 
|        " 0 ContextVar    level=0   begin=20  end=30  name=value\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
|  
 | 
|        // Closure call saves current context.
 | 
|        "(dynamic) => int.call\n"
 | 
|        " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
 | 
| -      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
 | 
| -      "   name=:saved_current_context_var\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
|  
 | 
|        // Middle function saves the entry context.  Notice that this
 | 
|        // happens here and not in the outermost function.  We always
 | 
|        // save the entry context at the last possible moment.
 | 
|        "::.a_b\n"
 | 
|        " 0 ContextLevel  level=1   scope=1   begin=8   end=38\n"
 | 
| -      " 1 SavedEntryCtx scope=0   begin=0   end=0"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
| +      " 2 SavedEntryCtx scope=0   begin=0   end=0"
 | 
|        "   name=:saved_entry_context_var\n"
 | 
| -      " 2 ContextVar    level=1   begin=13  end=38  name=value\n"
 | 
| -      " 3 StackVar      scope=2   begin=18  end=38  name=c\n"
 | 
| +      " 3 ContextVar    level=1   begin=13  end=38  name=value\n"
 | 
| +      " 4 StackVar      scope=2   begin=18  end=38  name=c\n"
 | 
|  
 | 
|        // Closure call saves current context.
 | 
|        "(dynamic) => int.call\n"
 | 
|        " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
 | 
| -      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
 | 
| -      "   name=:saved_current_context_var\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
|  
 | 
|        // Outermost function neglects to save the entry context.  We
 | 
|        // don't save the entry context if the function has no captured
 | 
|        // variables.
 | 
|        "::.a\n"
 | 
| -      " 0 StackVar      scope=2   begin=6   end=46  name=b\n",
 | 
| +      " 0 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
| +      " 1 StackVar      scope=2   begin=6   end=46  name=b\n",
 | 
|        CaptureVarsAtLine(lib, "a", 5));
 | 
|  }
 | 
|  
 | 
| @@ -350,51 +360,60 @@
 | 
|        "}\n";
 | 
|    Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
 | 
|    EXPECT_VALID(lib);
 | 
| +
 | 
|    EXPECT_STREQ(
 | 
|        // bb captures only value2 from aa.  No others.
 | 
|        "::.a_b_aa_bb\n"
 | 
|        " 0 ContextVar    level=0   begin=32  end=42  name=value2\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
|  
 | 
|        // Closure call saves current context.
 | 
|        "(dynamic) => int.call\n"
 | 
|        " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
 | 
| -      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
 | 
| -      "   name=:saved_current_context_var\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
|  
 | 
|        // aa shares value2. Notice that we save the entry ctx instead
 | 
|        // of chaining from b.  This keeps us from holding onto closures
 | 
|        // that we would never access.
 | 
|        "::.a_b_aa\n"
 | 
|        " 0 ContextLevel  level=1   scope=1   begin=20  end=50\n"
 | 
| -      " 1 SavedEntryCtx scope=0   begin=0   end=0"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
| +      " 2 SavedEntryCtx scope=0   begin=0   end=0"
 | 
|        "   name=:saved_entry_context_var\n"
 | 
| -      " 2 ContextVar    level=1   begin=25  end=50  name=value2\n"
 | 
| -      " 3 StackVar      scope=2   begin=30  end=50  name=bb\n"
 | 
| +      " 3 ContextVar    level=1   begin=25  end=50  name=value2\n"
 | 
| +      " 4 StackVar      scope=2   begin=30  end=50  name=bb\n"
 | 
|  
 | 
|        // Closure call saves current context.
 | 
|        "(dynamic) => int.call\n"
 | 
|        " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
 | 
| -      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
 | 
| -      "   name=:saved_current_context_var\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
|  
 | 
|        // b captures value1 from a.
 | 
|        "::.a_b\n"
 | 
|        " 0 ContextVar    level=0   begin=14  end=60  name=value1\n"
 | 
| -      " 1 StackVar      scope=2   begin=18  end=60  name=aa\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
| +      " 2 StackVar      scope=2   begin=18  end=60  name=aa\n"
 | 
|  
 | 
|        // Closure call saves current context.
 | 
|        "(dynamic) => int.call\n"
 | 
|        " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
 | 
| -      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
 | 
| -      "   name=:saved_current_context_var\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
|  
 | 
|        // a shares value1, saves entry ctx.
 | 
|        "::.a\n"
 | 
|        " 0 ContextLevel  level=1   scope=1   begin=2   end=68\n"
 | 
| -      " 1 SavedEntryCtx scope=0   begin=0   end=0"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
| +      " 2 SavedEntryCtx scope=0   begin=0   end=0"
 | 
|        "   name=:saved_entry_context_var\n"
 | 
| -      " 2 ContextVar    level=1   begin=7   end=68  name=value1\n"
 | 
| -      " 3 StackVar      scope=2   begin=12  end=68  name=b\n",
 | 
| +      " 3 ContextVar    level=1   begin=7   end=68  name=value1\n"
 | 
| +      " 4 StackVar      scope=2   begin=12  end=68  name=b\n",
 | 
|        CaptureVarsAtLine(lib, "a", 7));
 | 
|  }
 | 
|  
 | 
| @@ -432,21 +451,27 @@
 | 
|        "::.doIt_<anonymous closure>\n"
 | 
|        " 0 ContextLevel  level=1   scope=1   begin=41  end=62\n"
 | 
|        " 1 ContextVar    level=1   begin=42  end=62  name=y\n"
 | 
| -      " 2 SavedEntryCtx scope=0   begin=0   end=0"
 | 
| +      " 2 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
| +      " 3 SavedEntryCtx scope=0   begin=0   end=0"
 | 
|        "   name=:saved_entry_context_var\n"
 | 
|  
 | 
|        // Closure call saves current context.
 | 
|        "(dynamic, dynamic) => dynamic.call\n"
 | 
|        " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
 | 
| -      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
 | 
| -      "   name=:saved_current_context_var\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
|  
 | 
|        "X.onX\n"
 | 
|        " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
|  
 | 
|        // No context is saved here since no vars are captured.
 | 
|        "::.doIt\n"
 | 
| -      " 0 StackVar      scope=2   begin=29  end=77  name=x\n",
 | 
| +      " 0 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
| +      " 1 StackVar      scope=2   begin=29  end=77  name=x\n",
 | 
|        CaptureVarsAtLine(lib, "doIt", 12));
 | 
|  }
 | 
|  
 | 
| @@ -473,22 +498,26 @@
 | 
|        // inner function captures variable value.  That's fine.
 | 
|        "::.outer_inner\n"
 | 
|        " 0 ContextVar    level=0   begin=32  end=42  name=value\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
|  
 | 
|        // Closure call saves current context.
 | 
|        "(dynamic) => int.call\n"
 | 
|        " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
 | 
| -      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
 | 
| -      "   name=:saved_current_context_var\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
|  
 | 
|        // The outer function saves the entry context, even though the
 | 
|        // captured variable is in a loop.  Good.
 | 
|        "::.outer\n"
 | 
| -      " 0 SavedEntryCtx scope=0   begin=0   end=0"
 | 
| +      " 0 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
| +      " 1 SavedEntryCtx scope=0   begin=0   end=0"
 | 
|        "   name=:saved_entry_context_var\n"
 | 
| -      " 1 StackVar      scope=3   begin=9   end=50  name=i\n"
 | 
| -      " 2 ContextLevel  level=1   scope=4   begin=20  end=50\n"
 | 
| -      " 3 ContextVar    level=1   begin=23  end=50  name=value\n"
 | 
| -      " 4 StackVar      scope=4   begin=30  end=50  name=inner\n",
 | 
| +      " 2 StackVar      scope=3   begin=9   end=50  name=i\n"
 | 
| +      " 3 ContextLevel  level=1   scope=4   begin=20  end=50\n"
 | 
| +      " 4 ContextVar    level=1   begin=23  end=50  name=value\n"
 | 
| +      " 5 StackVar      scope=4   begin=30  end=50  name=inner\n",
 | 
|        CaptureVarsAtLine(lib, "outer", 5));
 | 
|  }
 | 
|  
 | 
| @@ -514,30 +543,36 @@
 | 
|    EXPECT_STREQ(
 | 
|        "::.a_b_c\n"
 | 
|        " 0 ContextVar    level=0   begin=48  end=60  name=x\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
|        "(dynamic) => int.call\n"
 | 
|        " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
 | 
| -      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
 | 
| -      "   name=:saved_current_context_var\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
|  
 | 
|        // Doesn't save the entry context.  Chains to parent instead.
 | 
|        "::.a_b\n"
 | 
|        " 0 ContextVar    level=0   begin=12  end=68  name=x\n"
 | 
| -      " 1 StackVar      scope=2   begin=46  end=68  name=c\n"
 | 
| -      " 2 ContextLevel  level=1   scope=3   begin=18  end=46\n"
 | 
| -      " 3 ContextVar    level=1   begin=19  end=46  name=i\n"
 | 
| -      " 4 StackVar      scope=4   begin=32  end=46  name=d\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
| +      " 2 StackVar      scope=2   begin=46  end=68  name=c\n"
 | 
| +      " 3 ContextLevel  level=1   scope=3   begin=18  end=46\n"
 | 
| +      " 4 ContextVar    level=1   begin=19  end=46  name=i\n"
 | 
| +      " 5 StackVar      scope=4   begin=32  end=46  name=d\n"
 | 
|  
 | 
|        "(dynamic) => dynamic.call\n"
 | 
|        " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
 | 
| -      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
 | 
| -      "   name=:saved_current_context_var\n"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
|  
 | 
|        "::.a\n"
 | 
|        " 0 ContextLevel  level=1   scope=1   begin=1   end=76\n"
 | 
| -      " 1 SavedEntryCtx scope=0   begin=0   end=0"
 | 
| +      " 1 CurrentCtx    scope=0   begin=0   end=0"
 | 
| +      "   name=:current_context_var\n"
 | 
| +      " 2 SavedEntryCtx scope=0   begin=0   end=0"
 | 
|        "   name=:saved_entry_context_var\n"
 | 
| -      " 2 ContextVar    level=1   begin=6   end=76  name=x\n"
 | 
| -      " 3 StackVar      scope=2   begin=11  end=76  name=b\n",
 | 
| +      " 3 ContextVar    level=1   begin=6   end=76  name=x\n"
 | 
| +      " 4 StackVar      scope=2   begin=11  end=76  name=b\n",
 | 
|        CaptureVarsAtLine(lib, "a", 10));
 | 
|  }
 | 
|  
 | 
| 
 |