changeset 8888:89ea104f29ac

Merge
author Gilles Duboscq <duboscq@ssw.jku.at>
date Sun, 07 Apr 2013 19:37:38 +0200
parents 34d13df4165b (current diff) 31f1390766d9 (diff)
children c669e8e621a1
files
diffstat 7 files changed, 57 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/Utils.java	Sun Apr 07 17:04:59 2013 +0200
+++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/Utils.java	Sun Apr 07 19:37:38 2013 +0200
@@ -799,4 +799,8 @@
         return true;
     }
 
+    public static boolean isObject(TypeMirror actualType) {
+        return getQualifiedName(actualType).equals("java.lang.Object");
+    }
+
 }
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java	Sun Apr 07 17:04:59 2013 +0200
+++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java	Sun Apr 07 19:37:38 2013 +0200
@@ -117,7 +117,7 @@
         }
     }
 
-    private CodeTree createTemplateMethodCall(CodeTreeBuilder parent, TemplateMethod sourceMethod, TemplateMethod targetMethod, String unexpectedValueName) {
+    private static CodeTree createTemplateMethodCall(CodeTreeBuilder parent, TemplateMethod sourceMethod, TemplateMethod targetMethod, String unexpectedValueName) {
         CodeTreeBuilder builder = parent.create();
 
         boolean castedValues = sourceMethod != targetMethod;
@@ -153,6 +153,7 @@
                         break;
                     }
                 }
