# HG changeset patch # User Doug Simon # Date 1412180663 -7200 # Node ID 679612367e1a484d6c644882e4643e49f0e6c7e1 # Parent acee76c5f8a45b2e27d46490217d0b2f5158dd44 converted GeneratedNode to an interface to reduce annotation parsing when creating a NodeClass instance diff -r acee76c5f8a4 -r 679612367e1a graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CheckGraalInvariants.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CheckGraalInvariants.java Wed Oct 01 16:18:19 2014 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CheckGraalInvariants.java Wed Oct 01 18:24:23 2014 +0200 @@ -185,7 +185,7 @@ */ private static void checkClass(Class c, MetaAccessProvider metaAccess) { if (Node.class.isAssignableFrom(c)) { - if (c.getAnnotation(GeneratedNode.class) == null) { + if (!GeneratedNode.class.isAssignableFrom(c)) { if (Modifier.isFinal(c.getModifiers())) { throw new AssertionError(String.format("Node subclass %s must not be final", c.getName())); } diff -r acee76c5f8a4 -r 679612367e1a graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Wed Oct 01 16:18:19 2014 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Wed Oct 01 18:24:23 2014 +0200 @@ -170,8 +170,7 @@ public static final int NOT_ITERABLE = -1; public Node() { - assert USE_GENERATED_NODES == (getClass().getAnnotation(GeneratedNode.class) != null) : getClass() + " is not a generated Node class - forgot @" + NodeInfo.class.getSimpleName() + - " on class declaration?"; + assert USE_GENERATED_NODES == this instanceof GeneratedNode : getClass() + " is not a generated Node class - forgot @" + NodeInfo.class.getSimpleName() + " on class declaration?"; init(); } diff -r acee76c5f8a4 -r 679612367e1a graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java Wed Oct 01 16:18:19 2014 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java Wed Oct 01 18:24:23 2014 +0200 @@ -88,9 +88,9 @@ try (TimerCloseable t = Init.start()) { value = (NodeClass) allClasses.get(key); if (value == null) { - GeneratedNode gen = getAnnotationTimed(c, GeneratedNode.class); - if (gen != null) { - Class originalNodeClass = (Class) gen.value(); + Class superclass = c.getSuperclass(); + if (GeneratedNode.class.isAssignableFrom(c)) { + Class originalNodeClass = (Class) superclass; value = (NodeClass) allClasses.get(originalNodeClass); assert value != null; if (value.genClass == null) { @@ -99,7 +99,6 @@ assert value.genClass == c; } } else { - Class superclass = c.getSuperclass(); NodeClass superNodeClass = null; if (superclass != NODE_CLASS) { // Ensure NodeClass for superclass exists @@ -261,7 +260,7 @@ * *
      *     if (node.getNodeClass().is(BeginNode.class)) { ... }
-     * 
+     *
      *     // Due to generated Node classes, the test below
      *     // is *not* the same as the test above:
      *     if (node.getClass() == BeginNode.class) { ... }
@@ -270,7 +269,7 @@
      * @param nodeClass a {@linkplain GeneratedNode non-generated} {@link Node} class
      */
     public boolean is(Class nodeClass) {
-        assert nodeClass.getAnnotation(GeneratedNode.class) == null : "cannot test NodeClas against generated " + nodeClass;
+        assert !GeneratedNode.class.isAssignableFrom(nodeClass) : "cannot test NodeClass against generated " + nodeClass;
         return nodeClass == getClazz();
     }
 
diff -r acee76c5f8a4 -r 679612367e1a graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeGenerator.java
--- a/graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeGenerator.java	Wed Oct 01 16:18:19 2014 +0200
+++ b/graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeGenerator.java	Wed Oct 01 18:24:23 2014 +0200
@@ -327,9 +327,7 @@
 
         if (!constructorsOnly) {
             DeclaredType generatedNode = (DeclaredType) getType(GeneratedNode.class);
-            CodeAnnotationMirror generatedNodeMirror = new CodeAnnotationMirror(generatedNode);
-            generatedNodeMirror.setElementValue(generatedNodeMirror.findExecutableElement("value"), new CodeAnnotationValue(node.asType()));
-            genClass.getAnnotationMirrors().add(generatedNodeMirror);
+            genClass.getImplements().add(generatedNode);
 
             scanFields(node);
 
diff -r acee76c5f8a4 -r 679612367e1a graal/com.oracle.graal.nodeinfo/src/com/oracle/graal/nodeinfo/GeneratedNode.java
--- a/graal/com.oracle.graal.nodeinfo/src/com/oracle/graal/nodeinfo/GeneratedNode.java	Wed Oct 01 16:18:19 2014 +0200
+++ b/graal/com.oracle.graal.nodeinfo/src/com/oracle/graal/nodeinfo/GeneratedNode.java	Wed Oct 01 18:24:23 2014 +0200
@@ -22,17 +22,27 @@
  */
 package com.oracle.graal.nodeinfo;
 
-import java.lang.annotation.*;
-
 /**
- * Denotes a Node subclass generated on the basis of a {@link NodeInfo} annotation on a Node type.
+ * Marker for a Node class generated on the basis of a {@link NodeInfo} annotation on its super
+ * class.
+ *
+ * Testing whether a node class is generated:
+ *
+ * 
+ * Class c = ...;
+ * if (GeneratedNode.class.isAssignableFrom(c)) { ... }
+ * 
+ * + * Since a generated node class always subclasses the node from which it is generated: + * + *
+ * if (GeneratedNode.class.isAssignableFrom(c)) {
+ *     Class<?> original = c.getSuperclass();
+ * }
+ * 
+ * + * Note: This used to be an annotation but was converted to an interface to avoid annotation parsing + * when creating a NodeClass instance. */ -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.TYPE}) -public @interface GeneratedNode { - - /** - * The Node class from which the annotated type was generated. - */ - Class value(); +public interface GeneratedNode { }