Index: pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
index a776ace40d04050f3ec0b259ffd5a122615ff322..c075b77bc4d2e4625b2fa5b86b2ae3b8bb57d7db 100644 |
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
@@ -22,87 +22,59 @@ import '../universe/universe.dart' show SelectorKind, CallStructure; |
import 'cps_ir_nodes.dart' as ir; |
import 'cps_ir_builder.dart'; |
-/** |
- * This task iterates through all resolved elements and builds [ir.Node]s. The |
- * nodes are stored in the [nodes] map and accessible through [hasIr] and |
- * [getIr]. |
- * |
- * The functionality of the IrNodes is added gradually, therefore elements might |
- * have an IR or not, depending on the language features that are used. For |
- * elements that do have an IR, the tree [ast.Node]s and the [Token]s are not |
- * used in the rest of the compilation. This is ensured by setting the element's |
- * cached tree to `null` and also breaking the token stream to crash future |
- * attempts to parse. |
- * |
- * The type inferrer works on either IR nodes or tree nodes. The IR nodes are |
- * then translated into the SSA form for optimizations and code generation. |
- * Long-term, once the IR supports the full language, the backend can be |
- * re-implemented to work directly on the IR. |
- */ |
+typedef void IrBuilderCallback(Element element, ir.FunctionDefinition irNode); |
+ |
+/// This task provides the interface to build IR nodes from [ast.Node]s, which |
+/// is used from the [CpsFunctionCompiler] to generate code. |
+/// |
+/// This class is mainly there to correctly measure how long building the IR |
+/// takes. |
class IrBuilderTask extends CompilerTask { |
- final Map<Element, ir.FunctionDefinition> nodes = |
- <Element, ir.FunctionDefinition>{}; |
final SourceInformationFactory sourceInformationFactory; |
String bailoutMessage = null; |
- IrBuilderTask(Compiler compiler, this.sourceInformationFactory) |
+ /// If not null, this function will be called with for each |
+ /// [ir.FunctionDefinition] node that has been built. |
+ IrBuilderCallback builderCallback; |
+ |
+ IrBuilderTask(Compiler compiler, this.sourceInformationFactory, |
+ [this.builderCallback]) |
: super(compiler); |
String get name => 'IR builder'; |
- bool hasIr(Element element) => nodes.containsKey(element.implementation); |
- |
- ir.FunctionDefinition getIr(ExecutableElement element) { |
- return nodes[element.implementation]; |
- } |
- |
ir.FunctionDefinition buildNode(AstElement element) { |
- return measure(() => _buildNode(element)); |
- } |
- |
- ir.FunctionDefinition _buildNode(AstElement element) { |
- bailoutMessage = null; |
- |
- TreeElements elementsMapping = element.resolvedAst.elements; |
- element = element.implementation; |
- return compiler.withCurrentElement(element, () { |
- SourceInformationBuilder sourceInformationBuilder = |
- sourceInformationFactory.forContext(element); |
- |
- IrBuilderVisitor builder = |
- new JsIrBuilderVisitor( |
- elementsMapping, compiler, sourceInformationBuilder); |
- ir.FunctionDefinition irNode = builder.buildExecutable(element); |
- if (irNode == null) { |
- bailoutMessage = builder.bailoutMessage; |
- } else { |
- nodes[element] = irNode; |
- } |
- return irNode; |
- }); |
- } |
- |
- void buildNodes() { |
- measure(() { |
- Set<Element> resolved = compiler.enqueuer.resolution.resolvedElements; |
- resolved.forEach(buildNode); |
+ return measure(() { |
+ bailoutMessage = null; |
+ |
+ TreeElements elementsMapping = element.resolvedAst.elements; |
+ element = element.implementation; |
+ return compiler.withCurrentElement(element, () { |
+ SourceInformationBuilder sourceInformationBuilder = |
+ sourceInformationFactory.forContext(element); |
+ |
+ IrBuilderVisitor builder = |
+ new JsIrBuilderVisitor( |
+ elementsMapping, compiler, sourceInformationBuilder); |
+ ir.FunctionDefinition irNode = builder.buildExecutable(element); |
+ if (irNode == null) { |
+ bailoutMessage = builder.bailoutMessage; |
+ } else if (builderCallback != null) { |
+ builderCallback(element, irNode); |
+ } |
+ return irNode; |
+ }); |
}); |
} |
- |
- bool get inCheckedMode { |
- bool result = false; |
- assert((result = true)); |
- return result; |
- } |
- |
} |
-/** |
- * A tree visitor that builds [IrNodes]. The visit methods add statements using |
- * to the [builder] and return the last added statement for trees that represent |
- * an expression. |
- */ |
+ |
+/// A tree visitor that builds [ir.Node]s. |
+/// |
+/// The visit methods add statements using the [irBuilder] and return the last |
+/// added statement for trees that represent expressions. |
+/// |
// TODO(johnniwinther): Implement [SemanticDeclVisitor]. |
abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
with IrBuilderMixin<ast.Node>, |