# HG changeset patch # User Mick Jordan # Date 1446697991 28800 # Node ID 7d3d77397010dc97967f685fd0c531727cdb1205 # Parent ed3b78bbfa8104c316c78064a3ae84a0364ca116# Parent a1b3b789461153b6fd31b83b353d7c8c9d64aa1b Merge diff -r ed3b78bbfa81 -r 7d3d77397010 truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java --- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java Wed Nov 04 20:31:27 2015 -0800 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java Wed Nov 04 20:33:11 2015 -0800 @@ -53,6 +53,8 @@ } }; + private static final NodeFieldAccessor[] EMPTY_NODE_FIELD_ARRAY = new NodeFieldAccessor[0]; + // The comprehensive list of all fields. private final NodeFieldAccessor[] fields; // Separate arrays for the frequently accessed fields. @@ -68,11 +70,11 @@ return nodeClasses.get(clazz); } - public static NodeClass get(Node clazz) { - return clazz.getNodeClass(); + public static NodeClass get(Node node) { + return node.getNodeClass(); } - public NodeClass(Class clazz) { + NodeClass(Class clazz) { List fieldsList = new ArrayList<>(); NodeFieldAccessor parentFieldTmp = null; NodeFieldAccessor nodeClassFieldTmp = null; @@ -115,12 +117,12 @@ throw new AssertionError("parent field not found"); } - this.fields = fieldsList.toArray(new NodeFieldAccessor[fieldsList.size()]); + this.fields = fieldsList.toArray(EMPTY_NODE_FIELD_ARRAY); this.nodeClassField = nodeClassFieldTmp; this.parentField = parentFieldTmp; - this.childFields = childFieldList.toArray(new NodeFieldAccessor[childFieldList.size()]); - this.childrenFields = childrenFieldList.toArray(new NodeFieldAccessor[childrenFieldList.size()]); - this.cloneableFields = cloneableFieldList.toArray(new NodeFieldAccessor[cloneableFieldList.size()]); + this.childFields = childFieldList.toArray(EMPTY_NODE_FIELD_ARRAY); + this.childrenFields = childrenFieldList.toArray(EMPTY_NODE_FIELD_ARRAY); + this.cloneableFields = cloneableFieldList.toArray(EMPTY_NODE_FIELD_ARRAY); this.clazz = clazz; } diff -r ed3b78bbfa81 -r 7d3d77397010 truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/utilities/CyclicAssumption.java --- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/utilities/CyclicAssumption.java Wed Nov 04 20:31:27 2015 -0800 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/utilities/CyclicAssumption.java Wed Nov 04 20:33:11 2015 -0800 @@ -24,10 +24,11 @@ */ package com.oracle.truffle.api.utilities; +import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; + import com.oracle.truffle.api.Assumption; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.Truffle; -import java.util.concurrent.atomic.AtomicReference; /** * Holds an {@link Assumption}, and knows how to recreate it with the same properties on @@ -39,22 +40,24 @@ public class CyclicAssumption { private final String name; - private final AtomicReference assumption; + private volatile Assumption assumption; + + private static final AtomicReferenceFieldUpdater ASSUMPTION_UPDATER = AtomicReferenceFieldUpdater.newUpdater(CyclicAssumption.class, Assumption.class, "assumption"); public CyclicAssumption(String name) { this.name = name; - this.assumption = new AtomicReference<>(Truffle.getRuntime().createAssumption(name)); + this.assumption = Truffle.getRuntime().createAssumption(name); } @TruffleBoundary public void invalidate() { Assumption newAssumption = Truffle.getRuntime().createAssumption(name); - Assumption oldAssumption = assumption.getAndSet(newAssumption); + Assumption oldAssumption = ASSUMPTION_UPDATER.getAndSet(this, newAssumption); oldAssumption.invalidate(); } public Assumption getAssumption() { - return assumption.get(); + return assumption; } }