| 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 139b3a1a86abb53480ae6b0ce3a5f30d8a77f050..00e3252a9459f472ab3e1b3cd194ae86aab814af 100644
|
| --- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
|
| +++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
|
| @@ -630,6 +630,12 @@ class Parameter extends Primitive {
|
| super.hint = hint;
|
| }
|
|
|
| + // In addition to a parent pointer to the containing Continuation or
|
| + // FunctionDefinition, parameters have an index into the list of parameters
|
| + // bound by the parent. This gives constant-time access to the continuation
|
| + // from the parent.
|
| + int parent_index;
|
| +
|
| accept(Visitor visitor) => visitor.visitParameter(this);
|
| }
|
|
|
| @@ -680,7 +686,7 @@ class FieldDefinition extends Node implements ExecutableDefinition {
|
|
|
| /// `true` if this field has no initializer.
|
| ///
|
| - /// If `true` [body] and [returnContinuation] are `null`.
|
| + /// If `true` [body] is `null`.
|
| ///
|
| /// This is different from a initializer that is `null`. Consider this class:
|
| ///
|
| @@ -717,7 +723,7 @@ class RunnableBody extends InteriorNode {
|
| }
|
|
|
| /// A function definition, consisting of parameters and a body. The parameters
|
| -/// include a distinguished continuation parameter.
|
| +/// include a distinguished continuation parameter (held by the body).
|
| class FunctionDefinition extends Node
|
| implements ExecutableDefinition {
|
| final FunctionElement element;
|
| @@ -751,8 +757,7 @@ class FunctionDefinition extends Node
|
|
|
| /// Returns `true` if this function is abstract or external.
|
| ///
|
| - /// If `true`, [body] and [returnContinuation] are `null` and [localConstants]
|
| - /// is empty.
|
| + /// If `true`, [body] is `null` and [localConstants] is empty.
|
| bool get isAbstract => body == null;
|
| }
|
|
|
| @@ -884,6 +889,7 @@ abstract class RecursiveVisitor extends Visitor {
|
| processRunnableBody(RunnableBody node) {}
|
| visitRunnableBody(RunnableBody node) {
|
| processRunnableBody(node);
|
| + visit(node.returnContinuation);
|
| visit(node.body);
|
| }
|
|
|
| @@ -1063,7 +1069,7 @@ abstract class RecursiveVisitor extends Visitor {
|
| visitContinuation(Continuation node) {
|
| processContinuation(node);
|
| node.parameters.forEach(visitParameter);
|
| - visit(node.body);
|
| + if (node.body != null) visit(node.body);
|
| }
|
|
|
| // Conditions.
|
|
|