diff graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java @ 8237:6b74ffe38183

Implemented support for executing nodes in @Children fields.
author Christian Humer <christian.humer@gmail.com>
date Fri, 01 Mar 2013 17:03:57 +0100
parents 3c68170fc9b0
children 33e08aca06ff
line wrap: on
line diff
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java	Mon Feb 25 20:54:33 2013 +0100
+++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java	Fri Mar 01 17:03:57 2013 +0100
@@ -208,6 +208,11 @@
             specialization.setNode(nodeData);
         }
 
+        // verify specialization parameter length
+        if (!verifySpecializationParameters(specializations)) {
+            return null;
+        }
+
         // verify order is not ambiguous
         if (!verifySpecializationOrder(typeSystem, specializations)) {
             return null;
@@ -247,6 +252,30 @@
         return nodeData;
     }
 
+    private boolean verifySpecializationParameters(List<SpecializationData> specializations) {
+        boolean valid = true;
+        int args = -1;
+        for (SpecializationData specializationData : specializations) {
+            int specializationArgs = 0;
+            for (ActualParameter param : specializationData.getParameters()) {
+                if (!param.getSpecification().isOptional()) {
+                    specializationArgs++;
+                }
+            }
+            if (args != -1 && args != specializationArgs) {
+                valid = false;
+                break;
+            }
+            args = specializationArgs;
+        }
+        if (!valid) {
+            for (SpecializationData specialization : specializations) {
+                context.getLog().error(specialization.getMethod(), specialization.getMarkerAnnotation(), "All specializations must have the same number of arguments.");
+            }
+        }
+        return valid;
+    }
+
     private boolean verifyMissingAbstractMethods(NodeData nodeData, List<Element> elements) {
         if (nodeData.needsFactory()) {
             // missing abstract methods only needs to be implemented
@@ -424,10 +453,10 @@
             nodeType = getComponentType(var.asType());
             kind = FieldKind.CHILDREN;
         } else {
-            mirror = null;
+            execution = ExecutionKind.IGNORE;
             nodeType = null;
-            kind = FieldKind.FIELD;
-            execution = ExecutionKind.IGNORE;
+            mirror = null;
+            kind = null;
         }
 
         NodeData fieldNodeData = null;
@@ -444,13 +473,12 @@
                 context.getLog().error(errorElement, "No executable generic types found for node '%s'.", Utils.getQualifiedName(nodeType));
                 return null;
             }
+
+            // TODO correct handling of access elements
+            if (var.getModifiers().contains(Modifier.PRIVATE) && Utils.typeEquals(var.getEnclosingElement().asType(), parentNodeData.getTemplateType().asType())) {
+                execution = ExecutionKind.IGNORE;
+            }
         }
-
-        // TODO correct handling of access elements
-        if (var.getModifiers().contains(Modifier.PRIVATE) && Utils.typeEquals(var.getEnclosingElement().asType(), parentNodeData.getTemplateType().asType())) {
-            execution = ExecutionKind.IGNORE;
-        }
-
         return new NodeFieldData(fieldNodeData, var, findAccessElement(var), mirror, kind, execution);
     }
 
@@ -617,9 +645,9 @@
     }
 
     private boolean isGenericShortCutMethod(NodeData node, TemplateMethod method) {
-        for (NodeFieldData field : node.getFields()) {
-            ActualParameter parameter = method.findParameter(field.getName());
-            if (parameter == null) {
+        for (ActualParameter parameter : method.getParameters()) {
+            NodeFieldData field = node.findField(parameter.getSpecification().getName());
+            if (field == null) {
                 continue;
             }
             ExecutableTypeData found = null;