| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 #include "vm/flow_graph_builder.h" |
| 5 #include "vm/compiler.h" | 6 #include "vm/compiler.h" |
| 6 #include "vm/dart_api_impl.h" | 7 #include "vm/dart_api_impl.h" |
| 7 #include "vm/dart_entry.h" | 8 #include "vm/dart_entry.h" |
| 8 #include "vm/flow_graph_builder.h" | |
| 9 #include "vm/intermediate_language.h" | 9 #include "vm/intermediate_language.h" |
| 10 #include "vm/unit_test.h" | 10 #include "vm/unit_test.h" |
| 11 | 11 |
| 12 namespace dart { | 12 namespace dart { |
| 13 | 13 |
| 14 #ifndef PRODUCT | 14 #ifndef PRODUCT |
| 15 | 15 |
| 16 #define DUMP_ASSERT(condition) \ | 16 #define DUMP_ASSERT(condition) \ |
| 17 if (!(condition)) { \ | 17 if (!(condition)) { \ |
| 18 dart::Expect(__FILE__, __LINE__).Fail("expected: %s", #condition); \ | 18 dart::Expect(__FILE__, __LINE__).Fail("expected: %s", #condition); \ |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 Thread* thread_; | 273 Thread* thread_; |
| 274 Isolate* isolate_; | 274 Isolate* isolate_; |
| 275 const char* script_; | 275 const char* script_; |
| 276 Library& root_lib_; | 276 Library& root_lib_; |
| 277 Script& root_script_; | 277 Script& root_script_; |
| 278 const char* graph_name_; | 278 const char* graph_name_; |
| 279 FlowGraph* graph_; | 279 FlowGraph* graph_; |
| 280 GrowableArray<BlockEntryInstr*>* blocks_; | 280 GrowableArray<BlockEntryInstr*>* blocks_; |
| 281 }; | 281 }; |
| 282 | 282 |
| 283 | |
| 284 TEST_CASE(SourcePosition_InstanceCalls) { | 283 TEST_CASE(SourcePosition_InstanceCalls) { |
| 285 const char* kScript = | 284 const char* kScript = |
| 286 "var x = 5;\n" | 285 "var x = 5;\n" |
| 287 "var y = 5;\n" | 286 "var y = 5;\n" |
| 288 "main() {\n" | 287 "main() {\n" |
| 289 " var z = x + y;\n" | 288 " var z = x + y;\n" |
| 290 " return z;\n" | 289 " return z;\n" |
| 291 "}\n"; | 290 "}\n"; |
| 292 | 291 |
| 293 SourcePositionTest spt(thread, kScript); | 292 SourcePositionTest spt(thread, kScript); |
| 294 spt.BuildGraphFor("main"); | 293 spt.BuildGraphFor("main"); |
| 295 spt.FuzzyInstructionMatchAt("DebugStepCheck", 3, 5); | 294 spt.FuzzyInstructionMatchAt("DebugStepCheck", 3, 5); |
| 296 spt.FuzzyInstructionMatchAt("CheckStackOverflow", 3, 5); | 295 spt.FuzzyInstructionMatchAt("CheckStackOverflow", 3, 5); |
| 297 spt.InstanceCallAt(4, 13, Token::kADD); | 296 spt.InstanceCallAt(4, 13, Token::kADD); |
| 298 spt.FuzzyInstructionMatchAt("DebugStepCheck", 5, 3); | 297 spt.FuzzyInstructionMatchAt("DebugStepCheck", 5, 3); |
| 299 spt.FuzzyInstructionMatchAt("Return", 5, 3); | 298 spt.FuzzyInstructionMatchAt("Return", 5, 3); |
| 300 | 299 |
| 301 spt.EnsureSourcePositions(); | 300 spt.EnsureSourcePositions(); |
| 302 } | 301 } |
| 303 | 302 |
| 304 | |
| 305 TEST_CASE(SourcePosition_If) { | 303 TEST_CASE(SourcePosition_If) { |
| 306 const char* kScript = | 304 const char* kScript = |
| 307 "var x = 5;\n" | 305 "var x = 5;\n" |
| 308 "var y = 5;\n" | 306 "var y = 5;\n" |
| 309 "main() {\n" | 307 "main() {\n" |
| 310 " if (x != 0) {\n" | 308 " if (x != 0) {\n" |
| 311 " return x;\n" | 309 " return x;\n" |
| 312 " }\n" | 310 " }\n" |
| 313 " return y;\n" | 311 " return y;\n" |
| 314 "}\n"; | 312 "}\n"; |
| 315 | 313 |
| 316 SourcePositionTest spt(thread, kScript); | 314 SourcePositionTest spt(thread, kScript); |
| 317 spt.BuildGraphFor("main"); | 315 spt.BuildGraphFor("main"); |
| 318 spt.FuzzyInstructionMatchAt("DebugStepCheck", 3, 5); | 316 spt.FuzzyInstructionMatchAt("DebugStepCheck", 3, 5); |
| 319 spt.FuzzyInstructionMatchAt("CheckStackOverflow", 3, 5); | 317 spt.FuzzyInstructionMatchAt("CheckStackOverflow", 3, 5); |
| 320 spt.FuzzyInstructionMatchAt("LoadStaticField", 4, 7); | 318 spt.FuzzyInstructionMatchAt("LoadStaticField", 4, 7); |
| 321 spt.InstanceCallAt(4, 9, Token::kEQ); | 319 spt.InstanceCallAt(4, 9, Token::kEQ); |
| 322 spt.FuzzyInstructionMatchAt("Branch if StrictCompare", 4, 9); | 320 spt.FuzzyInstructionMatchAt("Branch if StrictCompare", 4, 9); |
| 323 spt.FuzzyInstructionMatchAt("LoadStaticField", 5, 12); | 321 spt.FuzzyInstructionMatchAt("LoadStaticField", 5, 12); |
| 324 spt.FuzzyInstructionMatchAt("DebugStepCheck", 5, 5); | 322 spt.FuzzyInstructionMatchAt("DebugStepCheck", 5, 5); |
| 325 spt.FuzzyInstructionMatchAt("Return", 5, 5); | 323 spt.FuzzyInstructionMatchAt("Return", 5, 5); |
| 326 spt.FuzzyInstructionMatchAt("LoadStaticField", 7, 10); | 324 spt.FuzzyInstructionMatchAt("LoadStaticField", 7, 10); |
| 327 spt.FuzzyInstructionMatchAt("DebugStepCheck", 7, 3); | 325 spt.FuzzyInstructionMatchAt("DebugStepCheck", 7, 3); |
| 328 spt.FuzzyInstructionMatchAt("Return", 7, 3); | 326 spt.FuzzyInstructionMatchAt("Return", 7, 3); |
| 329 | 327 |
| 330 spt.EnsureSourcePositions(); | 328 spt.EnsureSourcePositions(); |
| 331 } | 329 } |
| 332 | 330 |
| 333 | |
| 334 TEST_CASE(SourcePosition_ForLoop) { | 331 TEST_CASE(SourcePosition_ForLoop) { |
| 335 const char* kScript = | 332 const char* kScript = |
| 336 "var x = 0;\n" | 333 "var x = 0;\n" |
| 337 "var y = 5;\n" | 334 "var y = 5;\n" |
| 338 "main() {\n" | 335 "main() {\n" |
| 339 " for (var i = 0; i < 10; i++) {\n" | 336 " for (var i = 0; i < 10; i++) {\n" |
| 340 " x += i;\n" | 337 " x += i;\n" |
| 341 " }\n" | 338 " }\n" |
| 342 " return x;\n" | 339 " return x;\n" |
| 343 "}\n"; | 340 "}\n"; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 354 spt.FuzzyInstructionMatchAt("StoreStaticField", 5, 5); | 351 spt.FuzzyInstructionMatchAt("StoreStaticField", 5, 5); |
| 355 spt.InstanceCallAt(5, 7, Token::kADD); | 352 spt.InstanceCallAt(5, 7, Token::kADD); |
| 356 spt.FuzzyInstructionMatchAt("LoadLocal", 5, 10); | 353 spt.FuzzyInstructionMatchAt("LoadLocal", 5, 10); |
| 357 spt.FuzzyInstructionMatchAt("LoadStaticField", 7, 10); | 354 spt.FuzzyInstructionMatchAt("LoadStaticField", 7, 10); |
| 358 spt.FuzzyInstructionMatchAt("DebugStepCheck", 7, 3); | 355 spt.FuzzyInstructionMatchAt("DebugStepCheck", 7, 3); |
| 359 spt.FuzzyInstructionMatchAt("Return", 7, 3); | 356 spt.FuzzyInstructionMatchAt("Return", 7, 3); |
| 360 | 357 |
| 361 spt.EnsureSourcePositions(); | 358 spt.EnsureSourcePositions(); |
| 362 } | 359 } |
| 363 | 360 |
| 364 | |
| 365 TEST_CASE(SourcePosition_While) { | 361 TEST_CASE(SourcePosition_While) { |
| 366 const char* kScript = | 362 const char* kScript = |
| 367 "var x = 0;\n" | 363 "var x = 0;\n" |
| 368 "var y = 5;\n" | 364 "var y = 5;\n" |
| 369 "main() {\n" | 365 "main() {\n" |
| 370 " while (x < 10) {\n" | 366 " while (x < 10) {\n" |
| 371 " if (y == 5) {\n" | 367 " if (y == 5) {\n" |
| 372 " return y;\n" | 368 " return y;\n" |
| 373 " }\n" | 369 " }\n" |
| 374 " x++;\n" | 370 " x++;\n" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 403 spt.InstanceCallAt(8, 6, Token::kADD); | 399 spt.InstanceCallAt(8, 6, Token::kADD); |
| 404 spt.FuzzyInstructionMatchAt("StoreStaticField", 8, 5); | 400 spt.FuzzyInstructionMatchAt("StoreStaticField", 8, 5); |
| 405 | 401 |
| 406 spt.FuzzyInstructionMatchAt("LoadStaticField", 10, 10); | 402 spt.FuzzyInstructionMatchAt("LoadStaticField", 10, 10); |
| 407 spt.FuzzyInstructionMatchAt("DebugStepCheck", 10, 3); | 403 spt.FuzzyInstructionMatchAt("DebugStepCheck", 10, 3); |
| 408 spt.FuzzyInstructionMatchAt("Return", 10, 3); | 404 spt.FuzzyInstructionMatchAt("Return", 10, 3); |
| 409 | 405 |
| 410 spt.EnsureSourcePositions(); | 406 spt.EnsureSourcePositions(); |
| 411 } | 407 } |
| 412 | 408 |
| 413 | |
| 414 TEST_CASE(SourcePosition_WhileContinueBreak) { | 409 TEST_CASE(SourcePosition_WhileContinueBreak) { |
| 415 const char* kScript = | 410 const char* kScript = |
| 416 "var x = 0;\n" | 411 "var x = 0;\n" |
| 417 "var y = 5;\n" | 412 "var y = 5;\n" |
| 418 "main() {\n" | 413 "main() {\n" |
| 419 " while (x < 10) {\n" | 414 " while (x < 10) {\n" |
| 420 " if (y == 5) {\n" | 415 " if (y == 5) {\n" |
| 421 " continue;\n" | 416 " continue;\n" |
| 422 " }\n" | 417 " }\n" |
| 423 " break;\n" | 418 " break;\n" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 443 spt.InstanceCallAt(5, 11, Token::kEQ); | 438 spt.InstanceCallAt(5, 11, Token::kEQ); |
| 444 spt.FuzzyInstructionMatchAt("Branch if StrictCompare", 5, 11); | 439 spt.FuzzyInstructionMatchAt("Branch if StrictCompare", 5, 11); |
| 445 | 440 |
| 446 spt.FuzzyInstructionMatchAt("LoadStaticField", 10, 10); | 441 spt.FuzzyInstructionMatchAt("LoadStaticField", 10, 10); |
| 447 spt.FuzzyInstructionMatchAt("DebugStepCheck", 10, 3); | 442 spt.FuzzyInstructionMatchAt("DebugStepCheck", 10, 3); |
| 448 spt.FuzzyInstructionMatchAt("Return", 10, 3); | 443 spt.FuzzyInstructionMatchAt("Return", 10, 3); |
| 449 | 444 |
| 450 spt.EnsureSourcePositions(); | 445 spt.EnsureSourcePositions(); |
| 451 } | 446 } |
| 452 | 447 |
| 453 | |
| 454 TEST_CASE(SourcePosition_LoadIndexed) { | 448 TEST_CASE(SourcePosition_LoadIndexed) { |
| 455 const char* kScript = | 449 const char* kScript = |
| 456 "var x = 0;\n" | 450 "var x = 0;\n" |
| 457 "var z = new List(3);\n" | 451 "var z = new List(3);\n" |
| 458 "main() {\n" | 452 "main() {\n" |
| 459 " z[0];\n" | 453 " z[0];\n" |
| 460 " var y = z[0] + z[1] + z[2];\n" | 454 " var y = z[0] + z[1] + z[2];\n" |
| 461 "}\n"; | 455 "}\n"; |
| 462 | 456 |
| 463 SourcePositionTest spt(thread, kScript); | 457 SourcePositionTest spt(thread, kScript); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 482 | 476 |
| 483 spt.InstanceCallAt(5, 23, Token::kADD); | 477 spt.InstanceCallAt(5, 23, Token::kADD); |
| 484 | 478 |
| 485 spt.FuzzyInstructionMatchAt("Constant(#null)", 6, 1); | 479 spt.FuzzyInstructionMatchAt("Constant(#null)", 6, 1); |
| 486 spt.FuzzyInstructionMatchAt("DebugStepCheck", 6, 1); | 480 spt.FuzzyInstructionMatchAt("DebugStepCheck", 6, 1); |
| 487 spt.FuzzyInstructionMatchAt("Return", 6, 1); | 481 spt.FuzzyInstructionMatchAt("Return", 6, 1); |
| 488 | 482 |
| 489 spt.EnsureSourcePositions(); | 483 spt.EnsureSourcePositions(); |
| 490 } | 484 } |
| 491 | 485 |
| 492 | |
| 493 TEST_CASE(SourcePosition_StoreIndexed) { | 486 TEST_CASE(SourcePosition_StoreIndexed) { |
| 494 const char* kScript = | 487 const char* kScript = |
| 495 "var x = 0;\n" | 488 "var x = 0;\n" |
| 496 "var z = new List(4);\n" | 489 "var z = new List(4);\n" |
| 497 "main() {\n" | 490 "main() {\n" |
| 498 " z[0];\n" | 491 " z[0];\n" |
| 499 " z[3] = z[0] + z[1] + z[2];\n" | 492 " z[3] = z[0] + z[1] + z[2];\n" |
| 500 "}\n"; | 493 "}\n"; |
| 501 | 494 |
| 502 SourcePositionTest spt(thread, kScript); | 495 SourcePositionTest spt(thread, kScript); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 526 | 519 |
| 527 spt.InstanceCallAt(5, 4, Token::kASSIGN_INDEX); | 520 spt.InstanceCallAt(5, 4, Token::kASSIGN_INDEX); |
| 528 | 521 |
| 529 spt.FuzzyInstructionMatchAt("Constant(#null)", 6, 1); | 522 spt.FuzzyInstructionMatchAt("Constant(#null)", 6, 1); |
| 530 spt.FuzzyInstructionMatchAt("DebugStepCheck", 6, 1); | 523 spt.FuzzyInstructionMatchAt("DebugStepCheck", 6, 1); |
| 531 spt.FuzzyInstructionMatchAt("Return", 6, 1); | 524 spt.FuzzyInstructionMatchAt("Return", 6, 1); |
| 532 | 525 |
| 533 spt.EnsureSourcePositions(); | 526 spt.EnsureSourcePositions(); |
| 534 } | 527 } |
| 535 | 528 |
| 536 | |
| 537 TEST_CASE(SourcePosition_BitwiseOperations) { | 529 TEST_CASE(SourcePosition_BitwiseOperations) { |
| 538 const char* kScript = | 530 const char* kScript = |
| 539 "var x = 0;\n" | 531 "var x = 0;\n" |
| 540 "var y = 1;\n" | 532 "var y = 1;\n" |
| 541 "main() {\n" | 533 "main() {\n" |
| 542 " var z;\n" | 534 " var z;\n" |
| 543 " z = x & y;\n" | 535 " z = x & y;\n" |
| 544 " z = x | y;\n" | 536 " z = x | y;\n" |
| 545 " z = x ^ y;\n" | 537 " z = x ^ y;\n" |
| 546 " z = ~z;\n" | 538 " z = ~z;\n" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 576 spt.InstanceCallAt(8, 7, Token::kBIT_NOT); | 568 spt.InstanceCallAt(8, 7, Token::kBIT_NOT); |
| 577 spt.FuzzyInstructionMatchAt("StoreLocal(z", 8, 3); | 569 spt.FuzzyInstructionMatchAt("StoreLocal(z", 8, 3); |
| 578 | 570 |
| 579 spt.FuzzyInstructionMatchAt("LoadLocal(z", 9, 10); | 571 spt.FuzzyInstructionMatchAt("LoadLocal(z", 9, 10); |
| 580 spt.FuzzyInstructionMatchAt("DebugStepCheck", 9, 3); | 572 spt.FuzzyInstructionMatchAt("DebugStepCheck", 9, 3); |
| 581 spt.FuzzyInstructionMatchAt("Return", 9, 3); | 573 spt.FuzzyInstructionMatchAt("Return", 9, 3); |
| 582 | 574 |
| 583 spt.EnsureSourcePositions(); | 575 spt.EnsureSourcePositions(); |
| 584 } | 576 } |
| 585 | 577 |
| 586 | |
| 587 TEST_CASE(SourcePosition_IfElse) { | 578 TEST_CASE(SourcePosition_IfElse) { |
| 588 const char* kScript = | 579 const char* kScript = |
| 589 "var x = 5;\n" | 580 "var x = 5;\n" |
| 590 "var y = 5;\n" | 581 "var y = 5;\n" |
| 591 "main() {\n" | 582 "main() {\n" |
| 592 " if (x != 0) {\n" | 583 " if (x != 0) {\n" |
| 593 " return x;\n" | 584 " return x;\n" |
| 594 " } else {\n" | 585 " } else {\n" |
| 595 " return y;\n" | 586 " return y;\n" |
| 596 " }\n" | 587 " }\n" |
| 597 "}\n"; | 588 "}\n"; |
| 598 | 589 |
| 599 SourcePositionTest spt(thread, kScript); | 590 SourcePositionTest spt(thread, kScript); |
| 600 spt.BuildGraphFor("main"); | 591 spt.BuildGraphFor("main"); |
| 601 spt.FuzzyInstructionMatchAt("DebugStepCheck", 3, 5); | 592 spt.FuzzyInstructionMatchAt("DebugStepCheck", 3, 5); |
| 602 spt.FuzzyInstructionMatchAt("CheckStackOverflow", 3, 5); | 593 spt.FuzzyInstructionMatchAt("CheckStackOverflow", 3, 5); |
| 603 spt.FuzzyInstructionMatchAt("LoadStaticField", 4, 7); | 594 spt.FuzzyInstructionMatchAt("LoadStaticField", 4, 7); |
| 604 spt.InstanceCallAt(4, 9, Token::kEQ); | 595 spt.InstanceCallAt(4, 9, Token::kEQ); |
| 605 spt.FuzzyInstructionMatchAt("Branch if StrictCompare", 4, 9); | 596 spt.FuzzyInstructionMatchAt("Branch if StrictCompare", 4, 9); |
| 606 spt.FuzzyInstructionMatchAt("LoadStaticField", 5, 12); | 597 spt.FuzzyInstructionMatchAt("LoadStaticField", 5, 12); |
| 607 spt.FuzzyInstructionMatchAt("DebugStepCheck", 5, 5); | 598 spt.FuzzyInstructionMatchAt("DebugStepCheck", 5, 5); |
| 608 spt.FuzzyInstructionMatchAt("Return", 5, 5); | 599 spt.FuzzyInstructionMatchAt("Return", 5, 5); |
| 609 spt.FuzzyInstructionMatchAt("LoadStaticField", 7, 12); | 600 spt.FuzzyInstructionMatchAt("LoadStaticField", 7, 12); |
| 610 spt.FuzzyInstructionMatchAt("DebugStepCheck", 7, 5); | 601 spt.FuzzyInstructionMatchAt("DebugStepCheck", 7, 5); |
| 611 spt.FuzzyInstructionMatchAt("Return", 7, 5); | 602 spt.FuzzyInstructionMatchAt("Return", 7, 5); |
| 612 | 603 |
| 613 spt.EnsureSourcePositions(); | 604 spt.EnsureSourcePositions(); |
| 614 } | 605 } |
| 615 | 606 |
| 616 | |
| 617 TEST_CASE(SourcePosition_Switch) { | 607 TEST_CASE(SourcePosition_Switch) { |
| 618 const char* kScript = | 608 const char* kScript = |
| 619 "var x = 5;\n" | 609 "var x = 5;\n" |
| 620 "var y = 5;\n" | 610 "var y = 5;\n" |
| 621 "main() {\n" | 611 "main() {\n" |
| 622 " switch (x) {\n" | 612 " switch (x) {\n" |
| 623 " case 1: return 3;\n" | 613 " case 1: return 3;\n" |
| 624 " case 2: return 4;\n" | 614 " case 2: return 4;\n" |
| 625 " default: return 5;\n" | 615 " default: return 5;\n" |
| 626 " }\n" | 616 " }\n" |
| 627 "}\n"; | 617 "}\n"; |
| 628 | 618 |
| 629 | |
| 630 SourcePositionTest spt(thread, kScript); | 619 SourcePositionTest spt(thread, kScript); |
| 631 spt.BuildGraphFor("main"); | 620 spt.BuildGraphFor("main"); |
| 632 | 621 |
| 633 spt.FuzzyInstructionMatchAt("DebugStepCheck", 3, 5); | 622 spt.FuzzyInstructionMatchAt("DebugStepCheck", 3, 5); |
| 634 spt.FuzzyInstructionMatchAt("CheckStackOverflow", 3, 5); | 623 spt.FuzzyInstructionMatchAt("CheckStackOverflow", 3, 5); |
| 635 spt.FuzzyInstructionMatchAt("Constant(#Field", 4, 11); | 624 spt.FuzzyInstructionMatchAt("Constant(#Field", 4, 11); |
| 636 spt.FuzzyInstructionMatchAt("LoadStaticField", 4, 11); | 625 spt.FuzzyInstructionMatchAt("LoadStaticField", 4, 11); |
| 637 spt.FuzzyInstructionMatchAt("StoreLocal(:switch_expr", 4, 11); | 626 spt.FuzzyInstructionMatchAt("StoreLocal(:switch_expr", 4, 11); |
| 638 | 627 |
| 639 spt.FuzzyInstructionMatchAt("Constant(#1", 5, 10); | 628 spt.FuzzyInstructionMatchAt("Constant(#1", 5, 10); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 652 spt.FuzzyInstructionMatchAt("DebugStepCheck", 6, 13); | 641 spt.FuzzyInstructionMatchAt("DebugStepCheck", 6, 13); |
| 653 spt.FuzzyInstructionMatchAt("Return", 6, 13); | 642 spt.FuzzyInstructionMatchAt("Return", 6, 13); |
| 654 | 643 |
| 655 spt.FuzzyInstructionMatchAt("Constant(#5", 7, 21); // '5' | 644 spt.FuzzyInstructionMatchAt("Constant(#5", 7, 21); // '5' |
| 656 spt.FuzzyInstructionMatchAt("DebugStepCheck", 7, 14); | 645 spt.FuzzyInstructionMatchAt("DebugStepCheck", 7, 14); |
| 657 spt.FuzzyInstructionMatchAt("Return", 7, 14); | 646 spt.FuzzyInstructionMatchAt("Return", 7, 14); |
| 658 | 647 |
| 659 spt.EnsureSourcePositions(); | 648 spt.EnsureSourcePositions(); |
| 660 } | 649 } |
| 661 | 650 |
| 662 | |
| 663 TEST_CASE(SourcePosition_TryCatchFinally) { | 651 TEST_CASE(SourcePosition_TryCatchFinally) { |
| 664 const char* kScript = | 652 const char* kScript = |
| 665 "var x = 5;\n" | 653 "var x = 5;\n" |
| 666 "var y = 5;\n" | 654 "var y = 5;\n" |
| 667 "main() {\n" | 655 "main() {\n" |
| 668 " try {\n" | 656 " try {\n" |
| 669 " throw 'A';\n" | 657 " throw 'A';\n" |
| 670 " } catch (e) {\n" | 658 " } catch (e) {\n" |
| 671 " print(e);\n" | 659 " print(e);\n" |
| 672 " return 77;\n" | 660 " return 77;\n" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 704 | 692 |
| 705 spt.FuzzyInstructionMatchAt("LoadLocal(:saved_try_context", 9, 13); // '{' | 693 spt.FuzzyInstructionMatchAt("LoadLocal(:saved_try_context", 9, 13); // '{' |
| 706 spt.FuzzyInstructionMatchAt("StoreLocal(:current_context", 9, 13); // '{' | 694 spt.FuzzyInstructionMatchAt("StoreLocal(:current_context", 9, 13); // '{' |
| 707 | 695 |
| 708 spt.FuzzyInstructionMatchAt("Constant(#99", 10, 12); // '9' | 696 spt.FuzzyInstructionMatchAt("Constant(#99", 10, 12); // '9' |
| 709 spt.FuzzyInstructionMatchAt("Return", 10, 5); // 'r' | 697 spt.FuzzyInstructionMatchAt("Return", 10, 5); // 'r' |
| 710 | 698 |
| 711 spt.EnsureSourcePositions(); | 699 spt.EnsureSourcePositions(); |
| 712 } | 700 } |
| 713 | 701 |
| 714 | |
| 715 TEST_CASE(SourcePosition_InstanceFields) { | 702 TEST_CASE(SourcePosition_InstanceFields) { |
| 716 const char* kScript = | 703 const char* kScript = |
| 717 "class A {\n" | 704 "class A {\n" |
| 718 " var x;\n" | 705 " var x;\n" |
| 719 " var y;\n" | 706 " var y;\n" |
| 720 "}\n" | 707 "}\n" |
| 721 "main() {\n" | 708 "main() {\n" |
| 722 " var z = new A();\n" | 709 " var z = new A();\n" |
| 723 " z.x = 99;\n" | 710 " z.x = 99;\n" |
| 724 " z.y = z.x;\n" | 711 " z.y = z.x;\n" |
| 725 " return z.y;\n" | 712 " return z.y;\n" |
| 726 "}\n"; | 713 "}\n"; |
| 727 | 714 |
| 728 SourcePositionTest spt(thread, kScript); | 715 SourcePositionTest spt(thread, kScript); |
| 729 spt.BuildGraphFor("main"); | 716 spt.BuildGraphFor("main"); |
| 730 spt.FuzzyInstructionMatchAt("AllocateObject(A)", 6, 15); // 'A' | 717 spt.FuzzyInstructionMatchAt("AllocateObject(A)", 6, 15); // 'A' |
| 731 spt.FuzzyInstructionMatchAt("StaticCall", 6, 15); // 'A' | 718 spt.FuzzyInstructionMatchAt("StaticCall", 6, 15); // 'A' |
| 732 spt.FuzzyInstructionMatchAt("StoreLocal(z", 6, 9); // '=' | 719 spt.FuzzyInstructionMatchAt("StoreLocal(z", 6, 9); // '=' |
| 733 spt.InstanceCallAt("set:x", 7, 5); // 'x' | 720 spt.InstanceCallAt("set:x", 7, 5); // 'x' |
| 734 spt.InstanceCallAt("get:x", 8, 11); // 'x' | 721 spt.InstanceCallAt("get:x", 8, 11); // 'x' |
| 735 spt.InstanceCallAt("set:y", 8, 5); // 'y' | 722 spt.InstanceCallAt("set:y", 8, 5); // 'y' |
| 736 | 723 |
| 737 spt.InstanceCallAt("get:y", 9, 12); // 'y' | 724 spt.InstanceCallAt("get:y", 9, 12); // 'y' |
| 738 spt.FuzzyInstructionMatchAt("DebugStepCheck", 9, 3); | 725 spt.FuzzyInstructionMatchAt("DebugStepCheck", 9, 3); |
| 739 spt.FuzzyInstructionMatchAt("Return", 9, 3); | 726 spt.FuzzyInstructionMatchAt("Return", 9, 3); |
| 740 | 727 |
| 741 spt.EnsureSourcePositions(); | 728 spt.EnsureSourcePositions(); |
| 742 } | 729 } |
| 743 | 730 |
| 744 | |
| 745 TEST_CASE(SourcePosition_Async) { | 731 TEST_CASE(SourcePosition_Async) { |
| 746 const char* kScript = | 732 const char* kScript = |
| 747 "import 'dart:async';\n" | 733 "import 'dart:async';\n" |
| 748 "var x = 5;\n" | 734 "var x = 5;\n" |
| 749 "var y = 5;\n" | 735 "var y = 5;\n" |
| 750 "foo(Future f1, Future f2) async {\n" | 736 "foo(Future f1, Future f2) async {\n" |
| 751 " await f1;\n" | 737 " await f1;\n" |
| 752 " await f2;\n" | 738 " await f2;\n" |
| 753 " return 55;\n" | 739 " return 55;\n" |
| 754 "}\n" | 740 "}\n" |
| 755 "main() {\n" | 741 "main() {\n" |
| 756 " foo(new Future.value(33));\n" | 742 " foo(new Future.value(33));\n" |
| 757 "}\n"; | 743 "}\n"; |
| 758 | 744 |
| 759 SourcePositionTest spt(thread, kScript); | 745 SourcePositionTest spt(thread, kScript); |
| 760 spt.BuildGraphFor("foo"); | 746 spt.BuildGraphFor("foo"); |
| 761 spt.EnsureSourcePositions(); | 747 spt.EnsureSourcePositions(); |
| 762 spt.Dump(); | 748 spt.Dump(); |
| 763 } | 749 } |
| 764 | 750 |
| 765 #endif // !PRODUCT | 751 #endif // !PRODUCT |
| 766 | 752 |
| 767 static bool SyntheticRoundTripTest(TokenPosition token_pos) { | 753 static bool SyntheticRoundTripTest(TokenPosition token_pos) { |
| 768 const TokenPosition synthetic_token_pos = token_pos.ToSynthetic(); | 754 const TokenPosition synthetic_token_pos = token_pos.ToSynthetic(); |
| 769 return synthetic_token_pos.FromSynthetic() == token_pos; | 755 return synthetic_token_pos.FromSynthetic() == token_pos; |
| 770 } | 756 } |
| 771 | 757 |
| 772 | |
| 773 VM_UNIT_TEST_CASE(SourcePosition_SyntheticTokens) { | 758 VM_UNIT_TEST_CASE(SourcePosition_SyntheticTokens) { |
| 774 EXPECT(TokenPosition::kNoSourcePos == -1); | 759 EXPECT(TokenPosition::kNoSourcePos == -1); |
| 775 EXPECT(TokenPosition::kMinSourcePos == 0); | 760 EXPECT(TokenPosition::kMinSourcePos == 0); |
| 776 EXPECT(TokenPosition::kMaxSourcePos > 0); | 761 EXPECT(TokenPosition::kMaxSourcePos > 0); |
| 777 EXPECT(TokenPosition::kMaxSourcePos > TokenPosition::kMinSourcePos); | 762 EXPECT(TokenPosition::kMaxSourcePos > TokenPosition::kMinSourcePos); |
| 778 EXPECT(TokenPosition::kMinSource.value() == TokenPosition::kMinSourcePos); | 763 EXPECT(TokenPosition::kMinSource.value() == TokenPosition::kMinSourcePos); |
| 779 EXPECT(TokenPosition::kMaxSource.value() == TokenPosition::kMaxSourcePos); | 764 EXPECT(TokenPosition::kMaxSource.value() == TokenPosition::kMaxSourcePos); |
| 780 EXPECT(!TokenPosition(0).IsSynthetic()); | 765 EXPECT(!TokenPosition(0).IsSynthetic()); |
| 781 EXPECT(TokenPosition(0).ToSynthetic().IsSynthetic()); | 766 EXPECT(TokenPosition(0).ToSynthetic().IsSynthetic()); |
| 782 EXPECT(TokenPosition(9).ToSynthetic().IsSynthetic()); | 767 EXPECT(TokenPosition(9).ToSynthetic().IsSynthetic()); |
| 783 EXPECT(!TokenPosition(-1).FromSynthetic().IsSynthetic()); | 768 EXPECT(!TokenPosition(-1).FromSynthetic().IsSynthetic()); |
| 784 EXPECT(!TokenPosition::kNoSource.IsSynthetic()); | 769 EXPECT(!TokenPosition::kNoSource.IsSynthetic()); |
| 785 EXPECT(!TokenPosition::kLast.IsSynthetic()); | 770 EXPECT(!TokenPosition::kLast.IsSynthetic()); |
| 786 EXPECT(SyntheticRoundTripTest(TokenPosition(0))); | 771 EXPECT(SyntheticRoundTripTest(TokenPosition(0))); |
| 787 EXPECT(SyntheticRoundTripTest(TokenPosition::kMaxSource)); | 772 EXPECT(SyntheticRoundTripTest(TokenPosition::kMaxSource)); |
| 788 EXPECT(SyntheticRoundTripTest(TokenPosition::kMinSource)); | 773 EXPECT(SyntheticRoundTripTest(TokenPosition::kMinSource)); |
| 789 } | 774 } |
| 790 | 775 |
| 791 } // namespace dart | 776 } // namespace dart |
| OLD | NEW |