# HG changeset patch # User Doug Simon # Date 1403869176 -7200 # Node ID d9de8f5197e1d0279a795ed010e38d67db4db729 # Parent 44341184004114eab93b62b6199018e006135ec4 simplified NodeEventListener implementations by having all events routed to a single method by default diff -r 443411840041 -r d9de8f5197e1 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java Fri Jun 27 13:38:18 2014 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java Fri Jun 27 13:39:36 2014 +0200 @@ -298,16 +298,46 @@ } /** + * The type of events sent to a {@link NodeEventListener}. + */ + public enum NodeEvent { + /** + * A node's input is changed. + */ + INPUT_CHANGED, + + /** + * A node's {@linkplain Node#usages() usages} count dropped to zero. + */ + ZERO_USAGES, + + /** + * A node was added to a graph. + */ + NODE_ADDED; + } + + /** * Client interested in one or more node related events. */ public interface NodeEventListener { /** + * Default handler for events. + * + * @param e an event + * @param node the node related to {@code e} + */ + default void event(NodeEvent e, Node node) { + } + + /** * Notifies this listener of a change in a node's inputs. * * @param node a node who has had one of its inputs changed */ default void inputChanged(Node node) { + event(NodeEvent.INPUT_CHANGED, node); } /** @@ -316,6 +346,7 @@ * @param node a node whose {@link Node#usages()} just became empty */ default void usagesDroppedToZero(Node node) { + event(NodeEvent.ZERO_USAGES, node); } /** @@ -324,6 +355,7 @@ * @param node a node that was just added to the graph */ default void nodeAdded(Node node) { + event(NodeEvent.NODE_ADDED, node); } } diff -r 443411840041 -r d9de8f5197e1 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java Fri Jun 27 13:38:18 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java Fri Jun 27 13:39:36 2014 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.graal.phases.common; +import static com.oracle.graal.graph.Graph.NodeEvent.*; + import com.oracle.graal.api.code.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.Graph.*; @@ -44,7 +46,7 @@ @Override protected void run(StructuredGraph graph, PhaseContext context) { ConditionalEliminationPhase eliminate = new ConditionalEliminationPhase(context.getMetaAccess()); - HashSetNodeEventListener listener = new HashSetNodeEventListener.ExceptForAddedNodes(); + HashSetNodeEventListener listener = new HashSetNodeEventListener().exclude(NODE_ADDED); int count = 0; while (true) { try (NodeEventScope nes = graph.trackNodeEvents(listener)) { diff -r 443411840041 -r d9de8f5197e1 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/IterativeFlowSensitiveReductionPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/IterativeFlowSensitiveReductionPhase.java Fri Jun 27 13:38:18 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/IterativeFlowSensitiveReductionPhase.java Fri Jun 27 13:39:36 2014 +0200 @@ -22,13 +22,15 @@ */ package com.oracle.graal.phases.common.cfs; +import static com.oracle.graal.graph.Graph.NodeEvent.*; + import com.oracle.graal.api.code.*; +import com.oracle.graal.graph.Graph.NodeEventScope; import com.oracle.graal.graph.*; -import com.oracle.graal.graph.Graph.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; import com.oracle.graal.phases.*; -import com.oracle.graal.phases.common.CanonicalizerPhase; +import com.oracle.graal.phases.common.*; import com.oracle.graal.phases.common.util.*; import com.oracle.graal.phases.tiers.*; @@ -47,7 +49,7 @@ @Override protected void run(StructuredGraph graph, PhaseContext context) { FlowSensitiveReductionPhase eliminate = new FlowSensitiveReductionPhase(context.getMetaAccess()); - HashSetNodeEventListener listener = new HashSetNodeEventListener.ExceptForAddedNodes(); + HashSetNodeEventListener listener = new HashSetNodeEventListener().exclude(NODE_ADDED); int count = 1; while (true) { try (NodeEventScope nes = graph.trackNodeEvents(listener)) { diff -r 443411840041 -r d9de8f5197e1 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/util/HashSetNodeEventListener.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/util/HashSetNodeEventListener.java Fri Jun 27 13:38:18 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/util/HashSetNodeEventListener.java Fri Jun 27 13:39:36 2014 +0200 @@ -24,7 +24,7 @@ import java.util.*; -import com.oracle.graal.graph.Graph.NodeEventListener; +import com.oracle.graal.graph.Graph.*; import com.oracle.graal.graph.*; /** @@ -33,32 +33,38 @@ */ public class HashSetNodeEventListener implements NodeEventListener { + private final Set nodes; + private final Set filter; + /** - * Accumulates all node events except for {@link NodeEventListener#nodeAdded(Node) node - * additions}. + * Creates a {@link NodeEventListener} that collects nodes from all events. */ - public static class ExceptForAddedNodes extends HashSetNodeEventListener { - @Override - public void nodeAdded(Node node) { - } + public HashSetNodeEventListener() { + this.nodes = new HashSet<>(); + this.filter = EnumSet.allOf(NodeEvent.class); } - private final Set nodes; - - public HashSetNodeEventListener() { + /** + * Creates a {@link NodeEventListener} that collects nodes from all events that match a given + * filter. + */ + public HashSetNodeEventListener(Set filter) { this.nodes = new HashSet<>(); + this.filter = filter; } - public void nodeAdded(Node node) { - nodes.add(node); + /** + * Excludes a given event from those for which nodes are collected. + */ + public HashSetNodeEventListener exclude(NodeEvent e) { + filter.remove(e); + return this; } - public void inputChanged(Node node) { - nodes.add(node); - } - - public void usagesDroppedToZero(Node node) { - nodes.add(node); + public void event(NodeEvent e, Node node) { + if (filter.contains(e)) { + nodes.add(node); + } } /**