Index: pkg/compiler/lib/src/js/rewrite_async.dart |
diff --git a/pkg/compiler/lib/src/js/rewrite_async.dart b/pkg/compiler/lib/src/js/rewrite_async.dart |
index 181a63892c4c6b49de73f075621d682fe7103154..b1918ad5ecded07ba04bedb2ededf87029f64c21 100644 |
--- a/pkg/compiler/lib/src/js/rewrite_async.dart |
+++ b/pkg/compiler/lib/src/js/rewrite_async.dart |
@@ -1652,26 +1652,37 @@ class AsyncRewriter extends AsyncRewriterBase { |
String completerName; |
js.VariableUse get completer => new js.VariableUse(completerName); |
- /// The function called by an async function to simulate an await or return. |
+ /// The function called by an async function to initiate asynchronous |
+ /// execution of the body. This is called with: |
/// |
- /// For an await it is called with: |
+ /// - The body function [bodyName]. |
+ /// - the completer object [completer]. |
+ /// |
+ /// It returns the completer's future. Passing the completer and returning its |
+ /// future is a convenience to allow both the initiation and fetching the |
+ /// future to be compactly encoded in a return statement's expression. |
+ final js.Expression asyncStart; |
+ |
+ /// Function called by the async function to simulate an `await` |
+ /// expression. It is called with: |
/// |
/// - The value to await |
/// - The body function [bodyName] |
- /// - The completer object [completer] |
- /// |
- /// For a return it is called with: |
+ final js.Expression asyncAwait; |
+ |
+ /// Function called by the async function to simulate a return. |
+ /// It is called with: |
/// |
- /// - The value to complete the completer with. |
- /// - [error_codes.SUCCESS] |
+ /// - The value to return |
/// - The completer object [completer] |
+ final js.Expression asyncReturn; |
+ |
+ /// Function called by the async function to simulate a rethrow. |
+ /// It is called with: |
/// |
- /// For a throw it is called with: |
- /// |
- /// - The error to complete the completer with. |
- /// - [error_codes.ERROR] |
+ /// - The value containing the exception and stack |
/// - The completer object [completer] |
- final js.Expression asyncHelper; |
+ final js.Expression asyncRethrow; |
/// Constructor used to initialize the [completer] variable. |
/// |
@@ -1681,7 +1692,10 @@ class AsyncRewriter extends AsyncRewriterBase { |
final js.Expression wrapBody; |
AsyncRewriter(DiagnosticReporter reporter, Spannable spannable, |
- {this.asyncHelper, |
+ {this.asyncStart, |
+ this.asyncAwait, |
+ this.asyncReturn, |
+ this.asyncRethrow, |
this.completerFactory, |
this.wrapBody, |
String safeVariableName(String proposedName), |
@@ -1696,9 +1710,8 @@ class AsyncRewriter extends AsyncRewriterBase { |
void addErrorExit() { |
beginLabel(rethrowLabel); |
addStatement(js.js.statement( |
- "return #thenHelper(#currentError, #errorCode, #completer);", { |
- "thenHelper": asyncHelper, |
- "errorCode": js.number(error_codes.ERROR), |
+ "return #thenHelper(#currentError, #completer);", { |
+ "thenHelper": asyncRethrow, |
"currentError": currentError, |
"completer": completer |
})); |
@@ -1713,10 +1726,9 @@ class AsyncRewriter extends AsyncRewriterBase { |
} else { |
addStatement(new js.Comment("implicit return")); |
} |
- addStatement(js.js.statement( |
- "return #runtimeHelper(#returnValue, #successCode, #completer);", { |
- "runtimeHelper": asyncHelper, |
- "successCode": js.number(error_codes.SUCCESS), |
+ addStatement( |
+ js.js.statement("return #runtimeHelper(#returnValue, #completer);", { |
+ "runtimeHelper": asyncReturn, |
"returnValue": |
analysis.hasExplicitReturns ? returnValue : new js.LiteralNull(), |
"completer": completer |
@@ -1744,14 +1756,12 @@ class AsyncRewriter extends AsyncRewriterBase { |
return js.js.statement( |
""" |
return #asyncHelper(#value, |
- #bodyName, |
- #completer); |
+ #bodyName); |
""", |
{ |
- "asyncHelper": asyncHelper, |
+ "asyncHelper": asyncAwait, |
"value": value, |
"bodyName": bodyName, |
- "completer": completer |
}); |
} |
@@ -1772,7 +1782,7 @@ class AsyncRewriter extends AsyncRewriterBase { |
} |
#rewrittenBody; |
}); |
- return #asyncHelper(null, #bodyName, #completer); |
+ return #asyncStart(#bodyName, #completer); |
}""", |
{ |
"parameters": parameters, |
@@ -1785,7 +1795,7 @@ class AsyncRewriter extends AsyncRewriterBase { |
"handler": handler, |
"errorCode": errorCodeName, |
"result": resultName, |
- "asyncHelper": asyncHelper, |
+ "asyncStart": asyncStart, |
"completer": completer, |
"wrapBody": wrapBody, |
}).withSourceInformation(sourceInformation); |