changeset 19758:f682b9e6ca07

Truffle: expose non-atomic replace API to Truffle DSL to avoid multiple RootNode lookups for multiple replaces in one atomic block.
author Christian Humer <christian.humer@gmail.com>
date Tue, 10 Mar 2015 19:38:07 +0100
parents e8d2f3f95dcd
children 39315508f1b6
files graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java
diffstat 3 files changed, 10 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- 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 <T> SpecializationNode insertAt(SpecializationNode node, SpecializationNode insertBefore, CharSequence message) {
+    static <T> 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
--- 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.");
--- 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 extends Node> 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());