+                ActualParameter sourceParameter = sourceMethod.findParameter(parameter.getLocalName());
                 assert parameter != null;
 
                 if (castedValues) {
@@ -160,12 +161,10 @@
                     if (field == null) {
                         builder.string(valueName(parameter));
                     } else {
-                        NodeData fieldNode = field.getNodeData();
-                        ExecutableTypeData execType = fieldNode.findExecutableType(parameter.getActualTypeData(node.getTypeSystem()));
-                        if (execType.hasUnexpectedValue(getContext())) {
+                        if (Utils.typeEquals(sourceParameter.getActualType(), parameter.getActualType())) {
+                            builder.string(valueName(parameter));
+                        } else {
                             builder.string(castValueName(parameter));
-                        } else {
-                            builder.string(valueName(parameter));
                         }
                     }
                 } else {
@@ -326,7 +325,7 @@
         return builder.getRoot();
     }
 
-    private CodeTree createExplicitGuards(CodeTreeBuilder parent, String conditionPrefix, SpecializationData valueSpecialization, SpecializationData guardedSpecialization) {
+    private static CodeTree createExplicitGuards(CodeTreeBuilder parent, String conditionPrefix, SpecializationData valueSpecialization, SpecializationData guardedSpecialization) {
         CodeTreeBuilder builder = new CodeTreeBuilder(parent);
         String andOperator = conditionPrefix != null ? conditionPrefix + " && " : "";
         if (guardedSpecialization.getGuards().size() > 0) {
@@ -1476,7 +1475,12 @@
             builder.end(); // call replace
             builder.end(); // statement
 
-            String generatedMethodName = generatedGenericMethodName(specialization.findNextSpecialization());
+            String generatedMethodName;
+            if (specialization.getNode().getGenericSpecialization().isUseSpecializationsForGeneric()) {
+                generatedMethodName = generatedGenericMethodName(null);
+            } else {
+                generatedMethodName = generatedGenericMethodName(specialization.findNextSpecialization());
+            }
             ExecutableElement generatedGeneric = clazz.getEnclosingClass().getMethod(generatedMethodName);
 
             CodeTreeBuilder genericExecute = CodeTreeBuilder.createBuilder();
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeMethodParser.java	Sun Apr 07 17:04:59 2013 +0200
+++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeMethodParser.java	Sun Apr 07 19:37:38 2013 +0200
@@ -61,7 +61,7 @@
     }
 
     protected ParameterSpec createReturnParameterSpec() {
-        return createValueParameterSpec("operation", getNode());
+        return createValueParameterSpec("returnValue", getNode());
     }
 
     @Override
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java	Sun Apr 07 17:04:59 2013 +0200
+++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java	Sun Apr 07 19:37:38 2013 +0200
@@ -108,8 +108,7 @@
         }
 
         NodeData rootNode = parseNode(rootType);
-        boolean hasErrors = rootNode != null ? rootNode.hasErrors() : false;
-        if ((rootNode == null || hasErrors) && children.size() > 0) {
+        if (rootNode == null && children.size() > 0) {
             rootNode = new NodeData(rootType, rootType.getSimpleName().toString());
         }
 
@@ -328,6 +327,23 @@
         }
 
         if (genericSpecialization != null) {
+            if (genericSpecialization.isUseSpecializationsForGeneric()) {
+                for (ActualParameter parameter : genericSpecialization.getReturnTypeAndParameters()) {
+                    if (Utils.isObject(parameter.getActualType())) {
+                        continue;
+                    }
+                    Set<String> types = new HashSet<>();
+                    for (SpecializationData specialization : specializations) {
+                        ActualParameter actualParameter = specialization.findParameter(parameter.getLocalName());
+                        if (actualParameter != null) {
+                            types.add(Utils.getQualifiedName(actualParameter.getActualType()));
+                        }
+                    }
+                    if (types.size() > 1) {
+                        genericSpecialization.replaceParameter(parameter.getLocalName(), new ActualParameter(parameter, node.getTypeSystem().getGenericType()));
+                    }
+                }
+            }
             TemplateMethod uninializedMethod = new TemplateMethod("Uninitialized", node, genericSpecialization.getSpecification(), null, null, genericSpecialization.getReturnType(),
                             genericSpecialization.getParameters());
             // should not use messages from generic specialization
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/SpecializationData.java	Sun Apr 07 17:04:59 2013 +0200
+++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/SpecializationData.java	Sun Apr 07 19:37:38 2013 +0200
@@ -194,4 +194,5 @@
     public String toString() {
         return String.format("%s [id = %s, method = %s, guards = %s]", getClass().getSimpleName(), getId(), getMethod(), getGuards());
     }
+
 }
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/ActualParameter.java	Sun Apr 07 17:04:59 2013 +0200
+++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/ActualParameter.java	Sun Apr 07 19:37:38 2013 +0200
@@ -49,6 +49,10 @@
         this.localName = valueName;
     }
 
+    public ActualParameter(ActualParameter parameter, TypeMirror otherType) {
+        this(parameter.specification, otherType, parameter.index, parameter.implicit);
+    }
+
     public boolean isImplicit() {
         return implicit;
     }
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/TemplateMethod.java	Sun Apr 07 17:04:59 2013 +0200
+++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/TemplateMethod.java	Sun Apr 07 19:37:38 2013 +0200
@@ -40,7 +40,7 @@
     private final MethodSpec specification;
     private final ExecutableElement method;
     private final AnnotationMirror markerAnnotation;
-    private final ActualParameter returnType;
+    private ActualParameter returnType;
     private List<ActualParameter> parameters;
 
     public TemplateMethod(String id, Template template, MethodSpec specification, ExecutableElement method, AnnotationMirror markerAnnotation, ActualParameter returnType,
@@ -104,6 +104,21 @@
         return returnType;
     }
 
+    public void replaceParameter(String localName, ActualParameter newParameter) {
+        if (returnType.getLocalName().equals(localName)) {
+            returnType = newParameter;
+            returnType.setMethod(this);
+        }
+
+        for (ListIterator<ActualParameter> iterator = parameters.listIterator(); iterator.hasNext();) {
+            ActualParameter parameter = iterator.next();
+            if (parameter.getLocalName().equals(localName)) {
+                iterator.set(newParameter);
+                newParameter.setMethod(this);
+            }
+        }
+    }
+
     public List<ActualParameter> getRequiredParameters() {
         List<ActualParameter> requiredParameters = new ArrayList<>();
         for (ActualParameter parameter : getParameters()) {
@@ -119,7 +134,7 @@
     }
 
     public ActualParameter findParameter(String valueName) {
-        for (ActualParameter param : getParameters()) {
+        for (ActualParameter param : getReturnTypeAndParameters()) {
             if (param.getLocalName().equals(valueName)) {
                 return param;
             }