diff graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java @ 7794:b891ec348f8a

Made the usage of generic types more flexible for short circuits and generic specializations.
author Christian Humer <christian.humer@gmail.com>
date Fri, 15 Feb 2013 19:32:58 +0100
parents f81be78f15a5
children c6c3515bea8e f4be7a2e783c
line wrap: on
line diff
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java	Fri Feb 15 16:48:22 2013 +0100
+++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java	Fri Feb 15 19:32:58 2013 +0100
@@ -435,9 +435,9 @@
                 // TODO redirect errors from resolve.
                 context.getLog().error(errorElement, "Node type '%s' is invalid.", Utils.getQualifiedName(nodeType));
                 return null;
-            } else if (fieldNodeData.findGenericExecutableType(context) == null) {
+            } else if (fieldNodeData.findGenericExecutableTypes(context).isEmpty()) {
                 // TODO better error handling for (no or multiple?)
-                context.getLog().error(errorElement, "No or multiple executable generic types found for node '%s'.", Utils.getQualifiedName(nodeType));
+                context.getLog().error(errorElement, "No executable generic types found for node '%s'.", Utils.getQualifiedName(nodeType));
                 return null;
             }
         }
@@ -612,13 +612,21 @@
         return valid;
     }
 
-    private static boolean isGenericShortCutMethod(NodeData node, TemplateMethod method) {
+    private boolean isGenericShortCutMethod(NodeData node, TemplateMethod method) {
         for (NodeFieldData field : node.getFields()) {
             ActualParameter parameter = method.findParameter(field.getName());
             if (parameter == null) {
                 continue;
             }
-            if (!Utils.typeEquals(node.getTypeSystem().getGenericType(), parameter.getActualType())) {
+            ExecutableTypeData found = null;
+            List<ExecutableTypeData> executableElements = field.getNodeData().findGenericExecutableTypes(context);
+            for (ExecutableTypeData executable : executableElements) {
+                if (executable.getType().equalsType(parameter.getActualTypeData(node.getTypeSystem()))) {
+                    found = executable;
+                    break;
+                }
+            }
+            if (found == null) {
                 return false;
             }
         }