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

Unified Diff: lib/compiler/implementation/compiler.dart

Issue 10386086: RFC: Start refactoring to provide more than a single backend. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | lib/compiler/implementation/emitter.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
}
« no previous file with comments | « no previous file | lib/compiler/implementation/emitter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698