Mercurial > hg > truffle
diff graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/DSLShare.java @ 16763:e6d15134ca86
Truffle-DSL: fixed formatting problems.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Mon, 11 Aug 2014 16:21:54 +0200 |
parents | 4f589fa69b9c |
children | 90984ae0eaa8 |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/DSLShare.java Mon Aug 11 15:57:47 2014 +0200 +++ b/graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/DSLShare.java Mon Aug 11 16:21:54 2014 +0200 @@ -1,176 +1,176 @@ -package com.oracle.truffle.api.dsl.internal; - -import java.util.*; - -import com.oracle.truffle.api.nodes.*; - -/** Contains utility classes shared across generated DSLNode implementations. */ -public class DSLShare { - - public static boolean isExcluded(Node currentNode, DSLMetadata otherMetadata) { - assert otherMetadata.getExcludedBy().length > 0 : "At least one exclude must be defined for isIncluded."; - Node cur = findRoot(currentNode); - while (cur != null) { - Class<?> curClass = cur.getClass(); - if (curClass == otherMetadata.getSpecializationClass()) { - return true; - } else if (containsClass(otherMetadata.getExcludedBy(), cur)) { - return true; - } - cur = getNext(cur); - } - return false; - } - - private static boolean includes(Node oldNode, DSLNode newNode) { - return containsClass(newNode.getMetadata0().getIncludes(), oldNode); - } - - public static <T extends Node & DSLNode> T rewrite(Node thisNode, T newNode, String message) { - assert newNode != null; - if (getNext(thisNode) != null || getPrevious(thisNode) != null) { - // already polymorphic -> append - return appendPolymorphic(findUninitialized(thisNode), newNode); - } else if (includes(thisNode, newNode)) { - // included -> remains monomorphic - newNode.adoptChildren0(thisNode, null); - return thisNode.replace(newNode, message); - } else { - // goto polymorphic - return null; - } - } - - @SuppressWarnings("unchecked") - public static <T extends Node> T findRoot(T node) { - Node prev = node; - Node cur; - do { - cur = prev; - prev = getPrevious(cur); - } while (prev != null); - return (T) cur; - } - - private static Node findUninitialized(Node node) { - Node next = node; - Node cur; - do { - cur = next; - next = getNext(cur); - } while (next != null); - return cur; - } - - public static <T extends Node & DSLNode> T rewriteUninitialized(Node uninitialized, T newNode) { - Node prev = getPrevious(uninitialized); - if (prev == null) { - newNode.adoptChildren0(uninitialized, null); - return uninitialized.replace(newNode, "Uninitialized monomorphic"); - } else { - return appendPolymorphic(uninitialized, newNode); - } - } - - public static <T extends Node & DSLNode> T rewriteToPolymorphic(Node oldNode, DSLNode uninitialized, T polymorphic, DSLNode currentCopy, DSLNode newNode, String message) { - assert getNext(oldNode) == null; - assert getPrevious(oldNode) == null; - - polymorphic.adoptChildren0(oldNode, (Node) currentCopy); - - if (newNode == null) { - // fallback - currentCopy.adoptChildren0(null, (Node) uninitialized); - } else { - // new specialization - newNode.adoptChildren0(null, (Node) uninitialized); - currentCopy.adoptChildren0(null, (Node) newNode); - } - - oldNode.replace(polymorphic, message); - - assert polymorphic.getNext0() == currentCopy; - assert newNode != null ? currentCopy.getNext0() == newNode : currentCopy.getNext0() == uninitialized; - assert uninitialized.getNext0() == null; - return polymorphic; - } - - private static Class<?>[] mergeTypes(DSLNode node, Class<?>[] types) { - Class<?>[] specializedTypes = node.getMetadata0().getSpecializedTypes(); - if (specializedTypes.length == 0) { - return null; - } else if (types == null) { - return Arrays.copyOf(specializedTypes, specializedTypes.length); - } else { - for (int i = 0; i < specializedTypes.length; i++) { - if (specializedTypes[i] != types[i]) { - types[i] = Object.class; - } - } - return types; - } - } - - private static <T extends Node & DSLNode> T appendPolymorphic(Node uninitialized, T newNode) { - Class<?>[] includes = newNode.getMetadata0().getIncludes(); - Node cur = getPrevious(uninitialized); - Node prev = uninitialized; - int depth = 0; - Class<?>[] types = null; - while (cur != null) { - if (containsClass(includes, cur)) { - cur.replace(prev, "Included in other specialization"); - cur = prev; - } else { - depth++; - types = mergeTypes((DSLNode) cur, types); - } - prev = cur; - cur = getPrevious(cur); - } - assert prev.getCost() == NodeCost.POLYMORPHIC; - - if (depth == 0) { - newNode.adoptChildren0(prev, null); - return prev.replace(newNode, "Polymorphic to monomorphic."); - } else { - newNode.adoptChildren0(null, uninitialized); - ((DSLNode) prev).updateTypes0(mergeTypes(newNode, types)); - return uninitialized.replace(newNode, "Appended polymorphic"); - } - } - - private static boolean containsClass(Class<?>[] classList, Node node) { - Class<?> nodeClass = node.getClass(); - for (Class<?> toCheck : classList) { - if (nodeClass == toCheck) { - if (node.getCost() == NodeCost.UNINITIALIZED) { - /* - * In case a specialization is excluded by the fallback specialization the - * uninitialized class is used as exclusion class. Because the fallback field in - * the uninitialized specialization is not accessible we use the costs to check - * if the fallback was reached or not. In case the fallback was reached in the - * uninitialized version the cost is MONOMORPHIC, otherwise it is UNINITIALIZED. - */ - continue; - } - return true; - } - } - return false; - } - - private static Node getNext(Node node) { - return ((DSLNode) node).getNext0(); - } - - private static Node getPrevious(Node node) { - Node parent = node.getParent(); - if (parent instanceof DSLNode && getNext(parent) == node) { - return parent; - } else { - return null; - } - } - +package com.oracle.truffle.api.dsl.internal; + +import java.util.*; + +import com.oracle.truffle.api.nodes.*; + +/** Contains utility classes shared across generated DSLNode implementations. */ +public class DSLShare { + + public static boolean isExcluded(Node currentNode, DSLMetadata otherMetadata) { + assert otherMetadata.getExcludedBy().length > 0 : "At least one exclude must be defined for isIncluded."; + Node cur = findRoot(currentNode); + while (cur != null) { + Class<?> curClass = cur.getClass(); + if (curClass == otherMetadata.getSpecializationClass()) { + return true; + } else if (containsClass(otherMetadata.getExcludedBy(), cur)) { + return true; + } + cur = getNext(cur); + } + return false; + } + + private static boolean includes(Node oldNode, DSLNode newNode) { + return containsClass(newNode.getMetadata0().getIncludes(), oldNode); + } + + public static <T extends Node & DSLNode> T rewrite(Node thisNode, T newNode, String message) { + assert newNode != null; + if (getNext(thisNode) != null || getPrevious(thisNode) != null) { + // already polymorphic -> append + return appendPolymorphic(findUninitialized(thisNode), newNode); + } else if (includes(thisNode, newNode)) { + // included -> remains monomorphic + newNode.adoptChildren0(thisNode, null); + return thisNode.replace(newNode, message); + } else { + // goto polymorphic + return null; + } + } + + @SuppressWarnings("unchecked") + public static <T extends Node> T findRoot(T node) { + Node prev = node; + Node cur; + do { + cur = prev; + prev = getPrevious(cur); + } while (prev != null); + return (T) cur; + } + + private static Node findUninitialized(Node node) { + Node next = node; + Node cur; + do { + cur = next; + next = getNext(cur); + } while (next != null); + return cur; + } + + public static <T extends Node & DSLNode> T rewriteUninitialized(Node uninitialized, T newNode) { + Node prev = getPrevious(uninitialized); + if (prev == null) { + newNode.adoptChildren0(uninitialized, null); + return uninitialized.replace(newNode, "Uninitialized monomorphic"); + } else { + return appendPolymorphic(uninitialized, newNode); + } + } + + public static <T extends Node & DSLNode> T rewriteToPolymorphic(Node oldNode, DSLNode uninitialized, T polymorphic, DSLNode currentCopy, DSLNode newNode, String message) { + assert getNext(oldNode) == null; + assert getPrevious(oldNode) == null; + + polymorphic.adoptChildren0(oldNode, (Node) currentCopy); + + if (newNode == null) { + // fallback + currentCopy.adoptChildren0(null, (Node) uninitialized); + } else { + // new specialization + newNode.adoptChildren0(null, (Node) uninitialized); + currentCopy.adoptChildren0(null, (Node) newNode); + } + + oldNode.replace(polymorphic, message); + + assert polymorphic.getNext0() == currentCopy; + assert newNode != null ? currentCopy.getNext0() == newNode : currentCopy.getNext0() == uninitialized; + assert uninitialized.getNext0() == null; + return polymorphic; + } + + private static Class<?>[] mergeTypes(DSLNode node, Class<?>[] types) { + Class<?>[] specializedTypes = node.getMetadata0().getSpecializedTypes(); + if (specializedTypes.length == 0) { + return null; + } else if (types == null) { + return Arrays.copyOf(specializedTypes, specializedTypes.length); + } else { + for (int i = 0; i < specializedTypes.length; i++) { + if (specializedTypes[i] != types[i]) { + types[i] = Object.class; + } + } + return types; + } + } + + private static <T extends Node & DSLNode> T appendPolymorphic(Node uninitialized, T newNode) { + Class<?>[] includes = newNode.getMetadata0().getIncludes(); + Node cur = getPrevious(uninitialized); + Node prev = uninitialized; + int depth = 0; + Class<?>[] types = null; + while (cur != null) { + if (containsClass(includes, cur)) { + cur.replace(prev, "Included in other specialization"); + cur = prev; + } else { + depth++; + types = mergeTypes((DSLNode) cur, types); + } + prev = cur; + cur = getPrevious(cur); + } + assert prev.getCost() == NodeCost.POLYMORPHIC; + + if (depth == 0) { + newNode.adoptChildren0(prev, null); + return prev.replace(newNode, "Polymorphic to monomorphic."); + } else { + newNode.adoptChildren0(null, uninitialized); + ((DSLNode) prev).updateTypes0(mergeTypes(newNode, types)); + return uninitialized.replace(newNode, "Appended polymorphic"); + } + } + + private static boolean containsClass(Class<?>[] classList, Node node) { + Class<?> nodeClass = node.getClass(); + for (Class<?> toCheck : classList) { + if (nodeClass == toCheck) { + if (node.getCost() == NodeCost.UNINITIALIZED) { + /* + * In case a specialization is excluded by the fallback specialization the + * uninitialized class is used as exclusion class. Because the fallback field in + * the uninitialized specialization is not accessible we use the costs to check + * if the fallback was reached or not. In case the fallback was reached in the + * uninitialized version the cost is MONOMORPHIC, otherwise it is UNINITIALIZED. + */ + continue; + } + return true; + } + } + return false; + } + + private static Node getNext(Node node) { + return ((DSLNode) node).getNext0(); + } + + private static Node getPrevious(Node node) { + Node parent = node.getParent(); + if (parent instanceof DSLNode && getNext(parent) == node) { + return parent; + } else { + return null; + } + } + } \ No newline at end of file