| Index: lib/compiler/implementation/compiler.dart
|
| ===================================================================
|
| --- lib/compiler/implementation/compiler.dart (revision 7672)
|
| +++ lib/compiler/implementation/compiler.dart (working copy)
|
| @@ -29,50 +29,6 @@
|
| }
|
| }
|
|
|
| -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> codegenQueue;
|
| Universe universe;
|
| @@ -123,7 +79,10 @@
|
| TreeValidatorTask validator;
|
| ResolverTask resolver;
|
| TypeCheckerTask checker;
|
| - Backend backend;
|
| + SsaBuilderTask builder;
|
| + SsaOptimizerTask optimizer;
|
| + SsaCodeGeneratorTask generator;
|
| + CodeEmitterTask emitter;
|
| ConstantHandler constantHandler;
|
| EnqueueTask enqueuer;
|
|
|
| @@ -152,10 +111,14 @@
|
| validator = new TreeValidatorTask(this);
|
| resolver = new ResolverTask(this);
|
| checker = new TypeCheckerTask(this);
|
| - backend = new JavaScriptBackend(this);
|
| + builder = new SsaBuilderTask(this);
|
| + optimizer = new SsaOptimizerTask(this);
|
| + generator = new SsaCodeGeneratorTask(this);
|
| + emitter = new CodeEmitterTask(this);
|
| enqueuer = new EnqueueTask(this);
|
| tasks = [scanner, dietParser, parser, resolver, checker,
|
| - constantHandler, enqueuer];
|
| + builder, optimizer, generator,
|
| + emitter, constantHandler, enqueuer];
|
| }
|
|
|
| void ensure(bool condition) {
|
| @@ -342,7 +305,7 @@
|
| });
|
| }
|
| Collection<LibraryElement> libraries = universe.libraries.getValues();
|
| - backend.processNativeClasses(libraries);
|
| + native.processNativeClasses(this, libraries);
|
| world.populate(this, libraries);
|
| addToWorkList(main);
|
| codegenProgress.reset();
|
| @@ -353,7 +316,7 @@
|
| codegenQueueIsClosed = true;
|
| assert(enqueuer.checkNoEnqueuedInvokedInstanceMethods());
|
| enqueuer.registerFieldClosureInvocations();
|
| - backend.assembleProgram();
|
| + emitter.assembleProgram();
|
| if (!codegenQueue.isEmpty()) {
|
| internalErrorOnElement(codegenQueue.first().element,
|
| "work list is not empty");
|
| @@ -385,9 +348,22 @@
|
| constantHandler.compileWorkItem(work);
|
| return null;
|
| } else {
|
| - String code = backend.codegen(work);
|
| - universe.addGeneratedCode(work, code);
|
| - return code;
|
| + 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;
|
| + }
|
| }
|
| }
|
|
|
|
|