| Index: lib/compiler/implementation/compiler.dart
|
| diff --git a/lib/compiler/implementation/compiler.dart b/lib/compiler/implementation/compiler.dart
|
| index db2c11f0f83015b958229f55a74f6424fe689d70..faaa5891b20fd8e856d9cee9e920409ed6540c0d 100644
|
| --- a/lib/compiler/implementation/compiler.dart
|
| +++ b/lib/compiler/implementation/compiler.dart
|
| @@ -22,6 +22,50 @@ class WorkItem {
|
| int hashCode() => element.hashCode();
|
| }
|
|
|
| +class Backend {
|
| + final Compiler compiler;
|
| +
|
| + Backend(this.compiler);
|
| +
|
| + abstract String codegen(WorkItem work);
|
| + abstract void processNativeClasses(libraries);
|
| + abstract void assembleProgram();
|
| +}
|
| +
|
| +class JavaScriptBackend extends Backend {
|
| + SsaBuilderTask builder;
|
| + SsaOptimizerTask optimizer;
|
| + SsaCodeGeneratorTask generator;
|
| + CodeEmitterTask emitter;
|
| +
|
| + JavaScriptBackend(Compiler compiler)
|
| + : emitter = new CodeEmitterTask(compiler),
|
| + super(compiler) {
|
| + builder = new SsaBuilderTask(this);
|
| + optimizer = new SsaOptimizerTask(this);
|
| + generator = new SsaCodeGeneratorTask(this);
|
| + }
|
| +
|
| + String codegen(WorkItem work) {
|
| + HGraph graph = builder.build(work);
|
| + optimizer.optimize(work, graph);
|
| + if (work.allowSpeculativeOptimization
|
| + && optimizer.trySpeculativeOptimizations(work, graph)) {
|
| + String code = generator.generateBailoutMethod(work, graph);
|
| + compiler.universe.addBailoutCode(work, code);
|
| + optimizer.prepareForSpeculativeOptimizations(work, graph);
|
| + optimizer.optimize(work, graph);
|
| + }
|
| + return generator.generateMethod(work, graph);
|
| + }
|
| +
|
| + void processNativeClasses(libraries) {
|
| + native.processNativeClasses(emitter, libraries);
|
| + }
|
| +
|
| + void assembleProgram() => emitter.assembleProgram();
|
| +}
|
| +
|
| class Compiler implements DiagnosticListener {
|
| Queue<WorkItem> worklist;
|
| Universe universe;
|
| @@ -72,10 +116,7 @@ class Compiler implements DiagnosticListener {
|
| TreeValidatorTask validator;
|
| ResolverTask resolver;
|
| TypeCheckerTask checker;
|
| - SsaBuilderTask builder;
|
| - SsaOptimizerTask optimizer;
|
| - SsaCodeGeneratorTask generator;
|
| - CodeEmitterTask emitter;
|
| + Backend backend;
|
| ConstantHandler constantHandler;
|
| EnqueueTask enqueuer;
|
|
|
| @@ -104,14 +145,10 @@ class Compiler implements DiagnosticListener {
|
| validator = new TreeValidatorTask(this);
|
| resolver = new ResolverTask(this);
|
| checker = new TypeCheckerTask(this);
|
| - builder = new SsaBuilderTask(this);
|
| - optimizer = new SsaOptimizerTask(this);
|
| - generator = new SsaCodeGeneratorTask(this);
|
| - emitter = new CodeEmitterTask(this);
|
| + backend = new JavaScriptBackend(this);
|
| enqueuer = new EnqueueTask(this);
|
| tasks = [scanner, dietParser, parser, resolver, checker,
|
| - builder, optimizer, generator,
|
| - emitter, constantHandler, enqueuer];
|
| + constantHandler, enqueuer];
|
| }
|
|
|
| void ensure(bool condition) {
|
| @@ -294,7 +331,7 @@ class Compiler implements DiagnosticListener {
|
| });
|
| }
|
| Collection<LibraryElement> libraries = universe.libraries.getValues();
|
| - native.processNativeClasses(this, libraries);
|
| + backend.processNativeClasses(libraries);
|
| world.populate(this, libraries);
|
| enqueue(new WorkItem.toCompile(main));
|
| codegenProgress.reset();
|
| @@ -305,7 +342,7 @@ class Compiler implements DiagnosticListener {
|
| workListIsClosed = true;
|
| assert(enqueuer.checkNoEnqueuedInvokedInstanceMethods());
|
| enqueuer.registerFieldClosureInvocations();
|
| - emitter.assembleProgram();
|
| + backend.assembleProgram();
|
| if (!worklist.isEmpty()) {
|
| internalErrorOnElement(worklist.first().element,
|
| "work list is not empty");
|
| @@ -337,22 +374,9 @@ class Compiler implements DiagnosticListener {
|
| constantHandler.compileWorkItem(work);
|
| return null;
|
| } else {
|
| - HGraph graph = builder.build(work);
|
| - optimizer.optimize(work, graph);
|
| - if (work.allowSpeculativeOptimization
|
| - && optimizer.trySpeculativeOptimizations(work, graph)) {
|
| - String code = generator.generateBailoutMethod(work, graph);
|
| - universe.addBailoutCode(work, code);
|
| - optimizer.prepareForSpeculativeOptimizations(work, graph);
|
| - optimizer.optimize(work, graph);
|
| - code = generator.generateMethod(work, graph);
|
| - universe.addGeneratedCode(work, code);
|
| - return code;
|
| - } else {
|
| - String code = generator.generateMethod(work, graph);
|
| - universe.addGeneratedCode(work, code);
|
| - return code;
|
| - }
|
| + String code = backend.codegen(work);
|
| + universe.addGeneratedCode(work, code);
|
| + return code;
|
| }
|
| }
|
|
|
|
|