changeset 16295:d9de8f5197e1

simplified NodeEventListener implementations by having all events routed to a single method by default
author Doug Simon <doug.simon@oracle.com>
date Fri, 27 Jun 2014 13:39:36 +0200
parents 443411840041
children f2d75b3b3963
files graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/IterativeFlowSensitiveReductionPhase.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/util/HashSetNodeEventListener.java
diffstat 4 files changed, 64 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- 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);
         }
     }
 
--- 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)) {
--- 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)) {
--- 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<Node> nodes;
+    private final Set<NodeEvent> 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<Node> nodes;
-
-    public HashSetNodeEventListener() {
+    /**
+     * Creates a {@link NodeEventListener} that collects nodes from all events that match a given
+     * filter.
+     */
+    public HashSetNodeEventListener(Set<NodeEvent> 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);
+        }
     }
 
     /**