< 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 >