changeset 17308:679612367e1a

converted GeneratedNode to an interface to reduce annotation parsing when creating a NodeClass instance
author Doug Simon <doug.simon@oracle.com>
date Wed, 01 Oct 2014 18:24:23 +0200
parents acee76c5f8a4
children 845e881ce054
files graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CheckGraalInvariants.java graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeGenerator.java graal/com.oracle.graal.nodeinfo/src/com/oracle/graal/nodeinfo/GeneratedNode.java
diffstat 5 files changed, 29 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- 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()));
                 }
--- 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();
     }
 
--- 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<? extends Node> originalNodeClass = (Class<? extends Node>) gen.value();
+                        Class<?> superclass = c.getSuperclass();
+                        if (GeneratedNode.class.isAssignableFrom(c)) {
+                            Class<? extends Node> originalNodeClass = (Class<? extends Node>) 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 @@
      *
      * <pre>
      *     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<? extends Node> 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();
     }
 
--- 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);
 
--- 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:
+ *
+ * <pre>
+ * Class<? extends Node> c = ...;
+ * if (GeneratedNode.class.isAssignableFrom(c)) { ... }
+ * </pre>
+ *
+ * Since a generated node class always subclasses the node from which it is generated:
+ *
+ * <pre>
+ * if (GeneratedNode.class.isAssignableFrom(c)) {
+ *     Class&lt;?&gt; original = c.getSuperclass();
+ * }
+ * </pre>
+ *
+ * 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 {
 }