Chromium Code Reviews| Index: pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart |
| diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart |
| index 8f6ff29b7484d1ea50dd3121a135e763211056f8..019b44e556a58cfb14b49b3059c8cb8a5e7a05ba 100644 |
| --- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart |
| +++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart |
| @@ -12,6 +12,7 @@ import '../dart2jslib.dart' as dart2js show invariant; |
| import '../elements/elements.dart'; |
| import '../universe/universe.dart' show Selector, SelectorKind; |
| import '../dart_types.dart' show DartType, GenericType; |
| +import '../cps_ir/optimizers.dart'; |
| abstract class Node { |
| static int hashCount = 0; |
| @@ -544,9 +545,28 @@ class Continuation extends Definition<Continuation> implements InteriorNode { |
| accept(Visitor visitor) => visitor.visitContinuation(this); |
| } |
| +abstract class ExecutableDefinition implements Node { |
| + acceptPass(Pass pass); |
| +} |
| + |
| +// This is basically a function definition with an empty parameter list and a |
| +// field element instead of a function element and no const declarations, and |
| +// never a getter or setter, though that's less important. |
| +class FieldDefinition extends Node |
|
Kevin Millikin (Google)
2014/11/26 13:31:30
Better:
class FieldDefinition extends Node
im
sigurdm
2014/11/26 14:38:43
Done.
|
| + implements InteriorNode, ExecutableDefinition { |
| + final FieldElement element; |
| + final Continuation returnContinuation; |
| + Expression body; |
| + |
| + FieldDefinition(this.element, this.returnContinuation, this.body); |
| + accept(Visitor visitor) => visitor.visitFieldDefinition(this); |
| + acceptPass(Pass pass) => pass.rewriteFieldDefinition(this); |
| +} |
| + |
| /// A function definition, consisting of parameters and a body. The parameters |
| /// include a distinguished continuation parameter. |
| -class FunctionDefinition extends Node implements InteriorNode { |
| +class FunctionDefinition extends Node implements InteriorNode, |
| + ExecutableDefinition { |
| final FunctionElement element; |
| final Continuation returnContinuation; |
| final List<Parameter> parameters; |
| @@ -567,6 +587,7 @@ class FunctionDefinition extends Node implements InteriorNode { |
| this.localConstants = const <ConstDeclaration>[]; |
| accept(Visitor visitor) => visitor.visitFunctionDefinition(this); |
| + acceptPass(Pass pass) => pass.rewriteFunctionDefinition(this); |
|
Kevin Millikin (Google)
2014/11/26 13:31:29
applyPass?
sigurdm
2014/11/26 14:38:43
Done.
|
| /// Returns `true` if this function is abstract or external. |
| /// |
| @@ -591,6 +612,7 @@ abstract class Visitor<T> { |
| T visitCondition(Condition node) => visitNode(node); |
| // Concrete classes. |
| + T visitFieldDefinition(FieldDefinition node) => visitNode(node); |
| T visitFunctionDefinition(FunctionDefinition node) => visitNode(node); |
| // Expressions. |
| @@ -637,6 +659,12 @@ abstract class RecursiveVisitor extends Visitor { |
| processReference(Reference ref) {} |
| + processFieldDefinition(FieldDefinition node) {} |
| + visitFieldDefinition(FieldDefinition node) { |
| + processFieldDefinition(node); |
| + visit(node.body); |
| + } |
| + |
| processFunctionDefinition(FunctionDefinition node) {} |
| visitFunctionDefinition(FunctionDefinition node) { |
| processFunctionDefinition(node); |
| @@ -703,7 +731,6 @@ abstract class RecursiveVisitor extends Visitor { |
| node.arguments.forEach(processReference); |
| } |
| - |
| processBranch(Branch node) {} |
| visitBranch(Branch node) { |
| processBranch(node); |
| @@ -846,12 +873,15 @@ class RegisterAllocator extends Visitor { |
| allocate(reference.definition); |
| } |
| + void visitFieldDefinition(FieldDefinition node) { |
| + visit(node.body); |
| + } |
| + |
| void visitFunctionDefinition(FunctionDefinition node) { |
| if (!node.isAbstract) { |
| visit(node.body); |
| } |
| node.parameters.forEach(allocate); // Assign indices to unused parameters. |
| - elementRegisters.clear(); |
| } |
| void visitLetPrim(LetPrim node) { |