diff graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/TemplateMethod.java @ 9217:61ba6fc21ba4

Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
author Christian Humer <christian.humer@gmail.com>
date Mon, 15 Apr 2013 18:50:19 +0200
parents 9dfefdee8f3f
children 6d92fdf1c999
line wrap: on
line diff
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/TemplateMethod.java	Mon Apr 08 18:28:41 2013 +0200
+++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/TemplateMethod.java	Mon Apr 15 18:50:19 2013 +0200
@@ -188,13 +188,17 @@
         return prev;
     }
 
-    public List<TypeData> getSignature(TypeSystemData typeSystem) {
+    public TypeData getReturnSignature() {
+        return getReturnType().getTypeSystemType();
+    }
+
+    public List<TypeData> getSignature() {
         List<TypeData> types = new ArrayList<>();
-        for (ActualParameter parameter : getReturnTypeAndParameters()) {
+        for (ActualParameter parameter : getParameters()) {
             if (!parameter.getSpecification().isSignature()) {
                 continue;
             }
-            TypeData typeData = parameter.getActualTypeData(typeSystem);
+            TypeData typeData = parameter.getTypeSystemType();
             if (typeData != null) {
                 types.add(typeData);
             }
@@ -222,14 +226,27 @@
         return compare;
     }
 
+    public List<ActualParameter> getParametersAfter(ActualParameter genericParameter) {
+        boolean found = false;
+        List<ActualParameter> foundParameters = new ArrayList<>();
+        for (ActualParameter param : getParameters()) {
+            if (param.getLocalName().equals(genericParameter.getLocalName())) {
+                found = true;
+            } else if (found) {
+                foundParameters.add(param);
+            }
+        }
+        return foundParameters;
+    }
+
     public int compareBySignature(TemplateMethod compareMethod) {
         TypeSystemData typeSystem = getTemplate().getTypeSystem();
         if (typeSystem != compareMethod.getTemplate().getTypeSystem()) {
             throw new IllegalStateException("Cannot compare two methods with different type systems.");
         }
 
-        List<TypeData> signature1 = getSignature(typeSystem);
-        List<TypeData> signature2 = compareMethod.getSignature(typeSystem);
+        List<TypeData> signature1 = getSignature();
+        List<TypeData> signature2 = compareMethod.getSignature();
         if (signature1.size() != signature2.size()) {
             return signature2.size() - signature1.size();
         }
@@ -244,6 +261,12 @@
                 return 0;
             }
         }
+        if (result == 0) {
+            TypeData returnSignature1 = getReturnSignature();
+            TypeData returnSignature2 = compareMethod.getReturnSignature();
+
+            result = compareActualParameter(typeSystem, returnSignature1, returnSignature2);
+        }
 
         return result;
     }