Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 import "package:expect/expect.dart"; | |
| 6 import "package:compiler/src/js/js.dart"; | |
| 7 import "package:compiler/src/js/rewrite_async.dart"; | |
| 8 | |
| 9 import "backend_dart/dart_printer_test.dart" show PrintDiagnosticListener; | |
| 10 | |
| 11 void testTransform(String source, String expected) { | |
| 12 Fun fun = js(source); | |
| 13 Fun rewritten = new AsyncRewriter( | |
| 14 thenHelper: new VariableUse("thenHelper"), | |
| 15 newController: new New(new VariableUse("newCompleter"), []), | |
| 16 endOfIteration: new VariableUse("endOfIteration"), | |
| 17 newIterable: new New(new VariableUse("newCompleter"), []), | |
| 18 safeVariableName: (String name) => "__$name").rewrite(fun); | |
| 19 Printer printer = new Printer(new PrintDiagnosticListener(), null); | |
| 20 printer.visit(rewritten); | |
| 21 Expect.stringEquals(expected, printer.outBuffer.getText()); | |
|
floitsch
2015/02/02 22:00:12
This is extremely brittle. Any change in the trans
sigurdm
2015/02/03 16:59:33
True - these tests were mostly useful while develo
| |
| 22 } | |
| 23 | |
| 24 main() { | |
| 25 testTransform(""" | |
| 26 function() async { | |
| 27 print(this.x); // Ensure `this` is translated in the helper function. | |
| 28 await foo(); | |
| 29 }""", """ | |
| 30 function() { | |
| 31 var __goto = 0, __completer = new newCompleter(), __self = this; | |
| 32 function __helper(__result) { | |
| 33 while (true) | |
| 34 switch (__goto) { | |
| 35 case 0: | |
| 36 // Function start | |
| 37 print(__self.x); | |
| 38 __goto = 1; | |
| 39 return thenHelper(foo(), __helper, __completer, null); | |
| 40 case 1: | |
| 41 // returning from await. | |
| 42 // implicit return | |
| 43 return thenHelper(null, null, __completer, null); | |
| 44 } | |
| 45 } | |
| 46 return thenHelper(null, __helper, __completer, null); | |
| 47 }"""); | |
| 48 | |
| 49 testTransform(""" | |
| 50 function() async { | |
| 51 try { | |
| 52 __outer: while (true) { // Overlapping label name. | |
| 53 try { | |
| 54 inner: while (true) { | |
| 55 break __outer; // Break from untranslated loop to translated target. | |
| 56 break; // break to untranslated target. | |
| 57 } | |
| 58 while (true) { | |
| 59 return; // Return via finallies. | |
| 60 } | |
| 61 var __helper = await foo(); // Overlapping variable name. | |
| 62 } finally { | |
| 63 foo(); | |
| 64 continue; // Continue from finally with pending finally. | |
| 65 return 2; // Return from finally with pending finally. | |
| 66 } | |
| 67 } | |
| 68 } finally { | |
| 69 return 3; // Return from finally with no pending finally. | |
| 70 } | |
| 71 return 4; | |
| 72 }""", """ | |
| 73 function() { | |
| 74 var __goto = 0, __completer = new newCompleter(), __handler = null, __next, __ returnValue, __helper; | |
| 75 function __helper1(__result) { | |
| 76 while (true) | |
| 77 try { | |
| 78 __outer1: | |
| 79 switch (__goto) { | |
| 80 case 0: | |
| 81 // Function start | |
| 82 __handler = 2; | |
| 83 case 6: | |
| 84 // continue __outer | |
| 85 case 7: | |
| 86 // while condition | |
| 87 if (!true) { | |
| 88 // goto after while | |
| 89 __goto = 8; | |
| 90 break; | |
| 91 } | |
| 92 __handler = 9; | |
| 93 inner: { | |
| 94 while (true) { | |
| 95 __next = [5]; | |
| 96 __goto = 10; | |
| 97 break __outer1; | |
| 98 break; | |
| 99 } | |
| 100 } | |
| 101 while (true) { | |
| 102 __next = [1, 3]; | |
| 103 __goto = 10; | |
| 104 break __outer1; | |
| 105 } | |
| 106 __goto = 12; | |
| 107 return thenHelper(foo(), __helper1, __completer, function(__error) { | |
| 108 __goto = 9; | |
| 109 __helper1(__error); | |
| 110 }); | |
| 111 case 12: | |
| 112 // returning from await. | |
| 113 __helper = __result; | |
| 114 __handler = 2; | |
| 115 __next = [11]; | |
| 116 // goto finally | |
| 117 __goto = 10; | |
| 118 break; | |
| 119 case 9: | |
| 120 // catch | |
| 121 __next = [11]; | |
| 122 case 10: | |
| 123 // finally | |
| 124 foo(); | |
| 125 // goto while condition | |
| 126 __goto = 7; | |
| 127 break; | |
| 128 __returnValue = 2; | |
| 129 __next = [1]; | |
| 130 // goto finally | |
| 131 __goto = 3; | |
| 132 break; | |
| 133 // goto the next finally handler | |
| 134 __goto = __next.pop(); | |
| 135 break; | |
| 136 case 11: | |
| 137 // after finally | |
| 138 // goto while condition | |
| 139 __goto = 7; | |
| 140 break; | |
| 141 case 8: | |
| 142 // after while | |
| 143 case 5: | |
| 144 // break __outer | |
| 145 __handler = null; | |
| 146 __next = [4]; | |
| 147 // goto finally | |
| 148 __goto = 3; | |
| 149 break; | |
| 150 case 2: | |
| 151 // catch | |
| 152 __next = [4]; | |
| 153 case 3: | |
| 154 // finally | |
| 155 __returnValue = 3; | |
| 156 // goto Return | |
| 157 __goto = 1; | |
| 158 break; | |
| 159 // goto the next finally handler | |
| 160 __goto = __next.pop(); | |
| 161 break; | |
| 162 case 4: | |
| 163 // after finally | |
| 164 __returnValue = 4; | |
| 165 // goto Return | |
| 166 __goto = 1; | |
| 167 break; | |
| 168 case 1: | |
| 169 // Return | |
| 170 return thenHelper(__returnValue, null, __completer, null); | |
| 171 } | |
| 172 } catch (__error) { | |
| 173 if (__handler === null) | |
| 174 throw __error; | |
| 175 __result = __error; | |
| 176 __goto = __handler; | |
| 177 } | |
| 178 | |
| 179 } | |
| 180 return thenHelper(null, __helper1, __completer, null); | |
| 181 }"""); | |
| 182 testTransform(""" | |
| 183 function() async { | |
| 184 var a, b, c, d, e, f; | |
| 185 a = b++; // post- and preincrements. | |
| 186 b = --b; | |
| 187 c = (await foo()).a++; | |
| 188 d = ++(await foo()).a; | |
| 189 e = foo1()[await foo2()]--; | |
| 190 f = --foo1()[await foo2()]; | |
| 191 }""", """ | |
| 192 function() { | |
| 193 var __goto = 0, __completer = new newCompleter(), a, b, c, d, e, f, __temp1; | |
| 194 function __helper(__result) { | |
| 195 while (true) | |
| 196 switch (__goto) { | |
| 197 case 0: | |
| 198 // Function start | |
| 199 a = b++; | |
| 200 b = --b; | |
| 201 __goto = 1; | |
| 202 return thenHelper(foo(), __helper, __completer, null); | |
| 203 case 1: | |
| 204 // returning from await. | |
| 205 c = __result.a++; | |
| 206 __goto = 2; | |
| 207 return thenHelper(foo(), __helper, __completer, null); | |
| 208 case 2: | |
| 209 // returning from await. | |
| 210 d = ++__result.a; | |
| 211 __temp1 = foo1(); | |
| 212 __goto = 3; | |
| 213 return thenHelper(foo2(), __helper, __completer, null); | |
| 214 case 3: | |
| 215 // returning from await. | |
| 216 e = __temp1[__result]--; | |
| 217 __temp1 = foo1(); | |
| 218 __goto = 4; | |
| 219 return thenHelper(foo2(), __helper, __completer, null); | |
| 220 case 4: | |
| 221 // returning from await. | |
| 222 f = --__temp1[__result]; | |
| 223 // implicit return | |
| 224 return thenHelper(null, null, __completer, null); | |
| 225 } | |
| 226 } | |
| 227 return thenHelper(null, __helper, __completer, null); | |
| 228 }"""); | |
| 229 testTransform(""" | |
| 230 function() async { | |
| 231 var a, b, c, d, e, f, g, h; // empty initializer | |
| 232 a = foo1() || await foo2(); // short circuiting operators | |
| 233 b = await foo1() || foo2(); | |
| 234 c = await foo1() || foo3(await foo2()); | |
| 235 d = foo1() || foo2(); | |
| 236 e = foo1() && await foo2(); | |
| 237 f = await foo1() && foo2(); | |
| 238 g = await foo1() && await foo2(); | |
| 239 h = foo1() && foo2(); | |
| 240 }""", """ | |
| 241 function() { | |
| 242 var __goto = 0, __completer = new newCompleter(), a, b, c, d, e, f, g, h, __te mp1; | |
| 243 function __helper(__result) { | |
| 244 while (true) | |
| 245 switch (__goto) { | |
| 246 case 0: | |
| 247 // Function start | |
| 248 __temp1 = foo1(); | |
| 249 if (__temp1) { | |
| 250 // goto then | |
| 251 __goto = 1; | |
| 252 break; | |
| 253 } else | |
| 254 __result = __temp1; | |
| 255 // goto join | |
| 256 __goto = 2; | |
| 257 break; | |
| 258 case 1: | |
| 259 // then | |
| 260 __goto = 3; | |
| 261 return thenHelper(foo2(), __helper, __completer, null); | |
| 262 case 3: | |
| 263 // returning from await. | |
| 264 case 2: | |
| 265 // join | |
| 266 a = __result; | |
| 267 __goto = 4; | |
| 268 return thenHelper(foo1(), __helper, __completer, null); | |
| 269 case 4: | |
| 270 // returning from await. | |
| 271 b = __result || foo2(); | |
| 272 __goto = 7; | |
| 273 return thenHelper(foo1(), __helper, __completer, null); | |
| 274 case 7: | |
| 275 // returning from await. | |
| 276 __temp1 = __result; | |
| 277 if (__temp1) { | |
| 278 // goto then | |
| 279 __goto = 5; | |
| 280 break; | |
| 281 } else | |
| 282 __result = __temp1; | |
| 283 // goto join | |
| 284 __goto = 6; | |
| 285 break; | |
| 286 case 5: | |
| 287 // then | |
| 288 __temp1 = foo3; | |
| 289 __goto = 8; | |
| 290 return thenHelper(foo2(), __helper, __completer, null); | |
| 291 case 8: | |
| 292 // returning from await. | |
| 293 __result = __temp1(__result); | |
| 294 case 6: | |
| 295 // join | |
| 296 c = __result; | |
| 297 d = foo1() || foo2(); | |
| 298 __temp1 = foo1(); | |
| 299 if (__temp1) | |
| 300 __result = __temp1; | |
| 301 else { | |
| 302 // goto then | |
| 303 __goto = 9; | |
| 304 break; | |
| 305 } | |
| 306 // goto join | |
| 307 __goto = 10; | |
| 308 break; | |
| 309 case 9: | |
| 310 // then | |
| 311 __goto = 11; | |
| 312 return thenHelper(foo2(), __helper, __completer, null); | |
| 313 case 11: | |
| 314 // returning from await. | |
| 315 case 10: | |
| 316 // join | |
| 317 e = __result; | |
| 318 __goto = 12; | |
| 319 return thenHelper(foo1(), __helper, __completer, null); | |
| 320 case 12: | |
| 321 // returning from await. | |
| 322 f = __result && foo2(); | |
| 323 __goto = 15; | |
| 324 return thenHelper(foo1(), __helper, __completer, null); | |
| 325 case 15: | |
| 326 // returning from await. | |
| 327 __temp1 = __result; | |
| 328 if (__temp1) | |
| 329 __result = __temp1; | |
| 330 else { | |
| 331 // goto then | |
| 332 __goto = 13; | |
| 333 break; | |
| 334 } | |
| 335 // goto join | |
| 336 __goto = 14; | |
| 337 break; | |
| 338 case 13: | |
| 339 // then | |
| 340 __goto = 16; | |
| 341 return thenHelper(foo2(), __helper, __completer, null); | |
| 342 case 16: | |
| 343 // returning from await. | |
| 344 case 14: | |
| 345 // join | |
| 346 g = __result; | |
| 347 h = foo1() && foo2(); | |
| 348 // implicit return | |
| 349 return thenHelper(null, null, __completer, null); | |
| 350 } | |
| 351 } | |
| 352 return thenHelper(null, __helper, __completer, null); | |
| 353 }"""); | |
| 354 testTransform(""" | |
| 355 function(x, y) async { | |
| 356 while (true) { | |
| 357 switch(y) { // Switch with no awaits in case key expressions | |
| 358 case 0: | |
| 359 case 1: | |
| 360 await foo(); | |
| 361 continue; // Continue the loop, not the switch | |
| 362 case 1: // Duplicate case | |
| 363 await foo(); | |
| 364 break; // Break the switch | |
| 365 case 2: | |
| 366 foo(); // No default | |
| 367 } | |
| 368 } | |
| 369 }""", """ | |
| 370 function(x, y) { | |
| 371 var __goto = 0, __completer = new newCompleter(); | |
| 372 function __helper(__result) { | |
| 373 while (true) | |
| 374 switch (__goto) { | |
| 375 case 0: | |
| 376 // Function start | |
| 377 case 1: | |
| 378 // while condition | |
| 379 if (!true) { | |
| 380 // goto after while | |
| 381 __goto = 2; | |
| 382 break; | |
| 383 } | |
| 384 case 3: | |
| 385 // switch | |
| 386 switch (y) { | |
| 387 case 0: | |
| 388 // goto case | |
| 389 __goto = 5; | |
| 390 break; | |
| 391 case 1: | |
| 392 // goto case | |
| 393 __goto = 6; | |
| 394 break; | |
| 395 case 1: | |
| 396 // goto case | |
| 397 __goto = 7; | |
| 398 break; | |
| 399 case 2: | |
| 400 // goto case | |
| 401 __goto = 8; | |
| 402 break; | |
| 403 } | |
| 404 // goto after switch | |
| 405 __goto = 4; | |
| 406 break; | |
| 407 case 5: | |
| 408 // case | |
| 409 case 6: | |
| 410 // case | |
| 411 __goto = 9; | |
| 412 return thenHelper(foo(), __helper, __completer, null); | |
| 413 case 9: | |
| 414 // returning from await. | |
| 415 // goto while condition | |
| 416 __goto = 1; | |
| 417 break; | |
| 418 case 7: | |
| 419 // case | |
| 420 __goto = 10; | |
| 421 return thenHelper(foo(), __helper, __completer, null); | |
| 422 case 10: | |
| 423 // returning from await. | |
| 424 // goto after switch | |
| 425 __goto = 4; | |
| 426 break; | |
| 427 case 8: | |
| 428 // case | |
| 429 foo(); | |
| 430 case 4: | |
| 431 // after switch | |
| 432 // goto while condition | |
| 433 __goto = 1; | |
| 434 break; | |
| 435 case 2: | |
| 436 // after while | |
| 437 // implicit return | |
| 438 return thenHelper(null, null, __completer, null); | |
| 439 } | |
| 440 } | |
| 441 return thenHelper(null, __helper, __completer, null); | |
| 442 }"""); | |
| 443 testTransform(""" | |
| 444 function() async { | |
| 445 do { | |
| 446 var a = await foo(); | |
| 447 if (a) // If with no awaits in body | |
| 448 break; | |
| 449 else | |
| 450 continue; | |
| 451 } while (await foo()); | |
| 452 } | |
| 453 """, """ | |
| 454 function() { | |
| 455 var __goto = 0, __completer = new newCompleter(), a; | |
| 456 function __helper(__result) { | |
| 457 while (true) | |
| 458 switch (__goto) { | |
| 459 case 0: | |
| 460 // Function start | |
| 461 case 1: | |
| 462 // do body | |
| 463 __goto = 4; | |
| 464 return thenHelper(foo(), __helper, __completer, null); | |
| 465 case 4: | |
| 466 // returning from await. | |
| 467 a = __result; | |
| 468 if (a) { | |
| 469 // goto after do | |
| 470 __goto = 3; | |
| 471 break; | |
| 472 } else { | |
| 473 // goto do condition | |
| 474 __goto = 2; | |
| 475 break; | |
| 476 } | |
| 477 case 2: | |
| 478 // do condition | |
| 479 __goto = 5; | |
| 480 return thenHelper(foo(), __helper, __completer, null); | |
| 481 case 5: | |
| 482 // returning from await. | |
| 483 if (__result) { | |
| 484 // goto do body | |
| 485 __goto = 1; | |
| 486 break; | |
| 487 } | |
| 488 case 3: | |
| 489 // after do | |
| 490 // implicit return | |
| 491 return thenHelper(null, null, __completer, null); | |
| 492 } | |
| 493 } | |
| 494 return thenHelper(null, __helper, __completer, null); | |
| 495 }"""); | |
| 496 | |
| 497 testTransform(""" | |
| 498 function() async { | |
| 499 for (var i = 0; i < await foo1(); i += await foo2()) { | |
| 500 if (foo(i)) | |
| 501 continue; | |
| 502 else | |
| 503 break; | |
| 504 if (!foo(i)) { // If with no else and await in body. | |
| 505 await foo(); | |
| 506 return; | |
| 507 } | |
| 508 print(await(foo(i))); | |
| 509 } | |
| 510 } | |
| 511 """, """ | |
| 512 function() { | |
| 513 var __goto = 0, __completer = new newCompleter(), __returnValue, i, __temp1; | |
| 514 function __helper(__result) { | |
| 515 while (true) | |
| 516 switch (__goto) { | |
| 517 case 0: | |
| 518 // Function start | |
| 519 i = 0; | |
| 520 case 2: | |
| 521 // for condition | |
| 522 __temp1 = i; | |
| 523 __goto = 5; | |
| 524 return thenHelper(foo1(), __helper, __completer, null); | |
| 525 case 5: | |
| 526 // returning from await. | |
| 527 if (!(__temp1 < __result)) { | |
| 528 // goto after for | |
| 529 __goto = 4; | |
| 530 break; | |
| 531 } | |
| 532 if (foo(i)) { | |
| 533 // goto for update | |
| 534 __goto = 3; | |
| 535 break; | |
| 536 } else { | |
| 537 // goto after for | |
| 538 __goto = 4; | |
| 539 break; | |
| 540 } | |
| 541 __goto = !foo(i) ? 6 : 7; | |
| 542 break; | |
| 543 case 6: | |
| 544 // then | |
| 545 __goto = 8; | |
| 546 return thenHelper(foo(), __helper, __completer, null); | |
| 547 case 8: | |
| 548 // returning from await. | |
| 549 // goto Return | |
| 550 __goto = 1; | |
| 551 break; | |
| 552 case 7: | |
| 553 // join | |
| 554 __temp1 = print; | |
| 555 __goto = 9; | |
| 556 return thenHelper(foo(i), __helper, __completer, null); | |
| 557 case 9: | |
| 558 // returning from await. | |
| 559 __temp1(__result); | |
| 560 case 3: | |
| 561 // for update | |
| 562 __goto = 10; | |
| 563 return thenHelper(foo2(), __helper, __completer, null); | |
| 564 case 10: | |
| 565 // returning from await. | |
| 566 i = __result; | |
| 567 // goto for condition | |
| 568 __goto = 2; | |
| 569 break; | |
| 570 case 4: | |
| 571 // after for | |
| 572 case 1: | |
| 573 // Return | |
| 574 return thenHelper(__returnValue, null, __completer, null); | |
| 575 } | |
| 576 } | |
| 577 return thenHelper(null, __helper, __completer, null); | |
| 578 }"""); | |
| 579 | |
| 580 testTransform(""" | |
| 581 function(a) async { | |
| 582 var x = {"a": foo1(), "b": await foo2(), "c": foo3()}; | |
| 583 x["a"] = 2; // Different assignments | |
| 584 (await foo()).a = 3; | |
| 585 x[await foo()] = 4; | |
| 586 x[(await foo1()).a = await foo2()] = 5; | |
| 587 (await foo1())[await foo2()] = await foo3(6); | |
| 588 } | |
| 589 """, """ | |
| 590 function(a) { | |
| 591 var __goto = 0, __completer = new newCompleter(), x, __temp1, __temp2; | |
| 592 function __helper(__result) { | |
| 593 while (true) | |
| 594 switch (__goto) { | |
| 595 case 0: | |
| 596 // Function start | |
| 597 __temp1 = foo1(); | |
| 598 __goto = 1; | |
| 599 return thenHelper(foo2(), __helper, __completer, null); | |
| 600 case 1: | |
| 601 // returning from await. | |
| 602 x = {a: __temp1, b: __result, c: foo3()}; | |
| 603 x.a = 2; | |
| 604 __goto = 2; | |
| 605 return thenHelper(foo(), __helper, __completer, null); | |
| 606 case 2: | |
| 607 // returning from await. | |
| 608 __result.a = 3; | |
| 609 __temp1 = x; | |
| 610 __goto = 3; | |
| 611 return thenHelper(foo(), __helper, __completer, null); | |
| 612 case 3: | |
| 613 // returning from await. | |
| 614 __temp1[__result] = 4; | |
| 615 __temp1 = x; | |
| 616 __goto = 4; | |
| 617 return thenHelper(foo1(), __helper, __completer, null); | |
| 618 case 4: | |
| 619 // returning from await. | |
| 620 __temp2 = __result; | |
| 621 __goto = 5; | |
| 622 return thenHelper(foo2(), __helper, __completer, null); | |
| 623 case 5: | |
| 624 // returning from await. | |
| 625 __temp1[__temp2.a = __result] = 5; | |
| 626 __goto = 6; | |
| 627 return thenHelper(foo1(), __helper, __completer, null); | |
| 628 case 6: | |
| 629 // returning from await. | |
| 630 __temp1 = __result; | |
| 631 __goto = 7; | |
| 632 return thenHelper(foo2(), __helper, __completer, null); | |
| 633 case 7: | |
| 634 // returning from await. | |
| 635 __temp2 = __result; | |
| 636 __goto = 8; | |
| 637 return thenHelper(foo3(6), __helper, __completer, null); | |
| 638 case 8: | |
| 639 // returning from await. | |
| 640 __temp1[__temp2] = __result; | |
| 641 // implicit return | |
| 642 return thenHelper(null, null, __completer, null); | |
| 643 } | |
| 644 } | |
| 645 return thenHelper(null, __helper, __completer, null); | |
| 646 }"""); | |
| 647 testTransform(""" | |
| 648 function(c) async { | |
| 649 try { | |
| 650 var x = c ? await foo() : foo(); // conditional | |
| 651 var y = {}; | |
| 652 } catch (error) { | |
| 653 try { | |
| 654 x = c ? await fooError(error) : fooError(error); | |
| 655 } catch (error) { // nested error handler with overlapping name | |
| 656 y.x = foo(error); | |
| 657 } finally { | |
| 658 foo(x); | |
| 659 } | |
| 660 } | |
| 661 } | |
| 662 """, """ | |
| 663 function(c) { | |
| 664 var __goto = 0, __completer = new newCompleter(), __handler = null, x, y, __er ror1, __error2; | |
| 665 function __helper(__result) { | |
| 666 while (true) | |
| 667 try { | |
| 668 switch (__goto) { | |
| 669 case 0: | |
| 670 // Function start | |
| 671 __handler = 1; | |
| 672 __goto = c ? 4 : 6; | |
| 673 break; | |
| 674 case 4: | |
| 675 // then | |
| 676 __goto = 7; | |
| 677 return thenHelper(foo(), __helper, __completer, function(__error) { | |
| 678 __goto = 1; | |
| 679 __helper(__error); | |
| 680 }); | |
| 681 case 7: | |
| 682 // returning from await. | |
| 683 // goto join | |
| 684 __goto = 5; | |
| 685 break; | |
| 686 case 6: | |
| 687 // else | |
| 688 __result = foo(); | |
| 689 case 5: | |
| 690 // join | |
| 691 x = __result; | |
| 692 y = {}; | |
| 693 __handler = null; | |
| 694 __next = [3]; | |
| 695 // goto after finally | |
| 696 __goto = 3; | |
| 697 break; | |
| 698 case 1: | |
| 699 // catch | |
| 700 __handler = null; | |
| 701 __error1 = __result; | |
| 702 __handler = 8; | |
| 703 __goto = c ? 11 : 13; | |
| 704 break; | |
| 705 case 11: | |
| 706 // then | |
| 707 __goto = 14; | |
| 708 return thenHelper(fooError(__error1), __helper, __completer, functio n(__error) { | |
| 709 __goto = 8; | |
| 710 __helper(__error); | |
| 711 }); | |
| 712 case 14: | |
| 713 // returning from await. | |
| 714 // goto join | |
| 715 __goto = 12; | |
| 716 break; | |
| 717 case 13: | |
| 718 // else | |
| 719 __result = fooError(__error1); | |
| 720 case 12: | |
| 721 // join | |
| 722 x = __result; | |
| 723 __handler = null; | |
| 724 __next = [10]; | |
| 725 // goto finally | |
| 726 __goto = 9; | |
| 727 break; | |
| 728 case 8: | |
| 729 // catch | |
| 730 __handler = null; | |
| 731 __error2 = __result; | |
| 732 y.x = foo(__error2); | |
| 733 __next = [10]; | |
| 734 case 9: | |
| 735 // finally | |
| 736 foo(x); | |
| 737 // goto the next finally handler | |
| 738 __goto = __next.pop(); | |
| 739 break; | |
| 740 case 10: | |
| 741 // after finally | |
| 742 case 3: | |
| 743 // after finally | |
| 744 // implicit return | |
| 745 return thenHelper(null, null, __completer, null); | |
| 746 } | |
| 747 } catch (__error) { | |
| 748 if (__handler === null) | |
| 749 throw __error; | |
| 750 __result = __error; | |
| 751 __goto = __handler; | |
| 752 } | |
| 753 | |
| 754 } | |
| 755 return thenHelper(null, __helper, __completer, null); | |
| 756 }"""); | |
| 757 testTransform(""" | |
| 758 function(x, y) async { | |
| 759 print(await(foo(x))); // calls | |
| 760 (await print)(foo(x)); | |
| 761 print(foo(await x)); | |
| 762 await (print(foo(await x))); | |
| 763 print(foo(x, await y, z)); | |
| 764 } | |
| 765 """, """ | |
| 766 function(x, y) { | |
| 767 var __goto = 0, __completer = new newCompleter(), __temp1, __temp2, __temp3; | |
| 768 function __helper(__result) { | |
| 769 while (true) | |
| 770 switch (__goto) { | |
| 771 case 0: | |
| 772 // Function start | |
| 773 __temp1 = print; | |
| 774 __goto = 1; | |
| 775 return thenHelper(foo(x), __helper, __completer, null); | |
| 776 case 1: | |
| 777 // returning from await. | |
| 778 __temp1(__result); | |
| 779 __goto = 2; | |
| 780 return thenHelper(print, __helper, __completer, null); | |
| 781 case 2: | |
| 782 // returning from await. | |
| 783 __result(foo(x)); | |
| 784 __temp1 = print; | |
| 785 __temp2 = foo; | |
| 786 __goto = 3; | |
| 787 return thenHelper(x, __helper, __completer, null); | |
| 788 case 3: | |
| 789 // returning from await. | |
| 790 __temp1(__temp2(__result)); | |
| 791 __temp1 = print; | |
| 792 __temp2 = foo; | |
| 793 __goto = 5; | |
| 794 return thenHelper(x, __helper, __completer, null); | |
| 795 case 5: | |
| 796 // returning from await. | |
| 797 __goto = 4; | |
| 798 return thenHelper(__temp1(__temp2(__result)), __helper, __completer, n ull); | |
| 799 case 4: | |
| 800 // returning from await. | |
| 801 __temp1 = print; | |
| 802 __temp2 = foo; | |
| 803 __temp3 = x; | |
| 804 __goto = 6; | |
| 805 return thenHelper(y, __helper, __completer, null); | |
| 806 case 6: | |
| 807 // returning from await. | |
| 808 __temp1(__temp2(__temp3, __result, z)); | |
| 809 // implicit return | |
| 810 return thenHelper(null, null, __completer, null); | |
| 811 } | |
| 812 } | |
| 813 return thenHelper(null, __helper, __completer, null); | |
| 814 }"""); | |
| 815 testTransform(""" | |
| 816 function(x, y) async { | |
| 817 while (await(foo())) { | |
| 818 lab: { // labelled statement | |
| 819 switch(y) { | |
| 820 case 0: | |
| 821 foo(); | |
| 822 case 0: // Duplicate case | |
| 823 print(await foo1(x)); | |
| 824 return y; | |
| 825 case await bar(): // await in case | |
| 826 print(await foobar(x)); | |
| 827 return y; | |
| 828 case x: | |
| 829 if (a) { | |
| 830 throw new Error(); | |
| 831 } else { | |
| 832 continue; | |
| 833 } | |
| 834 default: // defaul case | |
| 835 break lab; // break to label | |
| 836 } | |
| 837 foo(); | |
| 838 } | |
| 839 } | |
| 840 }""", """ | |
| 841 function(x, y) { | |
| 842 var __goto = 0, __completer = new newCompleter(), __returnValue, __temp1; | |
| 843 function __helper(__result) { | |
| 844 while (true) | |
| 845 switch (__goto) { | |
| 846 case 0: | |
| 847 // Function start | |
| 848 case 2: | |
| 849 // while condition | |
| 850 __goto = 4; | |
| 851 return thenHelper(foo(), __helper, __completer, null); | |
| 852 case 4: | |
| 853 // returning from await. | |
| 854 if (!__result) { | |
| 855 // goto after while | |
| 856 __goto = 3; | |
| 857 break; | |
| 858 } | |
| 859 case 6: | |
| 860 // continue lab | |
| 861 case 7: | |
| 862 // switch | |
| 863 __temp1 = y; | |
| 864 if (__temp1 === 0) { | |
| 865 // goto case | |
| 866 __goto = 9; | |
| 867 break; | |
| 868 } | |
| 869 if (__temp1 === 0) { | |
| 870 // goto case | |
| 871 __goto = 10; | |
| 872 break; | |
| 873 } | |
| 874 __goto = 12; | |
| 875 return thenHelper(bar(), __helper, __completer, null); | |
| 876 case 12: | |
| 877 // returning from await. | |
| 878 if (__temp1 === __result) { | |
| 879 // goto case | |
| 880 __goto = 11; | |
| 881 break; | |
| 882 } | |
| 883 if (__temp1 === x) { | |
| 884 // goto case | |
| 885 __goto = 13; | |
| 886 break; | |
| 887 } | |
| 888 // goto default | |
| 889 __goto = 14; | |
| 890 break; | |
| 891 case 9: | |
| 892 // case | |
| 893 foo(); | |
| 894 case 10: | |
| 895 // case | |
| 896 __temp1 = print; | |
| 897 __goto = 15; | |
| 898 return thenHelper(foo1(x), __helper, __completer, null); | |
| 899 case 15: | |
| 900 // returning from await. | |
| 901 __temp1(__result); | |
| 902 __returnValue = y; | |
| 903 // goto Return | |
| 904 __goto = 1; | |
| 905 break; | |
| 906 case 11: | |
| 907 // case | |
| 908 __temp1 = print; | |
| 909 __goto = 16; | |
| 910 return thenHelper(foobar(x), __helper, __completer, null); | |
| 911 case 16: | |
| 912 // returning from await. | |
| 913 __temp1(__result); | |
| 914 __returnValue = y; | |
| 915 // goto Return | |
| 916 __goto = 1; | |
| 917 break; | |
| 918 case 13: | |
| 919 // case | |
| 920 if (a) { | |
| 921 throw new Error(); | |
| 922 } else { | |
| 923 // goto while condition | |
| 924 __goto = 2; | |
| 925 break; | |
| 926 } | |
| 927 case 14: | |
| 928 // default | |
| 929 // goto break lab | |
| 930 __goto = 5; | |
| 931 break; | |
| 932 case 8: | |
| 933 // after switch | |
| 934 foo(); | |
| 935 case 5: | |
| 936 // break lab | |
| 937 // goto while condition | |
| 938 __goto = 2; | |
| 939 break; | |
| 940 case 3: | |
| 941 // after while | |
| 942 case 1: | |
| 943 // Return | |
| 944 return thenHelper(__returnValue, null, __completer, null); | |
| 945 } | |
| 946 } | |
| 947 return thenHelper(null, __helper, __completer, null); | |
| 948 }"""); | |
| 949 } | |
| OLD | NEW |