# HG changeset patch # User Christian Humer # Date 1426012687 -3600 # Node ID f682b9e6ca07c30969ea2f2f5e02139272b933fa # Parent e8d2f3f95dcdab0021c5d3eac5c1fa1cb544a854 Truffle: expose non-atomic replace API to Truffle DSL to avoid multiple RootNode lookups for multiple replaces in one atomic block. diff -r e8d2f3f95dcd -r f682b9e6ca07 graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java --- a/graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java Tue Mar 10 19:28:26 2015 +0100 +++ b/graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java Tue Mar 10 19:38:07 2015 +0100 @@ -301,7 +301,7 @@ SpecializationNode current = start; while (current != null) { if (current.isSame(toRemove)) { - current.replace(current.next, reason); + NodeUtil.nonAtomicReplace(current, current.next, reason); if (current == start) { start = start.next; } @@ -532,9 +532,10 @@ } } - static SpecializationNode insertAt(SpecializationNode node, SpecializationNode insertBefore, CharSequence message) { + static SpecializationNode insertAt(SpecializationNode node, SpecializationNode insertBefore, CharSequence reason) { insertBefore.next = node; - return node.replace(insertBefore, message); + // always guaranteed to be executed inside of an atomic block + return NodeUtil.nonAtomicReplace(node, insertBefore, reason); } @Override diff -r e8d2f3f95dcd -r f682b9e6ca07 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java Tue Mar 10 19:28:26 2015 +0100 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java Tue Mar 10 19:38:07 2015 +0100 @@ -267,7 +267,7 @@ return replace(newNode, ""); } - private void replaceHelper(Node newNode, CharSequence reason) { + final void replaceHelper(Node newNode, CharSequence reason) { CompilerAsserts.neverPartOfCompilation(); if (this.getParent() == null) { throw new IllegalStateException("This node cannot be replaced, because it does not yet have a parent."); diff -r e8d2f3f95dcd -r f682b9e6ca07 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java Tue Mar 10 19:28:26 2015 +0100 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java Tue Mar 10 19:38:07 2015 +0100 @@ -597,6 +597,11 @@ return nodes; } + public static T nonAtomicReplace(Node oldNode, T newNode, CharSequence reason) { + oldNode.replaceHelper(newNode, reason); + return newNode; + } + public static boolean replaceChild(Node parent, Node oldChild, Node newChild) { NodeClass nodeClass = NodeClass.get(parent.getClass());