| Index: tests/compiler/dart2js/async_await_js_transform_test.dart
|
| diff --git a/tests/compiler/dart2js/async_await_js_transform_test.dart b/tests/compiler/dart2js/async_await_js_transform_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..bbcec9bd2a1df648983358bfa51800167ebbb652
|
| --- /dev/null
|
| +++ b/tests/compiler/dart2js/async_await_js_transform_test.dart
|
| @@ -0,0 +1,946 @@
|
| +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +import "package:expect/expect.dart";
|
| +import "package:compiler/src/js/js.dart";
|
| +import "package:compiler/src/js/rewrite_async.dart";
|
| +
|
| +import "backend_dart/dart_printer_test.dart" show PrintDiagnosticListener;
|
| +
|
| +void testTransform(String source, String expected) {
|
| + Fun fun = js(source);
|
| + Fun rewritten = new AsyncRewriter(
|
| + null, // The diagnostic helper should not be used in these tests.
|
| + null,
|
| + thenHelper: new VariableUse("thenHelper"),
|
| + newCompleter: new VariableUse("Completer"),
|
| + endOfIteration: new VariableUse("endOfIteration"),
|
| + newIterable: new VariableUse("Iterator"),
|
| + safeVariableName: (String name) => "__$name").rewrite(fun);
|
| + Printer printer = new Printer(new PrintDiagnosticListener(), null);
|
| + printer.visit(rewritten);
|
| + Expect.stringEquals(expected, printer.outBuffer.getText());
|
| +}
|
| +
|
| +main() {
|
| + testTransform("""
|
| +function() async {
|
| + print(this.x); // Ensure `this` is translated in the helper function.
|
| + await foo();
|
| +}""", """
|
| +function() {
|
| + var __goto = 0, __completer = new Completer(), __self = this;
|
| + function __helper(__result) {
|
| + while (true)
|
| + switch (__goto) {
|
| + case 0:
|
| + // Function start
|
| + print(__self.x);
|
| + __goto = 1;
|
| + return thenHelper(foo(), __helper, __completer, null);
|
| + case 1:
|
| + // returning from await.
|
| + // implicit return
|
| + return thenHelper(null, null, __completer, null);
|
| + }
|
| + }
|
| + return thenHelper(null, __helper, __completer, null);
|
| +}""");
|
| +
|
| + testTransform("""
|
| +function() async {
|
| + try {
|
| + __outer: while (true) { // Overlapping label name.
|
| + try {
|
| + inner: while (true) {
|
| + break __outer; // Break from untranslated loop to translated target.
|
| + break; // break to untranslated target.
|
| + }
|
| + while (true) {
|
| + return; // Return via finallies.
|
| + }
|
| + var __helper = await foo(); // Overlapping variable name.
|
| + } finally {
|
| + foo();
|
| + continue; // Continue from finally with pending finally.
|
| + return 2; // Return from finally with pending finally.
|
| + }
|
| + }
|
| + } finally {
|
| + return 3; // Return from finally with no pending finally.
|
| + }
|
| + return 4;
|
| +}""", """
|
| +function() {
|
| + var __goto = 0, __completer = new Completer(), __handler = null, __next, __returnValue, __helper;
|
| + function __helper1(__result) {
|
| + while (true)
|
| + try {
|
| + __outer1:
|
| + switch (__goto) {
|
| + case 0:
|
| + // Function start
|
| + __handler = 2;
|
| + case 6:
|
| + // continue __outer
|
| + case 7:
|
| + // while condition
|
| + __handler = 9;
|
| + inner: {
|
| + while (true) {
|
| + __next = [5];
|
| + // goto finally
|
| + __goto = 10;
|
| + break __outer1;
|
| + break;
|
| + }
|
| + }
|
| + while (true) {
|
| + __next = [1, 3];
|
| + // goto finally
|
| + __goto = 10;
|
| + break __outer1;
|
| + }
|
| + __goto = 12;
|
| + return thenHelper(foo(), __helper1, __completer, function(__error) {
|
| + __goto = 9;
|
| + __helper1(__error);
|
| + });
|
| + case 12:
|
| + // returning from await.
|
| + __helper = __result;
|
| + __next = [11];
|
| + // goto finally
|
| + __goto = 10;
|
| + break;
|
| + case 9:
|
| + // catch
|
| + __handler = 2;
|
| + __next = [11];
|
| + case 10:
|
| + // finally
|
| + __handler = 2;
|
| + foo();
|
| + // goto while condition
|
| + __goto = 7;
|
| + break;
|
| + __returnValue = 2;
|
| + __next = [1];
|
| + // goto finally
|
| + __goto = 3;
|
| + break;
|
| + // goto the next finally handler
|
| + __goto = __next.pop();
|
| + break;
|
| + case 11:
|
| + // after finally
|
| + // goto while condition
|
| + __goto = 7;
|
| + break;
|
| + case 8:
|
| + // after while
|
| + case 5:
|
| + // break __outer
|
| + __next = [4];
|
| + // goto finally
|
| + __goto = 3;
|
| + break;
|
| + case 2:
|
| + // catch
|
| + __handler = null;
|
| + __next = [4];
|
| + case 3:
|
| + // finally
|
| + __handler = null;
|
| + __returnValue = 3;
|
| + // goto return
|
| + __goto = 1;
|
| + break;
|
| + // goto the next finally handler
|
| + __goto = __next.pop();
|
| + break;
|
| + case 4:
|
| + // after finally
|
| + __returnValue = 4;
|
| + // goto return
|
| + __goto = 1;
|
| + break;
|
| + case 1:
|
| + // return
|
| + return thenHelper(__returnValue, null, __completer, null);
|
| + }
|
| + } catch (__error) {
|
| + if (__handler === null)
|
| + throw __error;
|
| + __result = __error;
|
| + __goto = __handler;
|
| + }
|
| +
|
| + }
|
| + return thenHelper(null, __helper1, __completer, null);
|
| +}""");
|
| + testTransform("""
|
| +function() async {
|
| + var a, b, c, d, e, f;
|
| + a = b++; // post- and preincrements.
|
| + b = --b;
|
| + c = (await foo()).a++;
|
| + d = ++(await foo()).a;
|
| + e = foo1()[await foo2()]--;
|
| + f = --foo1()[await foo2()];
|
| +}""", """
|
| +function() {
|
| + var __goto = 0, __completer = new Completer(), a, b, c, d, e, f, __temp1;
|
| + function __helper(__result) {
|
| + while (true)
|
| + switch (__goto) {
|
| + case 0:
|
| + // Function start
|
| + a = b++;
|
| + b = --b;
|
| + __goto = 1;
|
| + return thenHelper(foo(), __helper, __completer, null);
|
| + case 1:
|
| + // returning from await.
|
| + c = __result.a++;
|
| + __goto = 2;
|
| + return thenHelper(foo(), __helper, __completer, null);
|
| + case 2:
|
| + // returning from await.
|
| + d = ++__result.a;
|
| + __temp1 = foo1();
|
| + __goto = 3;
|
| + return thenHelper(foo2(), __helper, __completer, null);
|
| + case 3:
|
| + // returning from await.
|
| + e = __temp1[__result]--;
|
| + __temp1 = foo1();
|
| + __goto = 4;
|
| + return thenHelper(foo2(), __helper, __completer, null);
|
| + case 4:
|
| + // returning from await.
|
| + f = --__temp1[__result];
|
| + // implicit return
|
| + return thenHelper(null, null, __completer, null);
|
| + }
|
| + }
|
| + return thenHelper(null, __helper, __completer, null);
|
| +}""");
|
| + testTransform("""
|
| +function() async {
|
| + var a, b, c, d, e, f, g, h; // empty initializer
|
| + a = foo1() || await foo2(); // short circuiting operators
|
| + b = await foo1() || foo2();
|
| + c = await foo1() || foo3(await foo2());
|
| + d = foo1() || foo2();
|
| + e = foo1() && await foo2();
|
| + f = await foo1() && foo2();
|
| + g = await foo1() && await foo2();
|
| + h = foo1() && foo2();
|
| +}""", """
|
| +function() {
|
| + var __goto = 0, __completer = new Completer(), a, b, c, d, e, f, g, h, __temp1;
|
| + function __helper(__result) {
|
| + while (true)
|
| + switch (__goto) {
|
| + case 0:
|
| + // Function start
|
| + __temp1 = foo1();
|
| + if (__temp1) {
|
| + // goto then
|
| + __goto = 1;
|
| + break;
|
| + } else
|
| + __result = __temp1;
|
| + // goto join
|
| + __goto = 2;
|
| + break;
|
| + case 1:
|
| + // then
|
| + __goto = 3;
|
| + return thenHelper(foo2(), __helper, __completer, null);
|
| + case 3:
|
| + // returning from await.
|
| + case 2:
|
| + // join
|
| + a = __result;
|
| + __goto = 4;
|
| + return thenHelper(foo1(), __helper, __completer, null);
|
| + case 4:
|
| + // returning from await.
|
| + b = __result || foo2();
|
| + __goto = 7;
|
| + return thenHelper(foo1(), __helper, __completer, null);
|
| + case 7:
|
| + // returning from await.
|
| + __temp1 = __result;
|
| + if (__temp1) {
|
| + // goto then
|
| + __goto = 5;
|
| + break;
|
| + } else
|
| + __result = __temp1;
|
| + // goto join
|
| + __goto = 6;
|
| + break;
|
| + case 5:
|
| + // then
|
| + __temp1 = foo3;
|
| + __goto = 8;
|
| + return thenHelper(foo2(), __helper, __completer, null);
|
| + case 8:
|
| + // returning from await.
|
| + __result = __temp1(__result);
|
| + case 6:
|
| + // join
|
| + c = __result;
|
| + d = foo1() || foo2();
|
| + __temp1 = foo1();
|
| + if (__temp1)
|
| + __result = __temp1;
|
| + else {
|
| + // goto then
|
| + __goto = 9;
|
| + break;
|
| + }
|
| + // goto join
|
| + __goto = 10;
|
| + break;
|
| + case 9:
|
| + // then
|
| + __goto = 11;
|
| + return thenHelper(foo2(), __helper, __completer, null);
|
| + case 11:
|
| + // returning from await.
|
| + case 10:
|
| + // join
|
| + e = __result;
|
| + __goto = 12;
|
| + return thenHelper(foo1(), __helper, __completer, null);
|
| + case 12:
|
| + // returning from await.
|
| + f = __result && foo2();
|
| + __goto = 15;
|
| + return thenHelper(foo1(), __helper, __completer, null);
|
| + case 15:
|
| + // returning from await.
|
| + __temp1 = __result;
|
| + if (__temp1)
|
| + __result = __temp1;
|
| + else {
|
| + // goto then
|
| + __goto = 13;
|
| + break;
|
| + }
|
| + // goto join
|
| + __goto = 14;
|
| + break;
|
| + case 13:
|
| + // then
|
| + __goto = 16;
|
| + return thenHelper(foo2(), __helper, __completer, null);
|
| + case 16:
|
| + // returning from await.
|
| + case 14:
|
| + // join
|
| + g = __result;
|
| + h = foo1() && foo2();
|
| + // implicit return
|
| + return thenHelper(null, null, __completer, null);
|
| + }
|
| + }
|
| + return thenHelper(null, __helper, __completer, null);
|
| +}""");
|
| + testTransform("""
|
| +function(x, y) async {
|
| + while (true) {
|
| + switch(y) { // Switch with no awaits in case key expressions
|
| + case 0:
|
| + case 1:
|
| + await foo();
|
| + continue; // Continue the loop, not the switch
|
| + case 1: // Duplicate case
|
| + await foo();
|
| + break; // Break the switch
|
| + case 2:
|
| + foo(); // No default
|
| + }
|
| + }
|
| +}""", """
|
| +function(x, y) {
|
| + var __goto = 0, __completer = new Completer();
|
| + function __helper(__result) {
|
| + while (true)
|
| + switch (__goto) {
|
| + case 0:
|
| + // Function start
|
| + case 1:
|
| + // while condition
|
| + case 3:
|
| + // switch
|
| + switch (y) {
|
| + case 0:
|
| + // goto case
|
| + __goto = 5;
|
| + break;
|
| + case 1:
|
| + // goto case
|
| + __goto = 6;
|
| + break;
|
| + case 1:
|
| + // goto case
|
| + __goto = 7;
|
| + break;
|
| + case 2:
|
| + // goto case
|
| + __goto = 8;
|
| + break;
|
| + }
|
| + // goto after switch
|
| + __goto = 4;
|
| + break;
|
| + case 5:
|
| + // case
|
| + case 6:
|
| + // case
|
| + __goto = 9;
|
| + return thenHelper(foo(), __helper, __completer, null);
|
| + case 9:
|
| + // returning from await.
|
| + // goto while condition
|
| + __goto = 1;
|
| + break;
|
| + case 7:
|
| + // case
|
| + __goto = 10;
|
| + return thenHelper(foo(), __helper, __completer, null);
|
| + case 10:
|
| + // returning from await.
|
| + // goto after switch
|
| + __goto = 4;
|
| + break;
|
| + case 8:
|
| + // case
|
| + foo();
|
| + case 4:
|
| + // after switch
|
| + // goto while condition
|
| + __goto = 1;
|
| + break;
|
| + case 2:
|
| + // after while
|
| + // implicit return
|
| + return thenHelper(null, null, __completer, null);
|
| + }
|
| + }
|
| + return thenHelper(null, __helper, __completer, null);
|
| +}""");
|
| + testTransform("""
|
| +function() async {
|
| + do {
|
| + var a = await foo();
|
| + if (a) // If with no awaits in body
|
| + break;
|
| + else
|
| + continue;
|
| + } while (await foo());
|
| +}
|
| +""", """
|
| +function() {
|
| + var __goto = 0, __completer = new Completer(), a;
|
| + function __helper(__result) {
|
| + while (true)
|
| + switch (__goto) {
|
| + case 0:
|
| + // Function start
|
| + case 1:
|
| + // do body
|
| + __goto = 4;
|
| + return thenHelper(foo(), __helper, __completer, null);
|
| + case 4:
|
| + // returning from await.
|
| + a = __result;
|
| + if (a) {
|
| + // goto after do
|
| + __goto = 3;
|
| + break;
|
| + } else {
|
| + // goto do condition
|
| + __goto = 2;
|
| + break;
|
| + }
|
| + case 2:
|
| + // do condition
|
| + __goto = 5;
|
| + return thenHelper(foo(), __helper, __completer, null);
|
| + case 5:
|
| + // returning from await.
|
| + if (__result) {
|
| + // goto do body
|
| + __goto = 1;
|
| + break;
|
| + }
|
| + case 3:
|
| + // after do
|
| + // implicit return
|
| + return thenHelper(null, null, __completer, null);
|
| + }
|
| + }
|
| + return thenHelper(null, __helper, __completer, null);
|
| +}""");
|
| +
|
| + testTransform("""
|
| +function() async {
|
| + for (var i = 0; i < await foo1(); i += await foo2()) {
|
| + if (foo(i))
|
| + continue;
|
| + else
|
| + break;
|
| + if (!foo(i)) { // If with no else and await in body.
|
| + await foo();
|
| + return;
|
| + }
|
| + print(await(foo(i)));
|
| + }
|
| +}
|
| +""", """
|
| +function() {
|
| + var __goto = 0, __completer = new Completer(), __returnValue, i, __temp1;
|
| + function __helper(__result) {
|
| + while (true)
|
| + switch (__goto) {
|
| + case 0:
|
| + // Function start
|
| + i = 0;
|
| + case 2:
|
| + // for condition
|
| + __temp1 = i;
|
| + __goto = 5;
|
| + return thenHelper(foo1(), __helper, __completer, null);
|
| + case 5:
|
| + // returning from await.
|
| + if (!(__temp1 < __result)) {
|
| + // goto after for
|
| + __goto = 4;
|
| + break;
|
| + }
|
| + if (foo(i)) {
|
| + // goto for update
|
| + __goto = 3;
|
| + break;
|
| + } else {
|
| + // goto after for
|
| + __goto = 4;
|
| + break;
|
| + }
|
| + __goto = !foo(i) ? 6 : 7;
|
| + break;
|
| + case 6:
|
| + // then
|
| + __goto = 8;
|
| + return thenHelper(foo(), __helper, __completer, null);
|
| + case 8:
|
| + // returning from await.
|
| + // goto return
|
| + __goto = 1;
|
| + break;
|
| + case 7:
|
| + // join
|
| + __temp1 = print;
|
| + __goto = 9;
|
| + return thenHelper(foo(i), __helper, __completer, null);
|
| + case 9:
|
| + // returning from await.
|
| + __temp1(__result);
|
| + case 3:
|
| + // for update
|
| + __goto = 10;
|
| + return thenHelper(foo2(), __helper, __completer, null);
|
| + case 10:
|
| + // returning from await.
|
| + i = __result;
|
| + // goto for condition
|
| + __goto = 2;
|
| + break;
|
| + case 4:
|
| + // after for
|
| + case 1:
|
| + // return
|
| + return thenHelper(__returnValue, null, __completer, null);
|
| + }
|
| + }
|
| + return thenHelper(null, __helper, __completer, null);
|
| +}""");
|
| +
|
| + testTransform("""
|
| +function(a) async {
|
| + var x = {"a": foo1(), "b": await foo2(), "c": foo3()};
|
| + x["a"] = 2; // Different assignments
|
| + (await foo()).a = 3;
|
| + x[await foo()] = 4;
|
| + x[(await foo1()).a = await foo2()] = 5;
|
| + (await foo1())[await foo2()] = await foo3(6);
|
| +}
|
| +""", """
|
| +function(a) {
|
| + var __goto = 0, __completer = new Completer(), x, __temp1, __temp2;
|
| + function __helper(__result) {
|
| + while (true)
|
| + switch (__goto) {
|
| + case 0:
|
| + // Function start
|
| + __temp1 = foo1();
|
| + __goto = 1;
|
| + return thenHelper(foo2(), __helper, __completer, null);
|
| + case 1:
|
| + // returning from await.
|
| + x = {a: __temp1, b: __result, c: foo3()};
|
| + x.a = 2;
|
| + __goto = 2;
|
| + return thenHelper(foo(), __helper, __completer, null);
|
| + case 2:
|
| + // returning from await.
|
| + __result.a = 3;
|
| + __temp1 = x;
|
| + __goto = 3;
|
| + return thenHelper(foo(), __helper, __completer, null);
|
| + case 3:
|
| + // returning from await.
|
| + __temp1[__result] = 4;
|
| + __temp1 = x;
|
| + __goto = 4;
|
| + return thenHelper(foo1(), __helper, __completer, null);
|
| + case 4:
|
| + // returning from await.
|
| + __temp2 = __result;
|
| + __goto = 5;
|
| + return thenHelper(foo2(), __helper, __completer, null);
|
| + case 5:
|
| + // returning from await.
|
| + __temp1[__temp2.a = __result] = 5;
|
| + __goto = 6;
|
| + return thenHelper(foo1(), __helper, __completer, null);
|
| + case 6:
|
| + // returning from await.
|
| + __temp1 = __result;
|
| + __goto = 7;
|
| + return thenHelper(foo2(), __helper, __completer, null);
|
| + case 7:
|
| + // returning from await.
|
| + __temp2 = __result;
|
| + __goto = 8;
|
| + return thenHelper(foo3(6), __helper, __completer, null);
|
| + case 8:
|
| + // returning from await.
|
| + __temp1[__temp2] = __result;
|
| + // implicit return
|
| + return thenHelper(null, null, __completer, null);
|
| + }
|
| + }
|
| + return thenHelper(null, __helper, __completer, null);
|
| +}""");
|
| + testTransform("""
|
| +function(c) async {
|
| + try {
|
| + var x = c ? await foo() : foo(); // conditional
|
| + var y = {};
|
| + } catch (error) {
|
| + try {
|
| + x = c ? await fooError(error) : fooError(error);
|
| + } catch (error) { // nested error handler with overlapping name
|
| + y.x = foo(error);
|
| + } finally {
|
| + foo(x);
|
| + }
|
| + }
|
| +}
|
| +""", """
|
| +function(c) {
|
| + var __goto = 0, __completer = new Completer(), __handler = null, x, y, __error1, __error2;
|
| + function __helper(__result) {
|
| + while (true)
|
| + try {
|
| + switch (__goto) {
|
| + case 0:
|
| + // Function start
|
| + __handler = 1;
|
| + __goto = c ? 4 : 6;
|
| + break;
|
| + case 4:
|
| + // then
|
| + __goto = 7;
|
| + return thenHelper(foo(), __helper, __completer, function(__error) {
|
| + __goto = 1;
|
| + __helper(__error);
|
| + });
|
| + case 7:
|
| + // returning from await.
|
| + // goto join
|
| + __goto = 5;
|
| + break;
|
| + case 6:
|
| + // else
|
| + __result = foo();
|
| + case 5:
|
| + // join
|
| + x = __result;
|
| + y = {};
|
| + __next = [3];
|
| + __handler = null;
|
| + // goto after finally
|
| + __goto = 3;
|
| + break;
|
| + case 1:
|
| + // catch
|
| + __handler = null;
|
| + __error1 = __result;
|
| + __handler = 8;
|
| + __goto = c ? 11 : 13;
|
| + break;
|
| + case 11:
|
| + // then
|
| + __goto = 14;
|
| + return thenHelper(fooError(__error1), __helper, __completer, function(__error) {
|
| + __goto = 8;
|
| + __helper(__error);
|
| + });
|
| + case 14:
|
| + // returning from await.
|
| + // goto join
|
| + __goto = 12;
|
| + break;
|
| + case 13:
|
| + // else
|
| + __result = fooError(__error1);
|
| + case 12:
|
| + // join
|
| + x = __result;
|
| + __next = [10];
|
| + // goto finally
|
| + __goto = 9;
|
| + break;
|
| + case 8:
|
| + // catch
|
| + __handler = null;
|
| + __error2 = __result;
|
| + y.x = foo(__error2);
|
| + __handler = null;
|
| + __next = [10];
|
| + case 9:
|
| + // finally
|
| + __handler = null;
|
| + foo(x);
|
| + // goto the next finally handler
|
| + __goto = __next.pop();
|
| + break;
|
| + case 10:
|
| + // after finally
|
| + case 3:
|
| + // after finally
|
| + // implicit return
|
| + return thenHelper(null, null, __completer, null);
|
| + }
|
| + } catch (__error) {
|
| + if (__handler === null)
|
| + throw __error;
|
| + __result = __error;
|
| + __goto = __handler;
|
| + }
|
| +
|
| + }
|
| + return thenHelper(null, __helper, __completer, null);
|
| +}""");
|
| + testTransform("""
|
| +function(x, y) async {
|
| + print(await(foo(x))); // calls
|
| + (await print)(foo(x));
|
| + print(foo(await x));
|
| + await (print(foo(await x)));
|
| + print(foo(x, await y, z));
|
| +}
|
| +""", """
|
| +function(x, y) {
|
| + var __goto = 0, __completer = new Completer(), __temp1, __temp2, __temp3;
|
| + function __helper(__result) {
|
| + while (true)
|
| + switch (__goto) {
|
| + case 0:
|
| + // Function start
|
| + __temp1 = print;
|
| + __goto = 1;
|
| + return thenHelper(foo(x), __helper, __completer, null);
|
| + case 1:
|
| + // returning from await.
|
| + __temp1(__result);
|
| + __goto = 2;
|
| + return thenHelper(print, __helper, __completer, null);
|
| + case 2:
|
| + // returning from await.
|
| + __result(foo(x));
|
| + __temp1 = print;
|
| + __temp2 = foo;
|
| + __goto = 3;
|
| + return thenHelper(x, __helper, __completer, null);
|
| + case 3:
|
| + // returning from await.
|
| + __temp1(__temp2(__result));
|
| + __temp1 = print;
|
| + __temp2 = foo;
|
| + __goto = 5;
|
| + return thenHelper(x, __helper, __completer, null);
|
| + case 5:
|
| + // returning from await.
|
| + __goto = 4;
|
| + return thenHelper(__temp1(__temp2(__result)), __helper, __completer, null);
|
| + case 4:
|
| + // returning from await.
|
| + __temp1 = print;
|
| + __temp2 = foo;
|
| + __temp3 = x;
|
| + __goto = 6;
|
| + return thenHelper(y, __helper, __completer, null);
|
| + case 6:
|
| + // returning from await.
|
| + __temp1(__temp2(__temp3, __result, z));
|
| + // implicit return
|
| + return thenHelper(null, null, __completer, null);
|
| + }
|
| + }
|
| + return thenHelper(null, __helper, __completer, null);
|
| +}""");
|
| + testTransform("""
|
| +function(x, y) async {
|
| + while (await(foo())) {
|
| + lab: { // labelled statement
|
| + switch(y) {
|
| + case 0:
|
| + foo();
|
| + case 0: // Duplicate case
|
| + print(await foo1(x));
|
| + return y;
|
| + case await bar(): // await in case
|
| + print(await foobar(x));
|
| + return y;
|
| + case x:
|
| + if (a) {
|
| + throw new Error();
|
| + } else {
|
| + continue;
|
| + }
|
| + default: // defaul case
|
| + break lab; // break to label
|
| + }
|
| + foo();
|
| + }
|
| + }
|
| +}""", """
|
| +function(x, y) {
|
| + var __goto = 0, __completer = new Completer(), __returnValue, __temp1;
|
| + function __helper(__result) {
|
| + while (true)
|
| + switch (__goto) {
|
| + case 0:
|
| + // Function start
|
| + case 2:
|
| + // while condition
|
| + __goto = 4;
|
| + return thenHelper(foo(), __helper, __completer, null);
|
| + case 4:
|
| + // returning from await.
|
| + if (!__result) {
|
| + // goto after while
|
| + __goto = 3;
|
| + break;
|
| + }
|
| + case 6:
|
| + // continue lab
|
| + case 7:
|
| + // switch
|
| + __temp1 = y;
|
| + if (__temp1 === 0) {
|
| + // goto case
|
| + __goto = 9;
|
| + break;
|
| + }
|
| + if (__temp1 === 0) {
|
| + // goto case
|
| + __goto = 10;
|
| + break;
|
| + }
|
| + __goto = 12;
|
| + return thenHelper(bar(), __helper, __completer, null);
|
| + case 12:
|
| + // returning from await.
|
| + if (__temp1 === __result) {
|
| + // goto case
|
| + __goto = 11;
|
| + break;
|
| + }
|
| + if (__temp1 === x) {
|
| + // goto case
|
| + __goto = 13;
|
| + break;
|
| + }
|
| + // goto default
|
| + __goto = 14;
|
| + break;
|
| + case 9:
|
| + // case
|
| + foo();
|
| + case 10:
|
| + // case
|
| + __temp1 = print;
|
| + __goto = 15;
|
| + return thenHelper(foo1(x), __helper, __completer, null);
|
| + case 15:
|
| + // returning from await.
|
| + __temp1(__result);
|
| + __returnValue = y;
|
| + // goto return
|
| + __goto = 1;
|
| + break;
|
| + case 11:
|
| + // case
|
| + __temp1 = print;
|
| + __goto = 16;
|
| + return thenHelper(foobar(x), __helper, __completer, null);
|
| + case 16:
|
| + // returning from await.
|
| + __temp1(__result);
|
| + __returnValue = y;
|
| + // goto return
|
| + __goto = 1;
|
| + break;
|
| + case 13:
|
| + // case
|
| + if (a) {
|
| + throw new Error();
|
| + } else {
|
| + // goto while condition
|
| + __goto = 2;
|
| + break;
|
| + }
|
| + case 14:
|
| + // default
|
| + // goto break lab
|
| + __goto = 5;
|
| + break;
|
| + case 8:
|
| + // after switch
|
| + foo();
|
| + case 5:
|
| + // break lab
|
| + // goto while condition
|
| + __goto = 2;
|
| + break;
|
| + case 3:
|
| + // after while
|
| + case 1:
|
| + // return
|
| + return thenHelper(__returnValue, null, __completer, null);
|
| + }
|
| + }
|
| + return thenHelper(null, __helper, __completer, null);
|
| +}""");
|
| +}
|
|
|