Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(462)

Side by Side Diff: runtime/vm/parser_test.cc

Issue 2903993002: Remember deopt-id -> context-level mappings in var descriptors. (Closed)
Patch Set: update descriptor tests Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/scopes.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 5
6 #include "vm/ast_printer.h" 6 #include "vm/ast_printer.h"
7 #include "vm/class_finalizer.h" 7 #include "vm/class_finalizer.h"
8 #include "vm/debugger.h" 8 #include "vm/debugger.h"
9 #include "vm/longjump.h" 9 #include "vm/longjump.h"
10 #include "vm/object.h" 10 #include "vm/object.h"
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 " return param + value;\n" // line 4 265 " return param + value;\n" // line 4
266 " }\n" 266 " }\n"
267 " return f(22);\n" 267 " return f(22);\n"
268 "}\n"; 268 "}\n";
269 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 269 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
270 EXPECT_VALID(lib); 270 EXPECT_VALID(lib);
271 char* vars = CaptureVarsAtLine(lib, "main", 4); 271 char* vars = CaptureVarsAtLine(lib, "main", 4);
272 EXPECT_STREQ( 272 EXPECT_STREQ(
273 // function f uses one ctx var at (0); doesn't save ctx. 273 // function f uses one ctx var at (0); doesn't save ctx.
274 "main.f\n" 274 "main.f\n"
275 " 0 ContextVar level=0 begin=14 end=28 name=value\n" 275 " 0 ContextLevel level=0 begin=0 end=12\n"
276 " 1 StackVar scope=1 begin=16 end=28 name=param\n" 276 " 1 ContextVar level=0 begin=14 end=28 name=value\n"
277 " 2 CurrentCtx scope=0 begin=0 end=0" 277 " 2 StackVar scope=1 begin=16 end=28 name=param\n"
278 " name=:current_context_var\n" 278 " 3 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
279 279
280 // Closure call saves current context. 280 // Closure call saves current context.
281 "_Closure.call\n" 281 "_Closure.call\n"
282 " 0 StackVar scope=1 begin=0 end=4 name=this\n" 282 " 0 ContextLevel level=0 begin=0 end=8\n"
283 " 1 CurrentCtx scope=0 begin=0 end=0" 283 " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
284 " name=:current_context_var\n" 284 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
285 285
286 // function main uses one ctx var at (1); saves caller ctx. 286 // function main uses one ctx var at (1); saves caller ctx.
287 "main\n" 287 "main\n"
288 " 0 CurrentCtx scope=0 begin=0 end=0" 288 " 0 ContextLevel level=0 begin=0 end=6\n"
289 " name=:current_context_var\n" 289 " 1 ContextLevel level=1 begin=8 end=16\n"
290 " 1 ContextLevel level=1 scope=2 begin=4 end=37\n" 290 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
291 " 2 ContextVar level=1 begin=10 end=37 name=value\n" 291 " 3 ContextVar level=1 begin=10 end=37 name=value\n"
292 " 3 StackVar scope=2 begin=12 end=37 name=f\n", 292 " 4 StackVar scope=2 begin=12 end=37 name=f\n",
293 vars); 293 vars);
294 free(vars); 294 free(vars);
295 } 295 }
296 296
297 297
298 TEST_CASE(Parser_AllocateVariables_NestedCapturedVar) { 298 TEST_CASE(Parser_AllocateVariables_NestedCapturedVar) {
299 const char* kScriptChars = 299 const char* kScriptChars =
300 "int a() {\n" 300 "int a() {\n"
301 " int b() {\n" 301 " int b() {\n"
302 " var value = 11;\n" 302 " var value = 11;\n"
303 " int c() {\n" 303 " int c() {\n"
304 " return value;\n" // line 5 304 " return value;\n" // line 5
305 " }\n" 305 " }\n"
306 " return c();\n" 306 " return c();\n"
307 " }\n" 307 " }\n"
308 " return b();\n" 308 " return b();\n"
309 "}\n"; 309 "}\n";
310 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 310 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
311 EXPECT_VALID(lib); 311 EXPECT_VALID(lib);
312 char* vars = CaptureVarsAtLine(lib, "a", 5); 312 char* vars = CaptureVarsAtLine(lib, "a", 5);
313 EXPECT_STREQ( 313 EXPECT_STREQ(
314 // Innermost function uses captured variable 'value' from middle 314 // Innermost function uses captured variable 'value' from middle
315 // function. 315 // function.
316 "a.b.c\n" 316 "a.b.c\n"
317 " 0 ContextVar level=0 begin=20 end=30 name=value\n" 317 " 0 ContextLevel level=0 begin=0 end=10\n"
318 " 1 CurrentCtx scope=0 begin=0 end=0" 318 " 1 ContextVar level=0 begin=20 end=30 name=value\n"
319 " name=:current_context_var\n" 319 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
320 320
321 // Closure call saves current context. 321 // Closure call saves current context.
322 "_Closure.call\n" 322 "_Closure.call\n"
323 " 0 StackVar scope=1 begin=0 end=4 name=this\n" 323 " 0 ContextLevel level=0 begin=0 end=8\n"
324 " 1 CurrentCtx scope=0 begin=0 end=0" 324 " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
325 " name=:current_context_var\n" 325 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
326
327 // Middle function saves the entry context. Notice that this 326 // Middle function saves the entry context. Notice that this
328 // happens here and not in the outermost function. We always 327 // happens here and not in the outermost function. We always
329 // save the entry context at the last possible moment. 328 // save the entry context at the last possible moment.
330 "a.b\n" 329 "a.b\n"
331 " 0 CurrentCtx scope=0 begin=0 end=0" 330 " 0 ContextLevel level=0 begin=0 end=6\n"
332 " name=:current_context_var\n" 331 " 1 ContextLevel level=1 begin=8 end=16\n"
333 " 1 ContextLevel level=1 scope=2 begin=10 end=38\n" 332 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
334 " 2 ContextVar level=1 begin=16 end=38 name=value\n" 333 " 3 ContextVar level=1 begin=16 end=38 name=value\n"
335 " 3 StackVar scope=2 begin=18 end=38 name=c\n" 334 " 4 StackVar scope=2 begin=18 end=38 name=c\n"
336 335
337 // Closure call saves current context. 336 // Closure call saves current context.
338 "_Closure.call\n" 337 "_Closure.call\n"
339 " 0 StackVar scope=1 begin=0 end=4 name=this\n" 338 " 0 ContextLevel level=0 begin=0 end=8\n"
340 " 1 CurrentCtx scope=0 begin=0 end=0" 339 " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
341 " name=:current_context_var\n" 340 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
342 341
343 // Outermost function neglects to save the entry context. We 342 // Outermost function neglects to save the entry context. We
344 // don't save the entry context if the function has no captured 343 // don't save the entry context if the function has no captured
345 // variables. 344 // variables.
346 "a\n" 345 "a\n"
347 " 0 CurrentCtx scope=0 begin=0 end=0" 346 " 0 ContextLevel level=0 begin=0 end=14\n"
348 " name=:current_context_var\n" 347 " 1 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
349 " 1 StackVar scope=2 begin=6 end=46 name=b\n", 348 " 2 StackVar scope=2 begin=6 end=46 name=b\n",
350 vars); 349 vars);
351 free(vars); 350 free(vars);
352 } 351 }
353 352
354 353
355 TEST_CASE(Parser_AllocateVariables_TwoChains) { 354 TEST_CASE(Parser_AllocateVariables_TwoChains) {
356 const char* kScriptChars = 355 const char* kScriptChars =
357 "int a() {\n" 356 "int a() {\n"
358 " var value1 = 11;\n" 357 " var value1 = 11;\n"
359 " int b() {\n" 358 " int b() {\n"
360 " int aa() {\n" 359 " int aa() {\n"
361 " var value2 = 12;\n" 360 " var value2 = 12;\n"
362 " int bb() {\n" 361 " int bb() {\n"
363 " return value2;\n" // line 7 362 " return value2;\n" // line 7
364 " }\n" 363 " }\n"
365 " return bb();\n" 364 " return bb();\n"
366 " }\n" 365 " }\n"
367 " return value1 + aa();\n" 366 " return value1 + aa();\n"
368 " }\n" 367 " }\n"
369 " return b();\n" 368 " return b();\n"
370 "}\n"; 369 "}\n";
371 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 370 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
372 EXPECT_VALID(lib); 371 EXPECT_VALID(lib);
373 372
374 char* vars = CaptureVarsAtLine(lib, "a", 7); 373 char* vars = CaptureVarsAtLine(lib, "a", 7);
375 EXPECT_STREQ( 374 EXPECT_STREQ(
376 // bb captures only value2 from aa. No others. 375 // bb captures only value2 from aa. No others.
377 "a.b.aa.bb\n" 376 "a.b.aa.bb\n"
378 " 0 ContextVar level=0 begin=34 end=44 name=value2\n" 377 " 0 ContextLevel level=0 begin=0 end=10\n"
379 " 1 CurrentCtx scope=0 begin=0 end=0" 378 " 1 ContextVar level=0 begin=34 end=44 name=value2\n"
379 " 2 CurrentCtx scope=0 begin=0 end=0"
380 " name=:current_context_var\n" 380 " name=:current_context_var\n"
381 381
382 // Closure call saves current context. 382 // Closure call saves current context.
383 "_Closure.call\n" 383 "_Closure.call\n"
384 " 0 StackVar scope=1 begin=0 end=4 name=this\n" 384 " 0 ContextLevel level=0 begin=0 end=8\n"
385 " 1 CurrentCtx scope=0 begin=0 end=0" 385 " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
386 " 2 CurrentCtx scope=0 begin=0 end=0"
386 " name=:current_context_var\n" 387 " name=:current_context_var\n"
387 388
388 // aa shares value2. Notice that we save the entry ctx instead 389 // aa shares value2. Notice that we save the entry ctx instead
389 // of chaining from b. This keeps us from holding onto closures 390 // of chaining from b. This keeps us from holding onto closures
390 // that we would never access. 391 // that we would never access.
391 "a.b.aa\n" 392 "a.b.aa\n"
392 " 0 CurrentCtx scope=0 begin=0 end=0" 393 " 0 ContextLevel level=0 begin=0 end=6\n"
393 " name=:current_context_var\n" 394 " 1 ContextLevel level=1 begin=8 end=16\n"
394 " 1 ContextLevel level=1 scope=2 begin=22 end=53\n" 395 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
395 " 2 ContextVar level=1 begin=29 end=53 name=value2\n" 396 " 3 ContextVar level=1 begin=29 end=53 name=value2\n"
396 " 3 StackVar scope=2 begin=31 end=53 name=bb\n" 397 " 4 StackVar scope=2 begin=31 end=53 name=bb\n"
397 398
398 // Closure call saves current context. 399 // Closure call saves current context.
399 "_Closure.call\n" 400 "_Closure.call\n"
400 " 0 StackVar scope=1 begin=0 end=4 name=this\n" 401 " 0 ContextLevel level=0 begin=0 end=8\n"
401 " 1 CurrentCtx scope=0 begin=0 end=0" 402 " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
403 " 2 CurrentCtx scope=0 begin=0 end=0"
402 " name=:current_context_var\n" 404 " name=:current_context_var\n"
403 405
404 // b captures value1 from a. 406 // b captures value1 from a.
405 "a.b\n" 407 "a.b\n"
406 " 0 ContextVar level=0 begin=14 end=63 name=value1\n" 408 " 0 ContextLevel level=0 begin=0 end=16\n"
407 " 1 CurrentCtx scope=0 begin=0 end=0" 409 " 1 ContextVar level=0 begin=14 end=63 name=value1\n"
410 " 2 CurrentCtx scope=0 begin=0 end=0"
408 " name=:current_context_var\n" 411 " name=:current_context_var\n"
409 " 2 StackVar scope=2 begin=18 end=63 name=aa\n" 412 " 3 StackVar scope=2 begin=18 end=63 name=aa\n"
410 413
411 // Closure call saves current context. 414 // Closure call saves current context.
412 "_Closure.call\n" 415 "_Closure.call\n"
413 " 0 StackVar scope=1 begin=0 end=4 name=this\n" 416 " 0 ContextLevel level=0 begin=0 end=8\n"
414 " 1 CurrentCtx scope=0 begin=0 end=0" 417 " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
418 " 2 CurrentCtx scope=0 begin=0 end=0"
415 " name=:current_context_var\n" 419 " name=:current_context_var\n"
416 420
417 // a shares value1, saves entry ctx. 421 // a shares value1, saves entry ctx.
418 "a\n" 422 "a\n"
419 " 0 CurrentCtx scope=0 begin=0 end=0" 423 " 0 ContextLevel level=0 begin=0 end=6\n"
424 " 1 ContextLevel level=1 begin=8 end=16\n"
425 " 2 CurrentCtx scope=0 begin=0 end=0"
420 " name=:current_context_var\n" 426 " name=:current_context_var\n"
421 " 1 ContextLevel level=1 scope=2 begin=4 end=71\n" 427 " 3 ContextVar level=1 begin=10 end=71 name=value1\n"
422 " 2 ContextVar level=1 begin=10 end=71 name=value1\n" 428 " 4 StackVar scope=2 begin=12 end=71 name=b\n",
423 " 3 StackVar scope=2 begin=12 end=71 name=b\n",
424 vars); 429 vars);
425 free(vars); 430 free(vars);
426 } 431 }
427 432
428 433
429 TEST_CASE(Parser_AllocateVariables_Issue7681) { 434 TEST_CASE(Parser_AllocateVariables_Issue7681) {
430 // This is a distilled version of the program from Issue 7681. 435 // This is a distilled version of the program from Issue 7681.
431 // 436 //
432 // When we create the closure at line 11, we need to make sure to 437 // When we create the closure at line 11, we need to make sure to
433 // save the entry context instead of chaining to the parent context. 438 // save the entry context instead of chaining to the parent context.
(...skipping 17 matching lines...) Expand all
451 " };\n" 456 " };\n"
452 " };\n" 457 " };\n"
453 " x.onX(new Y());\n" 458 " x.onX(new Y());\n"
454 "}\n"; 459 "}\n";
455 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 460 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
456 EXPECT_VALID(lib); 461 EXPECT_VALID(lib);
457 char* vars = CaptureVarsAtLine(lib, "doIt", 12); 462 char* vars = CaptureVarsAtLine(lib, "doIt", 12);
458 EXPECT_STREQ( 463 EXPECT_STREQ(
459 // This frame saves the entry context instead of chaining. Good. 464 // This frame saves the entry context instead of chaining. Good.
460 "doIt.<anonymous closure>\n" 465 "doIt.<anonymous closure>\n"
461 " 0 ContextLevel level=1 scope=1 begin=41 end=65\n" 466 " 0 ContextLevel level=0 begin=0 end=0\n"
462 " 1 ContextVar level=1 begin=42 end=65 name=y\n" 467 " 1 ContextLevel level=1 begin=4 end=12\n"
463 " 2 CurrentCtx scope=0 begin=0 end=0" 468 " 2 ContextVar level=1 begin=42 end=65 name=y\n"
464 " name=:current_context_var\n" 469 " 3 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
465 470
466 // Closure call saves current context. 471 // Closure call saves current context.
467 "_Closure.call\n" 472 "_Closure.call\n"
468 " 0 StackVar scope=1 begin=0 end=4 name=this\n" 473 " 0 ContextLevel level=0 begin=0 end=8\n"
469 " 1 CurrentCtx scope=0 begin=0 end=0" 474 " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
470 " name=:current_context_var\n" 475 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
471 476
472 "X.onX\n" 477 "X.onX\n"
473 " 0 StackVar scope=1 begin=0 end=0 name=this\n" 478 " 0 ContextLevel level=0 begin=0 end=10\n"
474 " 1 CurrentCtx scope=0 begin=0 end=0" 479 " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
475 " name=:current_context_var\n" 480 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
476 481
477 // No context is saved here since no vars are captured. 482 // No context is saved here since no vars are captured.
478 "doIt\n" 483 "doIt\n"
479 " 0 CurrentCtx scope=0 begin=0 end=0" 484 " 0 ContextLevel level=0 begin=0 end=18\n"
480 " name=:current_context_var\n" 485 " 1 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
481 " 1 StackVar scope=2 begin=35 end=80 name=x\n", 486 " 2 StackVar scope=2 begin=35 end=80 name=x\n",
482 vars); 487 vars);
483 free(vars); 488 free(vars);
484 } 489 }
485 490
486 491
487 TEST_CASE(Parser_AllocateVariables_CaptureLoopVar) { 492 TEST_CASE(Parser_AllocateVariables_CaptureLoopVar) {
488 // This test verifies that... 493 // This test verifies that...
489 // 494 //
490 // https://code.google.com/p/dart/issues/detail?id=18561 495 // https://code.google.com/p/dart/issues/detail?id=18561
491 // 496 //
492 // ...stays fixed. 497 // ...stays fixed.
493 const char* kScriptChars = 498 const char* kScriptChars =
494 "int outer() {\n" 499 "int outer() {\n"
495 " for(int i = 0; i < 1; i++) {\n" 500 " for(int i = 0; i < 1; i++) {\n"
496 " var value = 11 + i;\n" 501 " var value = 11 + i;\n"
497 " int inner() {\n" 502 " int inner() {\n"
498 " return value;\n" // line 5 503 " return value;\n" // line 5
499 " }\n" 504 " }\n"
500 " return inner();\n" 505 " return inner();\n"
501 " }\n" 506 " }\n"
502 "}\n"; 507 "}\n";
503 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 508 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
504 EXPECT_VALID(lib); 509 EXPECT_VALID(lib);
505 char* vars = CaptureVarsAtLine(lib, "outer", 5); 510 char* vars = CaptureVarsAtLine(lib, "outer", 5);
506 EXPECT_STREQ( 511 EXPECT_STREQ(
507 // inner function captures variable value. That's fine. 512 // inner function captures variable value. That's fine.
508 "outer.inner\n" 513 "outer.inner\n"
509 " 0 ContextVar level=0 begin=33 end=43 name=value\n" 514 " 0 ContextLevel level=0 begin=0 end=10\n"
510 " 1 CurrentCtx scope=0 begin=0 end=0" 515 " 1 ContextVar level=0 begin=33 end=43 name=value\n"
511 " name=:current_context_var\n" 516 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
512 517
513 // Closure call saves current context. 518 // Closure call saves current context.
514 "_Closure.call\n" 519 "_Closure.call\n"
515 " 0 StackVar scope=1 begin=0 end=4 name=this\n" 520 " 0 ContextLevel level=0 begin=0 end=8\n"
516 " 1 CurrentCtx scope=0 begin=0 end=0" 521 " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
517 " name=:current_context_var\n" 522 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
518 523
519 // The outer function saves the entry context, even though the 524 // The outer function saves the entry context, even though the
520 // captured variable is in a loop. Good. 525 // captured variable is in a loop. Good.
521 "outer\n" 526 "outer\n"
522 " 0 CurrentCtx scope=0 begin=0 end=0" 527 " 0 ContextLevel level=0 begin=0 end=8\n"
523 " name=:current_context_var\n" 528 " 1 ContextLevel level=1 begin=10 end=18\n"
524 " 1 StackVar scope=3 begin=12 end=52 name=i\n" 529 " 2 ContextLevel level=0 begin=20 end=34\n"
525 " 2 ContextLevel level=1 scope=4 begin=20 end=52\n" 530 " 3 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
526 " 3 ContextVar level=1 begin=28 end=52 name=value\n" 531 " 4 StackVar scope=3 begin=12 end=52 name=i\n"
527 " 4 StackVar scope=4 begin=30 end=52 name=inner\n", 532 " 5 ContextVar level=1 begin=28 end=52 name=value\n"
533 " 6 StackVar scope=4 begin=30 end=52 name=inner\n",
528 vars); 534 vars);
529 free(vars); 535 free(vars);
530 } 536 }
531 537
532 TEST_CASE(Parser_AllocateVariables_MiddleChain) { 538 TEST_CASE(Parser_AllocateVariables_MiddleChain) {
533 const char* kScriptChars = 539 const char* kScriptChars =
534 "a() {\n" 540 "a() {\n"
535 " int x = 11;\n" 541 " int x = 11;\n"
536 " b() {\n" 542 " b() {\n"
537 " for (int i = 0; i < 1; i++) {\n" 543 " for (int i = 0; i < 1; i++) {\n"
538 " int d() {\n" 544 " int d() {\n"
539 " return i;\n" 545 " return i;\n"
540 " }\n" 546 " }\n"
541 " }\n" 547 " }\n"
542 " int c() {\n" 548 " int c() {\n"
543 " return x + 1;\n" // line 10 549 " return x + 1;\n" // line 10
544 " }\n" 550 " }\n"
545 " return c();\n" 551 " return c();\n"
546 " }\n" 552 " }\n"
547 " return b();\n" 553 " return b();\n"
548 "}\n"; 554 "}\n";
549 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 555 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
550 EXPECT_VALID(lib); 556 EXPECT_VALID(lib);
551 char* vars = CaptureVarsAtLine(lib, "a", 10); 557 char* vars = CaptureVarsAtLine(lib, "a", 10);
552 EXPECT_STREQ( 558 EXPECT_STREQ(
553 "a.b.c\n" 559 "a.b.c\n"
554 " 0 ContextVar level=0 begin=51 end=64 name=x\n" 560 " 0 ContextLevel level=0 begin=0 end=12\n"
555 " 1 CurrentCtx scope=0 begin=0 end=0" 561 " 1 ContextVar level=0 begin=51 end=64 name=x\n"
556 " name=:current_context_var\n" 562 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
563
557 "_Closure.call\n" 564 "_Closure.call\n"
558 " 0 StackVar scope=1 begin=0 end=4 name=this\n" 565 " 0 ContextLevel level=0 begin=0 end=8\n"
559 " 1 CurrentCtx scope=0 begin=0 end=0" 566 " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
560 " name=:current_context_var\n" 567 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
561 568
562 // Doesn't save the entry context. Chains to parent instead. 569 // Doesn't save the entry context. Chains to parent instead.
563 "a.b\n" 570 "a.b\n"
564 " 0 ContextVar level=0 begin=12 end=73 name=x\n" 571 " 0 ContextLevel level=0 begin=0 end=6\n"
565 " 1 CurrentCtx scope=0 begin=0 end=0" 572 " 1 ContextLevel level=1 begin=8 end=32\n"
566 " name=:current_context_var\n" 573 " 2 ContextLevel level=0 begin=34 end=40\n"
567 " 2 StackVar scope=2 begin=48 end=73 name=c\n" 574 " 3 ContextVar level=0 begin=12 end=73 name=x\n"
568 " 3 ContextLevel level=1 scope=3 begin=18 end=48\n" 575 " 4 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
569 " 4 ContextVar level=1 begin=22 end=48 name=i\n" 576 " 5 StackVar scope=2 begin=48 end=73 name=c\n"
570 " 5 StackVar scope=4 begin=33 end=48 name=d\n" 577 " 6 ContextVar level=1 begin=22 end=48 name=i\n"
578 " 7 StackVar scope=4 begin=33 end=48 name=d\n"
571 579
572 "_Closure.call\n" 580 "_Closure.call\n"
573 " 0 StackVar scope=1 begin=0 end=4 name=this\n" 581 " 0 ContextLevel level=0 begin=0 end=8\n"
574 " 1 CurrentCtx scope=0 begin=0 end=0" 582 " 1 StackVar scope=1 begin=-1 end=0 name=this\n"
575 " name=:current_context_var\n" 583 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
576 584
577 "a\n" 585 "a\n"
578 " 0 CurrentCtx scope=0 begin=0 end=0" 586 " 0 ContextLevel level=0 begin=0 end=6\n"
579 " name=:current_context_var\n" 587 " 1 ContextLevel level=1 begin=8 end=16\n"
580 " 1 ContextLevel level=1 scope=2 begin=3 end=81\n" 588 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
581 " 2 ContextVar level=1 begin=9 end=81 name=x\n" 589 " 3 ContextVar level=1 begin=9 end=81 name=x\n"
582 " 3 StackVar scope=2 begin=11 end=81 name=b\n", 590 " 4 StackVar scope=2 begin=11 end=81 name=b\n",
583 vars); 591 vars);
584 free(vars); 592 free(vars);
585 } 593 }
586 594
587 #endif // !PRODUCT 595 #endif // !PRODUCT
588 596
589 } // namespace dart 597 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/scopes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698