Chromium Code Reviews| Index: lib/compiler/implementation/compiler.dart |
| diff --git a/lib/compiler/implementation/compiler.dart b/lib/compiler/implementation/compiler.dart |
| index db2c11f0f83015b958229f55a74f6424fe689d70..0333cced4edb45439eda22c91d38404fcc5eb953 100644 |
| --- a/lib/compiler/implementation/compiler.dart |
| +++ b/lib/compiler/implementation/compiler.dart |
| @@ -22,6 +22,41 @@ class WorkItem { |
| int hashCode() => element.hashCode(); |
| } |
| +interface Backend { |
| + String codegen(WorkItem work); |
| + void assembleProgram(); |
| +} |
| + |
| +class JavaScriptBackend implements Backend { |
|
ahe
2012/05/14 08:14:30
Consider creating a separate library for this clas
Anton Muhin
2012/05/14 14:36:45
What would be your recommendation where to place i
|
| + Compiler compiler; |
| + SsaBuilderTask builder; |
| + SsaOptimizerTask optimizer; |
| + SsaCodeGeneratorTask generator; |
| + CodeEmitterTask emitter; |
| + |
| + JavaScriptBackend(Compiler compiler) |
| + : this.compiler = compiler, |
| + builder = new SsaBuilderTask(compiler), |
| + optimizer = new SsaOptimizerTask(compiler), |
| + generator = new SsaCodeGeneratorTask(compiler), |
| + emitter = new CodeEmitterTask(compiler); |
| + |
| + 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 assembleProgram() => emitter.assembleProgram(); |
| +} |
| + |
| class Compiler implements DiagnosticListener { |
| Queue<WorkItem> worklist; |
| Universe universe; |
| @@ -72,10 +107,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 +136,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) { |
| @@ -305,7 +333,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 +365,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; |
| } |
| } |