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

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: Next iteration 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') | lib/compiler/implementation/emitter.dart » ('J')
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..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;
}
}
« no previous file with comments | « no previous file | lib/compiler/implementation/emitter.dart » ('j') | lib/compiler/implementation/emitter.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698