| Index: runtime/vm/parser_test.cc
|
| diff --git a/runtime/vm/parser_test.cc b/runtime/vm/parser_test.cc
|
| index 2e35b12ff0194477a94a8df282f047a11d7be2b6..f540eca522887da982820fa58f205265e2b23ae2 100644
|
| --- a/runtime/vm/parser_test.cc
|
| +++ b/runtime/vm/parser_test.cc
|
| @@ -272,24 +272,24 @@ TEST_CASE(Parser_AllocateVariables_CapturedVar) {
|
| EXPECT_STREQ(
|
| // function f uses one ctx var at (0); doesn't save ctx.
|
| "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"
|
| + " 0 ContextLevel level=0 begin=0 end=12\n"
|
| + " 1 ContextVar level=0 begin=14 end=28 name=value\n"
|
| + " 2 StackVar scope=1 begin=16 end=28 name=param\n"
|
| + " 3 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
|
|
|
| // Closure call saves current context.
|
| "_Closure.call\n"
|
| - " 0 StackVar scope=1 begin=0 end=4 name=this\n"
|
| - " 1 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| + " 0 ContextLevel level=0 begin=0 end=8\n"
|
| + " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
|
| + " 2 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 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| - " 1 ContextLevel level=1 scope=2 begin=4 end=37\n"
|
| - " 2 ContextVar level=1 begin=10 end=37 name=value\n"
|
| - " 3 StackVar scope=2 begin=12 end=37 name=f\n",
|
| + " 0 ContextLevel level=0 begin=0 end=6\n"
|
| + " 1 ContextLevel level=1 begin=8 end=16\n"
|
| + " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
|
| + " 3 ContextVar level=1 begin=10 end=37 name=value\n"
|
| + " 4 StackVar scope=2 begin=12 end=37 name=f\n",
|
| vars);
|
| free(vars);
|
| }
|
| @@ -314,39 +314,38 @@ TEST_CASE(Parser_AllocateVariables_NestedCapturedVar) {
|
| // Innermost function uses captured variable 'value' from middle
|
| // 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"
|
| + " 0 ContextLevel level=0 begin=0 end=10\n"
|
| + " 1 ContextVar level=0 begin=20 end=30 name=value\n"
|
| + " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
|
|
|
| // Closure call saves current context.
|
| "_Closure.call\n"
|
| - " 0 StackVar scope=1 begin=0 end=4 name=this\n"
|
| - " 1 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| -
|
| + " 0 ContextLevel level=0 begin=0 end=8\n"
|
| + " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
|
| + " 2 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 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| - " 1 ContextLevel level=1 scope=2 begin=10 end=38\n"
|
| - " 2 ContextVar level=1 begin=16 end=38 name=value\n"
|
| - " 3 StackVar scope=2 begin=18 end=38 name=c\n"
|
| + " 0 ContextLevel level=0 begin=0 end=6\n"
|
| + " 1 ContextLevel level=1 begin=8 end=16\n"
|
| + " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
|
| + " 3 ContextVar level=1 begin=16 end=38 name=value\n"
|
| + " 4 StackVar scope=2 begin=18 end=38 name=c\n"
|
|
|
| // Closure call saves current context.
|
| "_Closure.call\n"
|
| - " 0 StackVar scope=1 begin=0 end=4 name=this\n"
|
| - " 1 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| + " 0 ContextLevel level=0 begin=0 end=8\n"
|
| + " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
|
| + " 2 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 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| - " 1 StackVar scope=2 begin=6 end=46 name=b\n",
|
| + " 0 ContextLevel level=0 begin=0 end=14\n"
|
| + " 1 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
|
| + " 2 StackVar scope=2 begin=6 end=46 name=b\n",
|
| vars);
|
| free(vars);
|
| }
|
| @@ -375,52 +374,58 @@ TEST_CASE(Parser_AllocateVariables_TwoChains) {
|
| EXPECT_STREQ(
|
| // bb captures only value2 from aa. No others.
|
| "a.b.aa.bb\n"
|
| - " 0 ContextVar level=0 begin=34 end=44 name=value2\n"
|
| - " 1 CurrentCtx scope=0 begin=0 end=0"
|
| + " 0 ContextLevel level=0 begin=0 end=10\n"
|
| + " 1 ContextVar level=0 begin=34 end=44 name=value2\n"
|
| + " 2 CurrentCtx scope=0 begin=0 end=0"
|
| " name=:current_context_var\n"
|
|
|
| // Closure call saves current context.
|
| "_Closure.call\n"
|
| - " 0 StackVar scope=1 begin=0 end=4 name=this\n"
|
| - " 1 CurrentCtx scope=0 begin=0 end=0"
|
| + " 0 ContextLevel level=0 begin=0 end=8\n"
|
| + " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
|
| + " 2 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 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| - " 1 ContextLevel level=1 scope=2 begin=22 end=53\n"
|
| - " 2 ContextVar level=1 begin=29 end=53 name=value2\n"
|
| - " 3 StackVar scope=2 begin=31 end=53 name=bb\n"
|
| + " 0 ContextLevel level=0 begin=0 end=6\n"
|
| + " 1 ContextLevel level=1 begin=8 end=16\n"
|
| + " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
|
| + " 3 ContextVar level=1 begin=29 end=53 name=value2\n"
|
| + " 4 StackVar scope=2 begin=31 end=53 name=bb\n"
|
|
|
| // Closure call saves current context.
|
| "_Closure.call\n"
|
| - " 0 StackVar scope=1 begin=0 end=4 name=this\n"
|
| - " 1 CurrentCtx scope=0 begin=0 end=0"
|
| + " 0 ContextLevel level=0 begin=0 end=8\n"
|
| + " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
|
| + " 2 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=63 name=value1\n"
|
| - " 1 CurrentCtx scope=0 begin=0 end=0"
|
| + " 0 ContextLevel level=0 begin=0 end=16\n"
|
| + " 1 ContextVar level=0 begin=14 end=63 name=value1\n"
|
| + " 2 CurrentCtx scope=0 begin=0 end=0"
|
| " name=:current_context_var\n"
|
| - " 2 StackVar scope=2 begin=18 end=63 name=aa\n"
|
| + " 3 StackVar scope=2 begin=18 end=63 name=aa\n"
|
|
|
| // Closure call saves current context.
|
| "_Closure.call\n"
|
| - " 0 StackVar scope=1 begin=0 end=4 name=this\n"
|
| - " 1 CurrentCtx scope=0 begin=0 end=0"
|
| + " 0 ContextLevel level=0 begin=0 end=8\n"
|
| + " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
|
| + " 2 CurrentCtx scope=0 begin=0 end=0"
|
| " name=:current_context_var\n"
|
|
|
| // a shares value1, saves entry ctx.
|
| "a\n"
|
| - " 0 CurrentCtx scope=0 begin=0 end=0"
|
| + " 0 ContextLevel level=0 begin=0 end=6\n"
|
| + " 1 ContextLevel level=1 begin=8 end=16\n"
|
| + " 2 CurrentCtx scope=0 begin=0 end=0"
|
| " name=:current_context_var\n"
|
| - " 1 ContextLevel level=1 scope=2 begin=4 end=71\n"
|
| - " 2 ContextVar level=1 begin=10 end=71 name=value1\n"
|
| - " 3 StackVar scope=2 begin=12 end=71 name=b\n",
|
| + " 3 ContextVar level=1 begin=10 end=71 name=value1\n"
|
| + " 4 StackVar scope=2 begin=12 end=71 name=b\n",
|
| vars);
|
| free(vars);
|
| }
|
| @@ -458,27 +463,27 @@ TEST_CASE(Parser_AllocateVariables_Issue7681) {
|
| EXPECT_STREQ(
|
| // This frame saves the entry context instead of chaining. Good.
|
| "doIt.<anonymous closure>\n"
|
| - " 0 ContextLevel level=1 scope=1 begin=41 end=65\n"
|
| - " 1 ContextVar level=1 begin=42 end=65 name=y\n"
|
| - " 2 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| + " 0 ContextLevel level=0 begin=0 end=0\n"
|
| + " 1 ContextLevel level=1 begin=4 end=12\n"
|
| + " 2 ContextVar level=1 begin=42 end=65 name=y\n"
|
| + " 3 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
|
|
|
| // Closure call saves current context.
|
| "_Closure.call\n"
|
| - " 0 StackVar scope=1 begin=0 end=4 name=this\n"
|
| - " 1 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| + " 0 ContextLevel level=0 begin=0 end=8\n"
|
| + " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
|
| + " 2 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"
|
| + " 0 ContextLevel level=0 begin=0 end=10\n"
|
| + " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
|
| + " 2 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 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| - " 1 StackVar scope=2 begin=35 end=80 name=x\n",
|
| + " 0 ContextLevel level=0 begin=0 end=18\n"
|
| + " 1 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
|
| + " 2 StackVar scope=2 begin=35 end=80 name=x\n",
|
| vars);
|
| free(vars);
|
| }
|
| @@ -506,25 +511,26 @@ TEST_CASE(Parser_AllocateVariables_CaptureLoopVar) {
|
| EXPECT_STREQ(
|
| // inner function captures variable value. That's fine.
|
| "outer.inner\n"
|
| - " 0 ContextVar level=0 begin=33 end=43 name=value\n"
|
| - " 1 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| + " 0 ContextLevel level=0 begin=0 end=10\n"
|
| + " 1 ContextVar level=0 begin=33 end=43 name=value\n"
|
| + " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
|
|
|
| // Closure call saves current context.
|
| "_Closure.call\n"
|
| - " 0 StackVar scope=1 begin=0 end=4 name=this\n"
|
| - " 1 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| + " 0 ContextLevel level=0 begin=0 end=8\n"
|
| + " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
|
| + " 2 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 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| - " 1 StackVar scope=3 begin=12 end=52 name=i\n"
|
| - " 2 ContextLevel level=1 scope=4 begin=20 end=52\n"
|
| - " 3 ContextVar level=1 begin=28 end=52 name=value\n"
|
| - " 4 StackVar scope=4 begin=30 end=52 name=inner\n",
|
| + " 0 ContextLevel level=0 begin=0 end=8\n"
|
| + " 1 ContextLevel level=1 begin=10 end=18\n"
|
| + " 2 ContextLevel level=0 begin=20 end=34\n"
|
| + " 3 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
|
| + " 4 StackVar scope=3 begin=12 end=52 name=i\n"
|
| + " 5 ContextVar level=1 begin=28 end=52 name=value\n"
|
| + " 6 StackVar scope=4 begin=30 end=52 name=inner\n",
|
| vars);
|
| free(vars);
|
| }
|
| @@ -551,35 +557,37 @@ TEST_CASE(Parser_AllocateVariables_MiddleChain) {
|
| char* vars = CaptureVarsAtLine(lib, "a", 10);
|
| EXPECT_STREQ(
|
| "a.b.c\n"
|
| - " 0 ContextVar level=0 begin=51 end=64 name=x\n"
|
| - " 1 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| + " 0 ContextLevel level=0 begin=0 end=12\n"
|
| + " 1 ContextVar level=0 begin=51 end=64 name=x\n"
|
| + " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
|
| +
|
| "_Closure.call\n"
|
| - " 0 StackVar scope=1 begin=0 end=4 name=this\n"
|
| - " 1 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| + " 0 ContextLevel level=0 begin=0 end=8\n"
|
| + " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
|
| + " 2 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=73 name=x\n"
|
| - " 1 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| - " 2 StackVar scope=2 begin=48 end=73 name=c\n"
|
| - " 3 ContextLevel level=1 scope=3 begin=18 end=48\n"
|
| - " 4 ContextVar level=1 begin=22 end=48 name=i\n"
|
| - " 5 StackVar scope=4 begin=33 end=48 name=d\n"
|
| + " 0 ContextLevel level=0 begin=0 end=6\n"
|
| + " 1 ContextLevel level=1 begin=8 end=32\n"
|
| + " 2 ContextLevel level=0 begin=34 end=40\n"
|
| + " 3 ContextVar level=0 begin=12 end=73 name=x\n"
|
| + " 4 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
|
| + " 5 StackVar scope=2 begin=48 end=73 name=c\n"
|
| + " 6 ContextVar level=1 begin=22 end=48 name=i\n"
|
| + " 7 StackVar scope=4 begin=33 end=48 name=d\n"
|
|
|
| "_Closure.call\n"
|
| - " 0 StackVar scope=1 begin=0 end=4 name=this\n"
|
| - " 1 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| + " 0 ContextLevel level=0 begin=0 end=8\n"
|
| + " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
|
| + " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
|
|
|
| "a\n"
|
| - " 0 CurrentCtx scope=0 begin=0 end=0"
|
| - " name=:current_context_var\n"
|
| - " 1 ContextLevel level=1 scope=2 begin=3 end=81\n"
|
| - " 2 ContextVar level=1 begin=9 end=81 name=x\n"
|
| - " 3 StackVar scope=2 begin=11 end=81 name=b\n",
|
| + " 0 ContextLevel level=0 begin=0 end=6\n"
|
| + " 1 ContextLevel level=1 begin=8 end=16\n"
|
| + " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
|
| + " 3 ContextVar level=1 begin=9 end=81 name=x\n"
|
| + " 4 StackVar scope=2 begin=11 end=81 name=b\n",
|
| vars);
|
| free(vars);
|
| }
|
|
|