Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Unified Diff: pkg/compiler/lib/src/js/rewrite_async.dart

Issue 2858463002: js_runtime: Split _asyncHelper into separate functions (Closed)
Patch Set: update test Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/common_elements.dart ('k') | pkg/compiler/lib/src/js_backend/backend.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « pkg/compiler/lib/src/common_elements.dart ('k') | pkg/compiler/lib/src/js_backend/backend.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698