| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 import "package:expect/expect.dart"; | 5 import "package:expect/expect.dart"; |
| 6 import "package:compiler/src/js/js.dart"; | 6 import "package:compiler/src/js/js.dart"; |
| 7 import "package:compiler/src/js/rewrite_async.dart"; | 7 import "package:compiler/src/js/rewrite_async.dart"; |
| 8 import "package:compiler/src/js_backend/js_backend.dart" show StringBackedName; | 8 import "package:compiler/src/js_backend/js_backend.dart" show StringBackedName; |
| 9 | 9 |
| 10 void testTransform(String source, String expected, AsyncRewriterBase rewriter) { | 10 void testTransform(String source, String expected, AsyncRewriterBase rewriter) { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 // implicit return | 87 // implicit return |
| 88 return returnHelper(null, __completer); | 88 return returnHelper(null, __completer); |
| 89 } | 89 } |
| 90 }); | 90 }); |
| 91 return startHelper(body, __completer); | 91 return startHelper(body, __completer); |
| 92 }""") | 92 }""") |
| 93 | 93 |
| 94 /// 01: ok | 94 /// 01: ok |
| 95 ; | 95 ; |
| 96 | 96 |
| 97 testAsyncTransform( | 97 testAsyncTransform(""" |
| 98 """ | |
| 99 function(a) async { | 98 function(a) async { |
| 100 print(this.x); // Ensure `this` is translated in the helper function. | 99 print(this.x); // Ensure `this` is translated in the helper function. |
| 101 await foo(); | 100 await foo(); |
| 102 }""", | 101 }""", """ |
| 103 """ | |
| 104 function(a) { | 102 function(a) { |
| 105 var __goto = 0, __completer = NewCompleter(), __self = this; | 103 var __goto = 0, __completer = NewCompleter(), __self = this; |
| 106 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { | 104 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { |
| 107 if (__errorCode === 1) | 105 if (__errorCode === 1) |
| 108 return rethrowHelper(__result, __completer); | 106 return rethrowHelper(__result, __completer); |
| 109 while (true) | 107 while (true) |
| 110 switch (__goto) { | 108 switch (__goto) { |
| 111 case 0: | 109 case 0: |
| 112 // Function start | 110 // Function start |
| 113 print(__self.x); | 111 print(__self.x); |
| 114 __goto = 2; | 112 __goto = 2; |
| 115 return awaitHelper(foo(), body); | 113 return awaitHelper(foo(), body); |
| 116 case 2: | 114 case 2: |
| 117 // returning from await. | 115 // returning from await. |
| 118 // implicit return | 116 // implicit return |
| 119 return returnHelper(null, __completer); | 117 return returnHelper(null, __completer); |
| 120 } | 118 } |
| 121 }); | 119 }); |
| 122 return startHelper(body, __completer); | 120 return startHelper(body, __completer); |
| 123 }"""); | 121 }"""); |
| 124 | 122 |
| 125 testAsyncTransform( | 123 testAsyncTransform(""" |
| 126 """ | |
| 127 function(b) async { | 124 function(b) async { |
| 128 try { | 125 try { |
| 129 __outer: while (true) { // Overlapping label name. | 126 __outer: while (true) { // Overlapping label name. |
| 130 try { | 127 try { |
| 131 inner: while (true) { | 128 inner: while (true) { |
| 132 break __outer; // Break from untranslated loop to translated target. | 129 break __outer; // Break from untranslated loop to translated target. |
| 133 break; // break to untranslated target. | 130 break; // break to untranslated target. |
| 134 } | 131 } |
| 135 while (true) { | 132 while (true) { |
| 136 return; // Return via finallies. | 133 return; // Return via finallies. |
| 137 } | 134 } |
| 138 var __helper = await foo(); // Overlapping variable name. | 135 var __helper = await foo(); // Overlapping variable name. |
| 139 } finally { | 136 } finally { |
| 140 foo(); | 137 foo(); |
| 141 continue; // Continue from finally with pending finally. | 138 continue; // Continue from finally with pending finally. |
| 142 return 2; // Return from finally with pending finally. | 139 return 2; // Return from finally with pending finally. |
| 143 } | 140 } |
| 144 } | 141 } |
| 145 } finally { | 142 } finally { |
| 146 return 3; // Return from finally with no pending finally. | 143 return 3; // Return from finally with no pending finally. |
| 147 } | 144 } |
| 148 return 4; | 145 return 4; |
| 149 }""", | 146 }""", """ |
| 150 """ | |
| 151 function(b) { | 147 function(b) { |
| 152 var __goto = 0, __completer = NewCompleter(), __returnValue, __handler = 2, __
currentError, __next = [], __helper; | 148 var __goto = 0, __completer = NewCompleter(), __returnValue, __handler = 2, __
currentError, __next = [], __helper; |
| 153 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { | 149 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { |
| 154 if (__errorCode === 1) { | 150 if (__errorCode === 1) { |
| 155 __currentError = __result; | 151 __currentError = __result; |
| 156 __goto = __handler; | 152 __goto = __handler; |
| 157 } | 153 } |
| 158 while (true) | 154 while (true) |
| 159 __outer1: | 155 __outer1: |
| 160 switch (__goto) { | 156 switch (__goto) { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 // return | 237 // return |
| 242 return returnHelper(__returnValue, __completer); | 238 return returnHelper(__returnValue, __completer); |
| 243 case 2: | 239 case 2: |
| 244 // rethrow | 240 // rethrow |
| 245 return rethrowHelper(__currentError, __completer); | 241 return rethrowHelper(__currentError, __completer); |
| 246 } | 242 } |
| 247 }); | 243 }); |
| 248 return startHelper(body, __completer); | 244 return startHelper(body, __completer); |
| 249 }"""); | 245 }"""); |
| 250 | 246 |
| 251 testAsyncTransform( | 247 testAsyncTransform(""" |
| 252 """ | |
| 253 function(c) async { | 248 function(c) async { |
| 254 var a, b, c, d, e, f; | 249 var a, b, c, d, e, f; |
| 255 a = b++; // post- and preincrements. | 250 a = b++; // post- and preincrements. |
| 256 b = --b; | 251 b = --b; |
| 257 c = (await foo()).a++; | 252 c = (await foo()).a++; |
| 258 d = ++(await foo()).a; | 253 d = ++(await foo()).a; |
| 259 e = foo1()[await foo2()]--; | 254 e = foo1()[await foo2()]--; |
| 260 f = --foo1()[await foo2()]; | 255 f = --foo1()[await foo2()]; |
| 261 }""", | 256 }""", """ |
| 262 """ | |
| 263 function(c) { | 257 function(c) { |
| 264 var __goto = 0, __completer = NewCompleter(), a, b, c, d, e, f, __temp1; | 258 var __goto = 0, __completer = NewCompleter(), a, b, c, d, e, f, __temp1; |
| 265 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { | 259 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { |
| 266 if (__errorCode === 1) | 260 if (__errorCode === 1) |
| 267 return rethrowHelper(__result, __completer); | 261 return rethrowHelper(__result, __completer); |
| 268 while (true) | 262 while (true) |
| 269 switch (__goto) { | 263 switch (__goto) { |
| 270 case 0: | 264 case 0: |
| 271 // Function start | 265 // Function start |
| 272 a = b++; | 266 a = b++; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 293 case 5: | 287 case 5: |
| 294 // returning from await. | 288 // returning from await. |
| 295 f = --__temp1[__result]; | 289 f = --__temp1[__result]; |
| 296 // implicit return | 290 // implicit return |
| 297 return returnHelper(null, __completer); | 291 return returnHelper(null, __completer); |
| 298 } | 292 } |
| 299 }); | 293 }); |
| 300 return startHelper(body, __completer); | 294 return startHelper(body, __completer); |
| 301 }"""); | 295 }"""); |
| 302 | 296 |
| 303 testAsyncTransform( | 297 testAsyncTransform(""" |
| 304 """ | |
| 305 function(d2) async { | 298 function(d2) async { |
| 306 var a, b, c, d, e, f, g, h; // empty initializer | 299 var a, b, c, d, e, f, g, h; // empty initializer |
| 307 a = foo1() || await foo2(); // short circuiting operators | 300 a = foo1() || await foo2(); // short circuiting operators |
| 308 b = await foo1() || foo2(); | 301 b = await foo1() || foo2(); |
| 309 c = await foo1() || foo3(await foo2()); | 302 c = await foo1() || foo3(await foo2()); |
| 310 d = foo1() || foo2(); | 303 d = foo1() || foo2(); |
| 311 e = foo1() && await foo2(); | 304 e = foo1() && await foo2(); |
| 312 f = await foo1() && foo2(); | 305 f = await foo1() && foo2(); |
| 313 g = await foo1() && await foo2(); | 306 g = await foo1() && await foo2(); |
| 314 h = foo1() && foo2(); | 307 h = foo1() && foo2(); |
| 315 }""", | 308 }""", """ |
| 316 """ | |
| 317 function(d2) { | 309 function(d2) { |
| 318 var __goto = 0, __completer = NewCompleter(), a, b, c, d, e, f, g, h, __temp1; | 310 var __goto = 0, __completer = NewCompleter(), a, b, c, d, e, f, g, h, __temp1; |
| 319 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { | 311 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { |
| 320 if (__errorCode === 1) | 312 if (__errorCode === 1) |
| 321 return rethrowHelper(__result, __completer); | 313 return rethrowHelper(__result, __completer); |
| 322 while (true) | 314 while (true) |
| 323 switch (__goto) { | 315 switch (__goto) { |
| 324 case 0: | 316 case 0: |
| 325 // Function start | 317 // Function start |
| 326 __temp1 = foo1(); | 318 __temp1 = foo1(); |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 423 // join | 415 // join |
| 424 g = __result; | 416 g = __result; |
| 425 h = foo1() && foo2(); | 417 h = foo1() && foo2(); |
| 426 // implicit return | 418 // implicit return |
| 427 return returnHelper(null, __completer); | 419 return returnHelper(null, __completer); |
| 428 } | 420 } |
| 429 }); | 421 }); |
| 430 return startHelper(body, __completer); | 422 return startHelper(body, __completer); |
| 431 }"""); | 423 }"""); |
| 432 | 424 |
| 433 testAsyncTransform( | 425 testAsyncTransform(""" |
| 434 """ | |
| 435 function(x, y) async { | 426 function(x, y) async { |
| 436 while (true) { | 427 while (true) { |
| 437 switch(y) { // Switch with no awaits in case key expressions | 428 switch(y) { // Switch with no awaits in case key expressions |
| 438 case 0: | 429 case 0: |
| 439 case 1: | 430 case 1: |
| 440 await foo(); | 431 await foo(); |
| 441 continue; // Continue the loop, not the switch | 432 continue; // Continue the loop, not the switch |
| 442 case 1: // Duplicate case | 433 case 1: // Duplicate case |
| 443 await foo(); | 434 await foo(); |
| 444 break; // Break the switch | 435 break; // Break the switch |
| 445 case 2: | 436 case 2: |
| 446 foo(); // No default | 437 foo(); // No default |
| 447 } | 438 } |
| 448 } | 439 } |
| 449 }""", | 440 }""", """ |
| 450 """ | |
| 451 function(x, y) { | 441 function(x, y) { |
| 452 var __goto = 0, __completer = NewCompleter(); | 442 var __goto = 0, __completer = NewCompleter(); |
| 453 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { | 443 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { |
| 454 if (__errorCode === 1) | 444 if (__errorCode === 1) |
| 455 return rethrowHelper(__result, __completer); | 445 return rethrowHelper(__result, __completer); |
| 456 while (true) | 446 while (true) |
| 457 switch (__goto) { | 447 switch (__goto) { |
| 458 case 0: | 448 case 0: |
| 459 // Function start | 449 // Function start |
| 460 case 2: | 450 case 2: |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 514 break; | 504 break; |
| 515 case 3: | 505 case 3: |
| 516 // after while | 506 // after while |
| 517 // implicit return | 507 // implicit return |
| 518 return returnHelper(null, __completer); | 508 return returnHelper(null, __completer); |
| 519 } | 509 } |
| 520 }); | 510 }); |
| 521 return startHelper(body, __completer); | 511 return startHelper(body, __completer); |
| 522 }"""); | 512 }"""); |
| 523 | 513 |
| 524 testAsyncTransform( | 514 testAsyncTransform(""" |
| 525 """ | |
| 526 function(f) async { | 515 function(f) async { |
| 527 do { | 516 do { |
| 528 var a = await foo(); | 517 var a = await foo(); |
| 529 if (a) // If with no awaits in body | 518 if (a) // If with no awaits in body |
| 530 break; | 519 break; |
| 531 else | 520 else |
| 532 continue; | 521 continue; |
| 533 } while (await foo()); | 522 } while (await foo()); |
| 534 } | 523 } |
| 535 """, | 524 """, """ |
| 536 """ | |
| 537 function(f) { | 525 function(f) { |
| 538 var __goto = 0, __completer = NewCompleter(), a; | 526 var __goto = 0, __completer = NewCompleter(), a; |
| 539 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { | 527 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { |
| 540 if (__errorCode === 1) | 528 if (__errorCode === 1) |
| 541 return rethrowHelper(__result, __completer); | 529 return rethrowHelper(__result, __completer); |
| 542 while (true) | 530 while (true) |
| 543 switch (__goto) { | 531 switch (__goto) { |
| 544 case 0: | 532 case 0: |
| 545 // Function start | 533 // Function start |
| 546 case 2: | 534 case 2: |
| (...skipping 25 matching lines...) Expand all Loading... |
| 572 } | 560 } |
| 573 case 4: | 561 case 4: |
| 574 // after do | 562 // after do |
| 575 // implicit return | 563 // implicit return |
| 576 return returnHelper(null, __completer); | 564 return returnHelper(null, __completer); |
| 577 } | 565 } |
| 578 }); | 566 }); |
| 579 return startHelper(body, __completer); | 567 return startHelper(body, __completer); |
| 580 }"""); | 568 }"""); |
| 581 | 569 |
| 582 testAsyncTransform( | 570 testAsyncTransform(""" |
| 583 """ | |
| 584 function(g) async { | 571 function(g) async { |
| 585 for (var i = 0; i < await foo1(); i += await foo2()) { | 572 for (var i = 0; i < await foo1(); i += await foo2()) { |
| 586 if (foo(i)) | 573 if (foo(i)) |
| 587 continue; | 574 continue; |
| 588 else | 575 else |
| 589 break; | 576 break; |
| 590 if (!foo(i)) { // If with no else and await in body. | 577 if (!foo(i)) { // If with no else and await in body. |
| 591 await foo(); | 578 await foo(); |
| 592 return; | 579 return; |
| 593 } | 580 } |
| 594 print(await(foo(i))); | 581 print(await(foo(i))); |
| 595 } | 582 } |
| 596 } | 583 } |
| 597 """, | 584 """, """ |
| 598 """ | |
| 599 function(g) { | 585 function(g) { |
| 600 var __goto = 0, __completer = NewCompleter(), __returnValue, i, __temp1; | 586 var __goto = 0, __completer = NewCompleter(), __returnValue, i, __temp1; |
| 601 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { | 587 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { |
| 602 if (__errorCode === 1) | 588 if (__errorCode === 1) |
| 603 return rethrowHelper(__result, __completer); | 589 return rethrowHelper(__result, __completer); |
| 604 while (true) | 590 while (true) |
| 605 switch (__goto) { | 591 switch (__goto) { |
| 606 case 0: | 592 case 0: |
| 607 // Function start | 593 // Function start |
| 608 i = 0; | 594 i = 0; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 659 case 5: | 645 case 5: |
| 660 // after for | 646 // after for |
| 661 case 1: | 647 case 1: |
| 662 // return | 648 // return |
| 663 return returnHelper(__returnValue, __completer); | 649 return returnHelper(__returnValue, __completer); |
| 664 } | 650 } |
| 665 }); | 651 }); |
| 666 return startHelper(body, __completer); | 652 return startHelper(body, __completer); |
| 667 }"""); | 653 }"""); |
| 668 | 654 |
| 669 testAsyncTransform( | 655 testAsyncTransform(""" |
| 670 """ | |
| 671 function(a, h) async { | 656 function(a, h) async { |
| 672 var x = {"a": foo1(), "b": await foo2(), "c": foo3()}; | 657 var x = {"a": foo1(), "b": await foo2(), "c": foo3()}; |
| 673 x["a"] = 2; // Different assignments | 658 x["a"] = 2; // Different assignments |
| 674 (await foo()).a = 3; | 659 (await foo()).a = 3; |
| 675 x[await foo()] = 4; | 660 x[await foo()] = 4; |
| 676 x[(await foo1()).a = await foo2()] = 5; | 661 x[(await foo1()).a = await foo2()] = 5; |
| 677 (await foo1())[await foo2()] = await foo3(6); | 662 (await foo1())[await foo2()] = await foo3(6); |
| 678 } | 663 } |
| 679 """, | 664 """, """ |
| 680 """ | |
| 681 function(a, h) { | 665 function(a, h) { |
| 682 var __goto = 0, __completer = NewCompleter(), x, __temp1, __temp2; | 666 var __goto = 0, __completer = NewCompleter(), x, __temp1, __temp2; |
| 683 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { | 667 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { |
| 684 if (__errorCode === 1) | 668 if (__errorCode === 1) |
| 685 return rethrowHelper(__result, __completer); | 669 return rethrowHelper(__result, __completer); |
| 686 while (true) | 670 while (true) |
| 687 switch (__goto) { | 671 switch (__goto) { |
| 688 case 0: | 672 case 0: |
| 689 // Function start | 673 // Function start |
| 690 __temp1 = foo1(); | 674 __temp1 = foo1(); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 731 case 9: | 715 case 9: |
| 732 // returning from await. | 716 // returning from await. |
| 733 __temp1[__temp2] = __result; | 717 __temp1[__temp2] = __result; |
| 734 // implicit return | 718 // implicit return |
| 735 return returnHelper(null, __completer); | 719 return returnHelper(null, __completer); |
| 736 } | 720 } |
| 737 }); | 721 }); |
| 738 return startHelper(body, __completer); | 722 return startHelper(body, __completer); |
| 739 }"""); | 723 }"""); |
| 740 | 724 |
| 741 testAsyncTransform( | 725 testAsyncTransform(""" |
| 742 """ | |
| 743 function(c, i) async { | 726 function(c, i) async { |
| 744 try { | 727 try { |
| 745 var x = c ? await foo() : foo(); // conditional | 728 var x = c ? await foo() : foo(); // conditional |
| 746 var y = {}; | 729 var y = {}; |
| 747 } catch (error) { | 730 } catch (error) { |
| 748 try { | 731 try { |
| 749 x = c ? await fooError(error) : fooError(error); | 732 x = c ? await fooError(error) : fooError(error); |
| 750 } catch (error) { // nested error handler with overlapping name | 733 } catch (error) { // nested error handler with overlapping name |
| 751 y.x = foo(error); | 734 y.x = foo(error); |
| 752 } finally { | 735 } finally { |
| 753 foo(x); | 736 foo(x); |
| 754 } | 737 } |
| 755 } | 738 } |
| 756 } | 739 } |
| 757 """, | 740 """, """ |
| 758 """ | |
| 759 function(c, i) { | 741 function(c, i) { |
| 760 var __goto = 0, __completer = NewCompleter(), __handler = 1, __currentError, _
_next = [], x, y, __error, __error1; | 742 var __goto = 0, __completer = NewCompleter(), __handler = 1, __currentError, _
_next = [], x, y, __error, __error1; |
| 761 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { | 743 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { |
| 762 if (__errorCode === 1) { | 744 if (__errorCode === 1) { |
| 763 __currentError = __result; | 745 __currentError = __result; |
| 764 __goto = __handler; | 746 __goto = __handler; |
| 765 } | 747 } |
| 766 while (true) | 748 while (true) |
| 767 switch (__goto) { | 749 switch (__goto) { |
| 768 case 0: | 750 case 0: |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 850 // implicit return | 832 // implicit return |
| 851 return returnHelper(null, __completer); | 833 return returnHelper(null, __completer); |
| 852 case 1: | 834 case 1: |
| 853 // rethrow | 835 // rethrow |
| 854 return rethrowHelper(__currentError, __completer); | 836 return rethrowHelper(__currentError, __completer); |
| 855 } | 837 } |
| 856 }); | 838 }); |
| 857 return startHelper(body, __completer); | 839 return startHelper(body, __completer); |
| 858 }"""); | 840 }"""); |
| 859 | 841 |
| 860 testAsyncTransform( | 842 testAsyncTransform(""" |
| 861 """ | |
| 862 function(x, y, j) async { | 843 function(x, y, j) async { |
| 863 print(await(foo(x))); // calls | 844 print(await(foo(x))); // calls |
| 864 (await print)(foo(x)); | 845 (await print)(foo(x)); |
| 865 print(foo(await x)); | 846 print(foo(await x)); |
| 866 await (print(foo(await x))); | 847 await (print(foo(await x))); |
| 867 print(foo(x, await y, z)); | 848 print(foo(x, await y, z)); |
| 868 } | 849 } |
| 869 """, | 850 """, """ |
| 870 """ | |
| 871 function(x, y, j) { | 851 function(x, y, j) { |
| 872 var __goto = 0, __completer = NewCompleter(), __temp1, __temp2, __temp3; | 852 var __goto = 0, __completer = NewCompleter(), __temp1, __temp2, __temp3; |
| 873 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { | 853 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { |
| 874 if (__errorCode === 1) | 854 if (__errorCode === 1) |
| 875 return rethrowHelper(__result, __completer); | 855 return rethrowHelper(__result, __completer); |
| 876 while (true) | 856 while (true) |
| 877 switch (__goto) { | 857 switch (__goto) { |
| 878 case 0: | 858 case 0: |
| 879 // Function start | 859 // Function start |
| 880 __temp1 = print; | 860 __temp1 = print; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 913 case 7: | 893 case 7: |
| 914 // returning from await. | 894 // returning from await. |
| 915 __temp1(__temp2(__temp3, __result, z)); | 895 __temp1(__temp2(__temp3, __result, z)); |
| 916 // implicit return | 896 // implicit return |
| 917 return returnHelper(null, __completer); | 897 return returnHelper(null, __completer); |
| 918 } | 898 } |
| 919 }); | 899 }); |
| 920 return startHelper(body, __completer); | 900 return startHelper(body, __completer); |
| 921 }"""); | 901 }"""); |
| 922 | 902 |
| 923 testAsyncTransform( | 903 testAsyncTransform(""" |
| 924 """ | |
| 925 function(x, y, k) async { | 904 function(x, y, k) async { |
| 926 while (await(foo())) { | 905 while (await(foo())) { |
| 927 lab: { // labelled statement | 906 lab: { // labelled statement |
| 928 switch(y) { | 907 switch(y) { |
| 929 case 0: | 908 case 0: |
| 930 foo(); | 909 foo(); |
| 931 case 0: // Duplicate case | 910 case 0: // Duplicate case |
| 932 print(await foo1(x)); | 911 print(await foo1(x)); |
| 933 return y; | 912 return y; |
| 934 case await bar(): // await in case | 913 case await bar(): // await in case |
| 935 print(await foobar(x)); | 914 print(await foobar(x)); |
| 936 return y; | 915 return y; |
| 937 case x: | 916 case x: |
| 938 if (a) { | 917 if (a) { |
| 939 throw new Error(); | 918 throw new Error(); |
| 940 } else { | 919 } else { |
| 941 continue; | 920 continue; |
| 942 } | 921 } |
| 943 default: // default case | 922 default: // default case |
| 944 break lab; // break to label | 923 break lab; // break to label |
| 945 } | 924 } |
| 946 foo(); | 925 foo(); |
| 947 } | 926 } |
| 948 } | 927 } |
| 949 }""", | 928 }""", """ |
| 950 """ | |
| 951 function(x, y, k) { | 929 function(x, y, k) { |
| 952 var __goto = 0, __completer = NewCompleter(), __returnValue, __temp1; | 930 var __goto = 0, __completer = NewCompleter(), __returnValue, __temp1; |
| 953 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { | 931 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { |
| 954 if (__errorCode === 1) | 932 if (__errorCode === 1) |
| 955 return rethrowHelper(__result, __completer); | 933 return rethrowHelper(__result, __completer); |
| 956 while (true) | 934 while (true) |
| 957 switch (__goto) { | 935 switch (__goto) { |
| 958 case 0: | 936 case 0: |
| 959 // Function start | 937 // Function start |
| 960 case 3: | 938 case 3: |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1050 case 4: | 1028 case 4: |
| 1051 // after while | 1029 // after while |
| 1052 case 1: | 1030 case 1: |
| 1053 // return | 1031 // return |
| 1054 return returnHelper(__returnValue, __completer); | 1032 return returnHelper(__returnValue, __completer); |
| 1055 } | 1033 } |
| 1056 }); | 1034 }); |
| 1057 return startHelper(body, __completer); | 1035 return startHelper(body, __completer); |
| 1058 }"""); | 1036 }"""); |
| 1059 | 1037 |
| 1060 testAsyncTransform( | 1038 testAsyncTransform(""" |
| 1061 """ | |
| 1062 function(l) async { | 1039 function(l) async { |
| 1063 switch(await l) { | 1040 switch(await l) { |
| 1064 case 1: | 1041 case 1: |
| 1065 print(1); | 1042 print(1); |
| 1066 break; | 1043 break; |
| 1067 case 2: | 1044 case 2: |
| 1068 print(1); | 1045 print(1); |
| 1069 // Fallthrough | 1046 // Fallthrough |
| 1070 default: | 1047 default: |
| 1071 print(2); | 1048 print(2); |
| 1072 break; | 1049 break; |
| 1073 } | 1050 } |
| 1074 }""", | 1051 }""", """ |
| 1075 """ | |
| 1076 function(l) { | 1052 function(l) { |
| 1077 var __goto = 0, __completer = NewCompleter(); | 1053 var __goto = 0, __completer = NewCompleter(); |
| 1078 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { | 1054 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { |
| 1079 if (__errorCode === 1) | 1055 if (__errorCode === 1) |
| 1080 return rethrowHelper(__result, __completer); | 1056 return rethrowHelper(__result, __completer); |
| 1081 while (true) | 1057 while (true) |
| 1082 switch (__goto) { | 1058 switch (__goto) { |
| 1083 case 0: | 1059 case 0: |
| 1084 // Function start | 1060 // Function start |
| 1085 __goto = 2; | 1061 __goto = 2; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1096 print(2); | 1072 print(2); |
| 1097 break; | 1073 break; |
| 1098 } | 1074 } |
| 1099 // implicit return | 1075 // implicit return |
| 1100 return returnHelper(null, __completer); | 1076 return returnHelper(null, __completer); |
| 1101 } | 1077 } |
| 1102 }); | 1078 }); |
| 1103 return startHelper(body, __completer); | 1079 return startHelper(body, __completer); |
| 1104 }"""); | 1080 }"""); |
| 1105 | 1081 |
| 1106 testAsyncTransform( | 1082 testAsyncTransform(""" |
| 1107 """ | |
| 1108 function(m) async { | 1083 function(m) async { |
| 1109 var exception = 1; | 1084 var exception = 1; |
| 1110 try { | 1085 try { |
| 1111 await 42; | 1086 await 42; |
| 1112 throw 42; | 1087 throw 42; |
| 1113 } catch (exception) { | 1088 } catch (exception) { |
| 1114 exception = await 10; | 1089 exception = await 10; |
| 1115 exception += await 10; | 1090 exception += await 10; |
| 1116 exception++; | 1091 exception++; |
| 1117 exception--; | 1092 exception--; |
| 1118 ++exception; | 1093 ++exception; |
| 1119 --exception; | 1094 --exception; |
| 1120 exception += 10; | 1095 exception += 10; |
| 1121 } | 1096 } |
| 1122 print(exception); | 1097 print(exception); |
| 1123 }""", | 1098 }""", """ |
| 1124 """ | |
| 1125 function(m) { | 1099 function(m) { |
| 1126 var __goto = 0, __completer = NewCompleter(), __handler = 1, __currentError, _
_next = [], exception, __exception; | 1100 var __goto = 0, __completer = NewCompleter(), __handler = 1, __currentError, _
_next = [], exception, __exception; |
| 1127 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { | 1101 var body = _wrapJsFunctionForAsync(function(__errorCode, __result) { |
| 1128 if (__errorCode === 1) { | 1102 if (__errorCode === 1) { |
| 1129 __currentError = __result; | 1103 __currentError = __result; |
| 1130 __goto = __handler; | 1104 __goto = __handler; |
| 1131 } | 1105 } |
| 1132 while (true) | 1106 while (true) |
| 1133 switch (__goto) { | 1107 switch (__goto) { |
| 1134 case 0: | 1108 case 0: |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1177 // implicit return | 1151 // implicit return |
| 1178 return returnHelper(null, __completer); | 1152 return returnHelper(null, __completer); |
| 1179 case 1: | 1153 case 1: |
| 1180 // rethrow | 1154 // rethrow |
| 1181 return rethrowHelper(__currentError, __completer); | 1155 return rethrowHelper(__currentError, __completer); |
| 1182 } | 1156 } |
| 1183 }); | 1157 }); |
| 1184 return startHelper(body, __completer); | 1158 return startHelper(body, __completer); |
| 1185 }"""); | 1159 }"""); |
| 1186 | 1160 |
| 1187 testSyncStarTransform( | 1161 testSyncStarTransform(""" |
| 1188 """ | |
| 1189 function(a) sync* { | 1162 function(a) sync* { |
| 1190 // Ensure that return of a value is treated as first evaluating the value, and | 1163 // Ensure that return of a value is treated as first evaluating the value, and |
| 1191 // then returning. | 1164 // then returning. |
| 1192 return foo(); | 1165 return foo(); |
| 1193 }""", | 1166 }""", """ |
| 1194 """ | |
| 1195 function(__a) { | 1167 function(__a) { |
| 1196 return NewIterable(function() { | 1168 return NewIterable(function() { |
| 1197 var a = __a; | 1169 var a = __a; |
| 1198 var __goto = 0, __handler = 2, __currentError; | 1170 var __goto = 0, __handler = 2, __currentError; |
| 1199 return function body(__errorCode, __result) { | 1171 return function body(__errorCode, __result) { |
| 1200 if (__errorCode === 1) { | 1172 if (__errorCode === 1) { |
| 1201 __currentError = __result; | 1173 __currentError = __result; |
| 1202 __goto = __handler; | 1174 __goto = __handler; |
| 1203 } | 1175 } |
| 1204 while (true) | 1176 while (true) |
| 1205 switch (__goto) { | 1177 switch (__goto) { |
| 1206 case 0: | 1178 case 0: |
| 1207 // Function start | 1179 // Function start |
| 1208 foo(); | 1180 foo(); |
| 1209 // goto return | 1181 // goto return |
| 1210 __goto = 1; | 1182 __goto = 1; |
| 1211 break; | 1183 break; |
| 1212 case 1: | 1184 case 1: |
| 1213 // return | 1185 // return |
| 1214 return endOfIteration(); | 1186 return endOfIteration(); |
| 1215 case 2: | 1187 case 2: |
| 1216 // rethrow | 1188 // rethrow |
| 1217 return uncaughtError(__currentError); | 1189 return uncaughtError(__currentError); |
| 1218 } | 1190 } |
| 1219 }; | 1191 }; |
| 1220 }); | 1192 }); |
| 1221 }"""); | 1193 }"""); |
| 1222 } | 1194 } |
| OLD | NEW |