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 b3ec3fdcffc5efa5829eec55ee70dacb248bd47b..92c86b203a916d2017d615d9cbe3728311efe5d6 100644 |
--- a/pkg/compiler/lib/src/js_backend/backend.dart |
+++ b/pkg/compiler/lib/src/js_backend/backend.dart |
@@ -943,6 +943,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); |
@@ -1599,6 +1600,67 @@ 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 getASyncStarController() { |
+ ClassElement classElement = findHelper("AsyncStarStreamController"); |
+ classElement.ensureResolved(compiler); |
+ return classElement; |
+ } |
+ |
+ Element getASyncStarControllerConstructor() { |
+ ClassElement classElement = getASyncStarController(); |
+ return classElement.lookupConstructor(""); |
+ } |
+ |
+ Element getStreamIteratorConstructor() { |
+ ClassElement classElement = find(compiler.asyncLibrary, "StreamIterator"); |
+ classElement.ensureResolved(compiler); |
+ return classElement.lookupConstructor(""); |
+ } |
+ |
bool isNullImplementation(ClassElement cls) { |
return cls == jsNullClass; |
} |
@@ -2334,6 +2396,28 @@ 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) { |
+ enqueuer.registerInstantiatedClass(getASyncStarController(), registry); |
+ enqueue(enqueuer, getStreamHelper(), registry); |
+ enqueue(enqueuer, getYieldSingle(), registry); |
+ enqueue(enqueuer, getYieldStar(), registry); |
+ enqueue(enqueuer, getASyncStarControllerConstructor(), registry); |
+ enqueue(enqueuer, getStreamIteratorConstructor(), registry); |
+ } |
+ } |
} |
/// Handling of special annotations for tests. |