< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.graph/src/org/graalvm/compiler/graph/Graph.java

Print this page

        

*** 512,563 **** 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); } /** * Notifies this listener of a node becoming unused. * * @param node a node whose {@link Node#usages()} just became empty */ ! default void usagesDroppedToZero(Node node) { ! event(NodeEvent.ZERO_USAGES, node); } /** * Notifies this listener of an added node. * * @param node a node that was just added to the graph */ ! default void nodeAdded(Node node) { ! event(NodeEvent.NODE_ADDED, node); } } /** * Registers a given {@link NodeEventListener} with the enclosing graph until this object is --- 512,600 ---- ZERO_USAGES, /** * A node was added to a graph. */ ! NODE_ADDED, ! ! /** ! * A node was removed from the graph. ! */ ! NODE_REMOVED; } /** * Client interested in one or more node related events. */ ! public abstract static class NodeEventListener { /** ! * A method called when a change event occurs. ! * ! * This method dispatches the event to user-defined triggers. The methods that change the ! * graph (typically in Graph and Node) must call this method to dispatch the event. * * @param e an event * @param node the node related to {@code e} */ ! final void event(NodeEvent e, Node node) { ! switch (e) { ! case INPUT_CHANGED: ! inputChanged(node); ! break; ! case ZERO_USAGES: ! usagesDroppedToZero(node); ! break; ! case NODE_ADDED: ! nodeAdded(node); ! break; ! case NODE_REMOVED: ! nodeRemoved(node); ! break; ! } ! changed(e, node); } /** ! * Notifies this listener about any change event in the graph. ! * ! * @param e an event ! * @param node the node related to {@code e} ! */ ! public void changed(NodeEvent e, Node node) { ! } ! ! /** ! * Notifies this listener about a change in a node's inputs. * * @param node a node who has had one of its inputs changed */ ! public void inputChanged(Node node) { } /** * Notifies this listener of a node becoming unused. * * @param node a node whose {@link Node#usages()} just became empty */ ! public void usagesDroppedToZero(Node node) { } /** * Notifies this listener of an added node. * * @param node a node that was just added to the graph */ ! public void nodeAdded(Node node) { ! } ! ! /** ! * Notifies this listener of a removed node. ! * ! * @param node ! */ ! public void nodeRemoved(Node node) { } } /** * Registers a given {@link NodeEventListener} with the enclosing graph until this object is
*** 581,591 **** nodeEventListener = null; } } } ! private static class ChainedNodeEventListener implements NodeEventListener { NodeEventListener head; NodeEventListener next; ChainedNodeEventListener(NodeEventListener head, NodeEventListener next) { --- 618,628 ---- nodeEventListener = null; } } } ! private static class ChainedNodeEventListener extends NodeEventListener { NodeEventListener head; NodeEventListener next; ChainedNodeEventListener(NodeEventListener head, NodeEventListener next) {
*** 593,616 **** this.next = next; } @Override public void nodeAdded(Node node) { ! head.nodeAdded(node); ! next.nodeAdded(node); } @Override public void inputChanged(Node node) { ! head.inputChanged(node); ! next.inputChanged(node); } @Override public void usagesDroppedToZero(Node node) { ! head.usagesDroppedToZero(node); ! next.usagesDroppedToZero(node); } } /** * Registers a given {@link NodeEventListener} with this graph. This should be used in --- 630,665 ---- this.next = next; } @Override public void nodeAdded(Node node) { ! head.event(NodeEvent.NODE_ADDED, node); ! next.event(NodeEvent.NODE_ADDED, node); } @Override public void inputChanged(Node node) { ! head.event(NodeEvent.INPUT_CHANGED, node); ! next.event(NodeEvent.INPUT_CHANGED, node); } @Override public void usagesDroppedToZero(Node node) { ! head.event(NodeEvent.ZERO_USAGES, node); ! next.event(NodeEvent.ZERO_USAGES, node); ! } ! ! @Override ! public void nodeRemoved(Node node) { ! head.event(NodeEvent.NODE_REMOVED, node); ! next.event(NodeEvent.NODE_REMOVED, node); ! } ! ! @Override ! public void changed(NodeEvent e, Node node) { ! head.event(e, node); ! next.event(e, node); } } /** * Registers a given {@link NodeEventListener} with this graph. This should be used in
*** 1021,1031 **** seenNodeSourcePosition = seenNodeSourcePosition || node.getNodeSourcePosition() != null; updateNodeCaches(node); if (nodeEventListener != null) { ! nodeEventListener.nodeAdded(node); } afterRegister(node); } private void grow() { --- 1070,1080 ---- seenNodeSourcePosition = seenNodeSourcePosition || node.getNodeSourcePosition() != null; updateNodeCaches(node); if (nodeEventListener != null) { ! nodeEventListener.event(NodeEvent.NODE_ADDED, node); } afterRegister(node); } private void grow() {
*** 1083,1092 **** --- 1132,1145 ---- removeNodeFromCache(node); } nodes[node.id] = null; nodesDeletedSinceLastCompression++; + if (nodeEventListener != null) { + nodeEventListener.event(NodeEvent.NODE_ADDED, node); + } + // nodes aren't removed from the type cache here - they will be removed during iteration } public boolean verify() { if (Options.VerifyGraalGraphs.getValue(options)) {
< prev index next >