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

Side by Side Diff: pkg/compiler/lib/src/ssa/builder.dart

Issue 1253333002: dart2js cps: Support async/await by rewriting the JavaScript AST. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Rewrite to switch. Created 5 years, 4 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of ssa; 5 part of ssa;
6 6
7 class SsaFunctionCompiler implements FunctionCompiler { 7 class SsaFunctionCompiler implements FunctionCompiler {
8 SsaCodeGeneratorTask generator; 8 final SsaCodeGeneratorTask generator;
9 SsaBuilderTask builder; 9 final SsaBuilderTask builder;
10 SsaOptimizerTask optimizer; 10 final SsaOptimizerTask optimizer;
11 final JavaScriptBackend backend;
11 12
12 SsaFunctionCompiler(JavaScriptBackend backend, 13 SsaFunctionCompiler(JavaScriptBackend backend,
13 SourceInformationStrategy sourceInformationFactory) 14 SourceInformationStrategy sourceInformationFactory)
14 : generator = new SsaCodeGeneratorTask(backend, sourceInformationFactory), 15 : generator = new SsaCodeGeneratorTask(backend, sourceInformationFactory),
15 builder = new SsaBuilderTask(backend, sourceInformationFactory), 16 builder = new SsaBuilderTask(backend, sourceInformationFactory),
16 optimizer = new SsaOptimizerTask(backend); 17 optimizer = new SsaOptimizerTask(backend),
18 backend = backend;
17 19
18 /// Generates JavaScript code for `work.element`. 20 /// Generates JavaScript code for `work.element`.
19 /// Using the ssa builder, optimizer and codegenerator. 21 /// Using the ssa builder, optimizer and codegenerator.
20 js.Fun compile(CodegenWorkItem work) { 22 js.Fun compile(CodegenWorkItem work) {
21 HGraph graph = builder.build(work); 23 HGraph graph = builder.build(work);
22 optimizer.optimize(work, graph); 24 optimizer.optimize(work, graph);
23 Element element = work.element; 25 Element element = work.element;
24 js.Expression result = generator.generateCode(work, graph); 26 js.Expression result = generator.generateCode(work, graph);
25 if (element is FunctionElement) { 27 if (element is FunctionElement) {
26 JavaScriptBackend backend = builder.backend; 28 result = backend.rewriteAsync(element, result);
27
28 AsyncRewriterBase rewriter = null;
29 js.Name name = backend.namer.methodPropertyName(element);
30 if (element.asyncMarker == AsyncMarker.ASYNC) {
31 rewriter = new AsyncRewriter(
32 backend.compiler,
33 backend.compiler.currentElement,
34 asyncHelper:
35 backend.emitter.staticFunctionAccess(backend.getAsyncHelper()),
36 newCompleter: backend.emitter.staticFunctionAccess(
37 backend.getCompleterConstructor()),
38 safeVariableName: backend.namer.safeVariablePrefixForAsyncRewrite,
39 bodyName: backend.namer.deriveAsyncBodyName(name));
40 } else if (element.asyncMarker == AsyncMarker.SYNC_STAR) {
41 rewriter = new SyncStarRewriter(
42 backend.compiler,
43 backend.compiler.currentElement,
44 endOfIteration: backend.emitter.staticFunctionAccess(
45 backend.getEndOfIteration()),
46 newIterable: backend.emitter.staticFunctionAccess(
47 backend.getSyncStarIterableConstructor()),
48 yieldStarExpression: backend.emitter.staticFunctionAccess(
49 backend.getYieldStar()),
50 uncaughtErrorExpression: backend.emitter.staticFunctionAccess(
51 backend.getSyncStarUncaughtError()),
52 safeVariableName: backend.namer.safeVariablePrefixForAsyncRewrite,
53 bodyName: backend.namer.deriveAsyncBodyName(name));
54 }
55 else if (element.asyncMarker == AsyncMarker.ASYNC_STAR) {
56 rewriter = new AsyncStarRewriter(
57 backend.compiler,
58 backend.compiler.currentElement,
59 asyncStarHelper: backend.emitter.staticFunctionAccess(
60 backend.getAsyncStarHelper()),
61 streamOfController: backend.emitter.staticFunctionAccess(
62 backend.getStreamOfController()),
63 newController: backend.emitter.staticFunctionAccess(
64 backend.getASyncStarControllerConstructor()),
65 safeVariableName: backend.namer.safeVariablePrefixForAsyncRewrite,
66 yieldExpression: backend.emitter.staticFunctionAccess(
67 backend.getYieldSingle()),
68 yieldStarExpression: backend.emitter.staticFunctionAccess(
69 backend.getYieldStar()),
70 bodyName: backend.namer.deriveAsyncBodyName(name));
71 }
72 if (rewriter != null) {
73 result = rewriter.rewrite(result);
74 }
75 } 29 }
76 return result; 30 return result;
77 } 31 }
78 32
79 Iterable<CompilerTask> get tasks { 33 Iterable<CompilerTask> get tasks {
80 return <CompilerTask>[builder, optimizer, generator]; 34 return <CompilerTask>[builder, optimizer, generator];
81 } 35 }
82 } 36 }
83 37
84 /// A synthetic local variable only used with the SSA graph. 38 /// A synthetic local variable only used with the SSA graph.
(...skipping 8796 matching lines...) Expand 10 before | Expand all | Expand 10 after
8881 if (unaliased is TypedefType) throw 'unable to unalias $type'; 8835 if (unaliased is TypedefType) throw 'unable to unalias $type';
8882 unaliased.accept(this, builder); 8836 unaliased.accept(this, builder);
8883 } 8837 }
8884 8838
8885 void visitDynamicType(DynamicType type, SsaBuilder builder) { 8839 void visitDynamicType(DynamicType type, SsaBuilder builder) {
8886 JavaScriptBackend backend = builder.compiler.backend; 8840 JavaScriptBackend backend = builder.compiler.backend;
8887 ClassElement cls = backend.findHelper('DynamicRuntimeType'); 8841 ClassElement cls = backend.findHelper('DynamicRuntimeType');
8888 builder.push(new HDynamicType(type, new TypeMask.exact(cls, classWorld))); 8842 builder.push(new HDynamicType(type, new TypeMask.exact(cls, classWorld)));
8889 } 8843 }
8890 } 8844 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_backend/js_backend.dart ('k') | pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698