Index: pkg/compiler/lib/src/js_backend/backend.dart |
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart |
index 50f645a3f246c9661e4161b2866fec1d2628b26b..cf5a811f847902319eec420cc80a719338a752c7 100644 |
--- a/pkg/compiler/lib/src/js_backend/backend.dart |
+++ b/pkg/compiler/lib/src/js_backend/backend.dart |
@@ -941,6 +941,7 @@ class JavaScriptBackend extends Backend { |
Element e = findHelper('boolConversionCheck'); |
if (e != null) enqueue(world, e, registry); |
} |
+ |
if (TRACE_CALLS) { |
traceHelper = findHelper('traceHelper'); |
assert(traceHelper != null); |
@@ -1597,6 +1598,60 @@ class JavaScriptBackend extends Backend { |
return findHelper("throwCyclicInit"); |
} |
+ Element getThenHelper() { |
+ return findHelper("thenHelper"); |
+ } |
+ |
+ Element getYieldStar() { |
+ ClassElement classElement = findHelper("IterationMarker"); |
+ classElement.ensureResolved(compiler); |
+ return classElement.lookupLocalMember("yieldStar"); |
+ } |
+ |
+ Element getYieldSingle() { |
+ ClassElement classElement = findHelper("IterationMarker"); |
+ classElement.ensureResolved(compiler); |
+ return classElement.lookupLocalMember("yieldSingle"); |
+ } |
+ |
+ Element getStreamHelper() { |
+ return findHelper("streamHelper"); |
+ } |
+ |
+ Element getEndOfIteration() { |
+ ClassElement classElement = findHelper("IterationMarker"); |
+ classElement.ensureResolved(compiler); |
+ return classElement.lookupLocalMember("endOfIteration"); |
+ } |
+ |
+ Element getSyncStarIterable() { |
+ ClassElement classElement = findHelper("SyncStarIterable"); |
+ classElement.ensureResolved(compiler); |
+ return classElement; |
+ } |
+ |
+ Element getSyncStarIterableConstructor() { |
+ ClassElement classElement = getSyncStarIterable(); |
+ classElement.ensureResolved(compiler); |
+ return classElement.lookupConstructor(""); |
+ } |
+ |
+ Element getCompleterConstructor() { |
+ ClassElement classElement = find(compiler.asyncLibrary, "Completer"); |
+ classElement.ensureResolved(compiler); |
+ return classElement.lookupConstructor(""); |
+ } |
+ |
+ Element getMakeController() { |
+ return findHelper("makeAsyncStarController"); |
+ } |
+ |
+ Element getStreamIteratorConstructor() { |
+ ClassElement classElement = find(compiler.asyncLibrary, "StreamIterator"); |
+ classElement.ensureResolved(compiler); |
+ return classElement.lookupConstructor(""); |
+ } |
+ |
bool isNullImplementation(ClassElement cls) { |
return cls == jsNullClass; |
} |
@@ -2331,6 +2386,27 @@ class JavaScriptBackend extends Backend { |
String extension = addExtension ? ".part.js" : ""; |
return "${outName}_$name$extension"; |
} |
+ |
+ void registerAsyncMarker(FunctionElement element, |
+ Enqueuer enqueuer, |
+ Registry registry) { |
+ if (element.asyncMarker == AsyncMarker.ASYNC) { |
+ enqueue(enqueuer, getThenHelper(), registry); |
+ enqueue(enqueuer, getCompleterConstructor(), registry); |
+ enqueue(enqueuer, getStreamIteratorConstructor(), registry); |
+ } else if (element.asyncMarker == AsyncMarker.SYNC_STAR) { |
+ enqueuer.registerInstantiatedClass(getSyncStarIterable(), registry); |
+ enqueue(enqueuer, getSyncStarIterableConstructor(), registry); |
+ enqueue(enqueuer, getEndOfIteration(), registry); |
+ enqueue(enqueuer, getYieldStar(), registry); |
+ } else if (element.asyncMarker == AsyncMarker.ASYNC_STAR) { |
+ enqueue(enqueuer, getStreamHelper(), registry); |
+ enqueue(enqueuer, getYieldSingle(), registry); |
+ enqueue(enqueuer, getYieldStar(), registry); |
+ enqueue(enqueuer, getMakeController(), registry); |
+ enqueue(enqueuer, getStreamIteratorConstructor(), registry); |
+ } |
+ } |
} |
class JavaScriptResolutionCallbacks extends ResolutionCallbacks { |