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 edb9c57c8bbeb0f564827b137a4ab4a23dd48123..3dc61a43d9c8d4ca078e0aae8fc5932348d27c33 100644 |
--- a/pkg/compiler/lib/src/js_backend/backend.dart |
+++ b/pkg/compiler/lib/src/js_backend/backend.dart |
@@ -63,6 +63,7 @@ class FunctionInlineCache { |
class JavaScriptBackend extends Backend { |
static final Uri DART_JS_HELPER = new Uri(scheme: 'dart', path: '_js_helper'); |
+ static final Uri DART_ASYNC = new Uri(scheme: 'dart', path: 'async'); |
static final Uri DART_INTERCEPTORS = |
new Uri(scheme: 'dart', path: '_interceptors'); |
static final Uri DART_INTERNAL = |
@@ -122,6 +123,7 @@ class JavaScriptBackend extends Backend { |
FunctionInlineCache inlineCache = new FunctionInlineCache(); |
LibraryElement jsHelperLibrary; |
+ LibraryElement asyncLibrary; |
LibraryElement interceptorsLibrary; |
LibraryElement foreignLibrary; |
LibraryElement isolateHelperLibrary; |
@@ -941,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); |
@@ -1597,6 +1600,66 @@ class JavaScriptBackend extends Backend { |
return findHelper("throwCyclicInit"); |
} |
+ Element getFuture() { |
+ return asyncLibrary.find("Future"); |
+ } |
+ |
+ Element getThenHelper() { |
+ return findHelper("thenHelper"); |
+ } |
+ |
+ Element getSyncStarYieldStar() { |
+ 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(asyncLibrary, "Completer"); |
+ classElement.ensureResolved(compiler); |
+ return classElement |
floitsch
2015/02/02 22:00:10
same line.
sigurdm
2015/02/03 16:59:31
Done.
|
+ .lookupConstructor(""); |
+ } |
+ |
+ Element getMakeController() { |
+ return findHelper("makeAsyncStarController"); |
+ } |
+ |
+ Element getStreamIteratorConstructor() { |
+ ClassElement classElement = find(asyncLibrary, "StreamIterator"); |
+ classElement.ensureResolved(compiler); |
+ return classElement |
floitsch
2015/02/02 22:00:10
same line.
sigurdm
2015/02/03 16:59:31
Done.
|
+ .lookupConstructor(""); |
+ } |
+ |
bool isNullImplementation(ClassElement cls) { |
return cls == jsNullClass; |
} |
@@ -1696,6 +1759,8 @@ class JavaScriptBackend extends Backend { |
Uri uri = library.canonicalUri; |
if (uri == DART_JS_HELPER) { |
jsHelperLibrary = library; |
+ } else if (uri == DART_ASYNC) { |
+ asyncLibrary = library; |
} else if (uri == DART_INTERNAL) { |
internalLibrary = library; |
} else if (uri == DART_INTERCEPTORS) { |
@@ -2331,6 +2396,26 @@ 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, getSyncStarYieldStar(), registry); |
+ } else if (element.asyncMarker == AsyncMarker.ASYNC_STAR) { |
+ enqueue(enqueuer, getStreamHelper(), registry); |
+ enqueue(enqueuer, getYieldSingle(), registry); |
+ enqueue(enqueuer, getMakeController(), registry); |
+ enqueue(enqueuer, getStreamIteratorConstructor(), registry); |
+ } |
+ } |
} |
class JavaScriptResolutionCallbacks extends ResolutionCallbacks { |