changeset 16817:0370880ac9ce

Truffle-DSL: better caching for type checks.
author Christian Humer <christian.humer@gmail.com>
date Wed, 13 Aug 2014 18:06:26 +0200
parents 8d374faacb7e
children 224a89858453
files graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/AbstractClassElementFactory.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/TypeSystemCodeGenerator.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/ElementUtils.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/ParameterSpec.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/TypeSystemData.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/CreateCastParser.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/ExecutableTypeMethodParser.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/GenericParser.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/GuardParser.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/ImplicitCastParser.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeMethodParser.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeCastParser.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeCheckParser.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeSystemParser.java
diffstat 15 files changed, 83 insertions(+), 61 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/AbstractClassElementFactory.java	Wed Aug 13 18:06:18 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/AbstractClassElementFactory.java	Wed Aug 13 18:06:26 2014 +0200
@@ -128,7 +128,6 @@
         }
 
         clazz.addAnnotationMirror(generatedByAnnotation);
-
         return clazz;
     }
 }
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/TypeSystemCodeGenerator.java	Wed Aug 13 18:06:18 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/TypeSystemCodeGenerator.java	Wed Aug 13 18:06:26 2014 +0200
@@ -87,20 +87,21 @@
             clazz.add(singleton);
 
             for (TypeData type : typeSystem.getTypes()) {
-                if (!type.isGeneric()) {
-                    clazz.addOptional(createIsTypeMethod(type));
-                    clazz.addOptional(createAsTypeMethod(type));
+                if (type.isGeneric() || type.isVoid()) {
+                    continue;
+                }
+                clazz.addOptional(createIsTypeMethod(type));
+                clazz.addOptional(createAsTypeMethod(type));
 
-                    for (TypeData sourceType : collectExpectSourceTypes(type)) {
-                        clazz.addOptional(createExpectTypeMethod(type, sourceType));
-                    }
+                for (TypeData sourceType : collectExpectSourceTypes(type)) {
+                    clazz.addOptional(createExpectTypeMethod(type, sourceType));
+                }
 
-                    clazz.addOptional(createAsImplicitTypeMethod(type, true));
-                    clazz.addOptional(createAsImplicitTypeMethod(type, false));
-                    clazz.addOptional(createIsImplicitTypeMethod(type, true));
-                    clazz.addOptional(createIsImplicitTypeMethod(type, false));
-                    clazz.addOptional(createGetTypeIndex(type));
-                }
+                clazz.addOptional(createAsImplicitTypeMethod(type, true));
+                clazz.addOptional(createAsImplicitTypeMethod(type, false));
+                clazz.addOptional(createIsImplicitTypeMethod(type, true));
+                clazz.addOptional(createIsImplicitTypeMethod(type, false));
+                clazz.addOptional(createGetTypeIndex(type));
             }
 
             return clazz;
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/ElementUtils.java	Wed Aug 13 18:06:18 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/ElementUtils.java	Wed Aug 13 18:06:26 2014 +0200
@@ -914,7 +914,11 @@
     }
 
     public static String getUniqueIdentifier(TypeMirror typeMirror) {
-        return fixECJBinaryNameIssue(typeMirror.toString());
+        if (typeMirror.getKind() == TypeKind.ARRAY) {
+            return getUniqueIdentifier(((ArrayType) typeMirror).getComponentType()) + "[]";
+        } else {
+            return getQualifiedName(typeMirror);
+        }
     }
 
     public static int compareByTypeHierarchy(TypeMirror t1, TypeMirror t2) {
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/ParameterSpec.java	Wed Aug 13 18:06:18 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/ParameterSpec.java	Wed Aug 13 18:06:26 2014 +0200
@@ -34,6 +34,7 @@
 
     private final String name;
     private final List<TypeMirror> allowedTypes;
+    private final Set<String> allowedTypesIdentifier;
 
     /** Type is bound to local final variable. */
     private boolean local;
@@ -43,22 +44,24 @@
     private NodeExecutionData execution;
     private TypeDef typeDefinition;
 
-    public ParameterSpec(String name, List<TypeMirror> allowedTypes) {
+    public ParameterSpec(String name, List<TypeMirror> allowedTypes, Set<String> typeIdentifiers) {
         this.name = name;
         this.allowedTypes = allowedTypes;
+        this.allowedTypesIdentifier = typeIdentifiers;
     }
 
     public ParameterSpec(String name, TypeMirror type) {
-        this(name, Arrays.asList(type));
+        this(name, Arrays.asList(type), new HashSet<>(Arrays.asList(ElementUtils.getUniqueIdentifier(type))));
     }
 
-    public ParameterSpec(ParameterSpec o, List<TypeMirror> allowedTypes) {
+    public ParameterSpec(ParameterSpec o, List<TypeMirror> allowedTypes, Set<String> typeIdentifiers) {
         this.name = o.name;
         this.local = o.local;
         this.typeDefinition = o.typeDefinition;
         this.execution = o.execution;
         this.signature = o.signature;
         this.allowedTypes = allowedTypes;
+        this.allowedTypesIdentifier = typeIdentifiers;
     }
 
     public NodeExecutionData getExecution() {
@@ -103,12 +106,7 @@
     }
 
     public boolean matches(TypeMirror actualType) {
-        for (TypeMirror mirror : allowedTypes) {
-            if (ElementUtils.typeEquals(actualType, mirror)) {
-                return true;
-            }
-        }
-        return false;
+        return allowedTypesIdentifier.contains(ElementUtils.getUniqueIdentifier(actualType));
     }
 
     @Override
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/TypeSystemData.java	Wed Aug 13 18:06:18 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/TypeSystemData.java	Wed Aug 13 18:06:26 2014 +0200
@@ -60,6 +60,7 @@
                 primitiveTypeMirrors.add(typeData.getPrimitiveType());
                 boxedTypeMirrors.add(typeData.getBoxedType());
                 cachedTypes.put(ElementUtils.getUniqueIdentifier(typeData.getPrimitiveType()), typeData);
+                cachedTypes.put(ElementUtils.getUniqueIdentifier(typeData.getBoxedType()), typeData);
             }
         }
     }
@@ -118,6 +119,10 @@
         return primitiveTypeMirrors;
     }
 
+    public Set<String> getTypeIdentifiers() {
+        return cachedTypes.keySet();
+    }
+
     public List<TypeData> getTypes() {
         return types;
     }
@@ -127,7 +132,7 @@
     }
 
     public TypeData getGenericTypeData() {
-        TypeData result = types.get(types.size() - 1);
+        TypeData result = types.get(types.size() - 2);
         assert result.getBoxedType() == genericType;
         return result;
     }
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/CreateCastParser.java	Wed Aug 13 18:06:18 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/CreateCastParser.java	Wed Aug 13 18:06:26 2014 +0200
@@ -99,7 +99,7 @@
     private static class InheritsParameterSpec extends ParameterSpec {
 
         public InheritsParameterSpec(String name, TypeMirror... allowedTypes) {
-            super(name, Arrays.asList(allowedTypes));
+            super(name, Arrays.asList(allowedTypes), null);
         }
 
         @Override
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/ExecutableTypeMethodParser.java	Wed Aug 13 18:06:18 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/ExecutableTypeMethodParser.java	Wed Aug 13 18:06:26 2014 +0200
@@ -47,20 +47,31 @@
         spec.getRequired().clear();
 
         List<TypeMirror> allowedTypes = getNode().getTypeSystem().getPrimitiveTypeMirrors();
+        Set<String> allowedIdentifiers = getNode().getTypeSystem().getTypeIdentifiers();
         for (ParameterSpec originalSpec : requiredSpecs) {
-            spec.addRequired(new ParameterSpec(originalSpec, allowedTypes));
+            spec.addRequired(new ParameterSpec(originalSpec, allowedTypes, allowedIdentifiers));
         }
         spec.setIgnoreAdditionalSpecifications(true);
         spec.setIgnoreAdditionalParameters(true);
         spec.setVariableRequiredParameters(true);
         // varargs
-        ParameterSpec otherParameters = new ParameterSpec("other", allowedTypes);
+        ParameterSpec otherParameters = new ParameterSpec("other", allowedTypes, allowedIdentifiers);
         otherParameters.setSignature(true);
         spec.addRequired(otherParameters);
         return spec;
     }
 
     @Override
+    protected List<TypeMirror> nodeTypeMirrors(NodeData nodeData) {
+        return getNode().getTypeSystem().getPrimitiveTypeMirrors();
+    }
+
+    @Override
+    protected Set<String> nodeTypeIdentifiers(NodeData nodeData) {
+        return getNode().getTypeSystem().getTypeIdentifiers();
+    }
+
+    @Override
     public final boolean isParsable(ExecutableElement method) {
         if (method.getModifiers().contains(Modifier.STATIC)) {
             return false;
@@ -71,13 +82,6 @@
     }
 
     @Override
-    protected List<TypeMirror> nodeTypeMirrors(NodeData nodeData) {
-        List<TypeMirror> types = new ArrayList<>(getNode().getTypeSystem().getPrimitiveTypeMirrors());
-        types.add(getNode().getTypeSystem().getVoidType().getPrimitiveType());
-        return types;
-    }
-
-    @Override
     public ExecutableTypeData create(TemplateMethod method, boolean invalid) {
         TypeData resolvedType = method.getReturnType().getTypeSystemType();
         return new ExecutableTypeData(method, method.getMethod(), getNode().getTypeSystem(), resolvedType);
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/GenericParser.java	Wed Aug 13 18:06:18 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/GenericParser.java	Wed Aug 13 18:06:26 2014 +0200
@@ -30,6 +30,7 @@
 
 import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.dsl.processor.*;
+import com.oracle.truffle.dsl.processor.java.*;
 import com.oracle.truffle.dsl.processor.model.*;
 import com.oracle.truffle.dsl.processor.model.SpecializationData.SpecializationKind;
 
@@ -48,10 +49,13 @@
     protected ParameterSpec createValueParameterSpec(NodeExecutionData execution) {
         List<ExecutableTypeData> execTypes = execution.getChild().findGenericExecutableTypes(getContext());
         List<TypeMirror> types = new ArrayList<>();
+        Set<String> typeIds = new HashSet<>();
         for (ExecutableTypeData type : execTypes) {
-            types.add(type.getType().getPrimitiveType());
+            TypeMirror typeMirror = type.getType().getPrimitiveType();
+            types.add(typeMirror);
+            typeIds.add(ElementUtils.getUniqueIdentifier(typeMirror));
         }
-        ParameterSpec spec = new ParameterSpec(execution.getName(), types);
+        ParameterSpec spec = new ParameterSpec(execution.getName(), types, typeIds);
         spec.setExecution(execution);
         return spec;
     }
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/GuardParser.java	Wed Aug 13 18:06:18 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/GuardParser.java	Wed Aug 13 18:06:26 2014 +0200
@@ -58,7 +58,13 @@
         if (compatibleSource != null) {
             spec.getRequired().clear();
             for (Parameter parameter : compatibleSource.getRequiredParameters()) {
-                spec.addRequired(new ParameterSpec(parameter.getSpecification(), ElementUtils.getAssignableTypes(getContext(), parameter.getType())));
+                List<TypeMirror> typeMirrors = ElementUtils.getAssignableTypes(getContext(), parameter.getType());
+                Set<String> typeIds = new HashSet<>();
+                for (TypeMirror typeMirror : typeMirrors) {
+                    typeIds.add(ElementUtils.getUniqueIdentifier(typeMirror));
+                }
+
+                spec.addRequired(new ParameterSpec(parameter.getSpecification(), typeMirrors, typeIds));
             }
         }
         return spec;
@@ -73,6 +79,11 @@
     }
 
     @Override
+    protected Set<String> nodeTypeIdentifiers(NodeData nodeData) {
+        return nodeData.getTypeSystem().getTypeIdentifiers();
+    }
+
+    @Override
     protected ParameterSpec createReturnParameterSpec() {
         return new ParameterSpec("returnType", getContext().getType(boolean.class));
     }
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/ImplicitCastParser.java	Wed Aug 13 18:06:18 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/ImplicitCastParser.java	Wed Aug 13 18:06:26 2014 +0200
@@ -45,12 +45,10 @@
 
     @Override
     public MethodSpec createSpecification(ExecutableElement method, AnnotationMirror mirror) {
-        List<TypeMirror> types = new ArrayList<>();
-        for (TypeData typeData : getTypeSystem().getTypes()) {
-            types.add(typeData.getPrimitiveType());
-        }
-        MethodSpec spec = new MethodSpec(new ParameterSpec("target", types));
-        spec.addRequired(new ParameterSpec("source", types));
+        List<TypeMirror> types = getTypeSystem().getPrimitiveTypeMirrors();
+        Set<String> identifiers = getTypeSystem().getTypeIdentifiers();
+        MethodSpec spec = new MethodSpec(new ParameterSpec("target", types, identifiers));
+        spec.addRequired(new ParameterSpec("source", types, identifiers));
         return spec;
     }
 
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeMethodParser.java	Wed Aug 13 18:06:18 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeMethodParser.java	Wed Aug 13 18:06:26 2014 +0200
@@ -42,25 +42,21 @@
     }
 
     protected ParameterSpec createValueParameterSpec(NodeExecutionData execution) {
-        ParameterSpec spec = new ParameterSpec(execution.getName(), nodeTypeMirrors(execution.getChild().getNodeData()));
+        ParameterSpec spec = new ParameterSpec(execution.getName(), nodeTypeMirrors(execution.getChild().getNodeData()), nodeTypeIdentifiers(execution.getChild().getNodeData()));
         spec.setExecution(execution);
         return spec;
     }
 
     protected List<TypeMirror> nodeTypeMirrors(NodeData nodeData) {
-        Set<TypeMirror> typeMirrors = new LinkedHashSet<>();
+        return nodeData.getTypeSystem().getPrimitiveTypeMirrors();
+    }
 
-        for (ExecutableTypeData typeData : nodeData.getExecutableTypes()) {
-            typeMirrors.add(typeData.getType().getPrimitiveType());
-        }
-
-        typeMirrors.add(nodeData.getTypeSystem().getGenericType());
-
-        return new ArrayList<>(typeMirrors);
+    protected Set<String> nodeTypeIdentifiers(NodeData nodeData) {
+        return nodeData.getTypeSystem().getTypeIdentifiers();
     }
 
     protected ParameterSpec createReturnParameterSpec() {
-        ParameterSpec returnValue = new ParameterSpec("returnValue", nodeTypeMirrors(getNode()));
+        ParameterSpec returnValue = new ParameterSpec("returnValue", nodeTypeMirrors(getNode()), nodeTypeIdentifiers(getNode()));
         returnValue.setExecution(getNode().getThisExecution());
         return returnValue;
     }
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java	Wed Aug 13 18:06:18 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java	Wed Aug 13 18:06:26 2014 +0200
@@ -146,6 +146,7 @@
         }
 
         initializeChildren(node);
+        node.setExecutableTypes(groupExecutableTypes(new ExecutableTypeMethodParser(context, node).parse(elements)));
 
         node.getSpecializations().addAll(new SpecializationMethodParser(context, node).parse(elements));
         node.getSpecializations().addAll(new GenericParser(context, node).parse(elements));
@@ -209,7 +210,6 @@
         List<NodeExecutionData> executions = parseExecutions(children, elements);
 
         NodeData nodeData = new NodeData(context, templateType, shortName, typeSystem, children, executions, fields, assumptionsList);
-        nodeData.setExecutableTypes(groupExecutableTypes(new ExecutableTypeMethodParser(context, nodeData).parse(elements)));
 
         parsedNodes.put(ElementUtils.getQualifiedName(templateType), nodeData);
 
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeCastParser.java	Wed Aug 13 18:06:18 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeCastParser.java	Wed Aug 13 18:06:26 2014 +0200
@@ -44,7 +44,7 @@
             return null;
         }
         MethodSpec spec = new MethodSpec(new ParameterSpec("returnType", targetType.getPrimitiveType()));
-        spec.addRequired(new ParameterSpec("value", getTypeSystem().getPrimitiveTypeMirrors()));
+        spec.addRequired(new ParameterSpec("value", getTypeSystem().getPrimitiveTypeMirrors(), getTypeSystem().getTypeIdentifiers()));
         return spec;
     }
 
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeCheckParser.java	Wed Aug 13 18:06:18 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeCheckParser.java	Wed Aug 13 18:06:26 2014 +0200
@@ -43,7 +43,7 @@
             return null;
         }
         MethodSpec spec = new MethodSpec(new ParameterSpec("returnType", getContext().getType(boolean.class)));
-        spec.addRequired(new ParameterSpec("value", getTypeSystem().getPrimitiveTypeMirrors()));
+        spec.addRequired(new ParameterSpec("value", getTypeSystem().getPrimitiveTypeMirrors(), getTypeSystem().getTypeIdentifiers()));
         return spec;
     }
 
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeSystemParser.java	Wed Aug 13 18:06:18 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeSystemParser.java	Wed Aug 13 18:06:26 2014 +0200
@@ -67,14 +67,17 @@
             return typeSystem;
         }
 
-        typeSystem.setTypes(parseTypes(typeSystem));
+        List<TypeData> types = parseTypes(typeSystem);
+
+        TypeMirror genericType = context.getType(Object.class);
+        TypeData voidType = new TypeData(typeSystem, types.size(), null, context.getType(void.class), context.getType(Void.class));
+        types.add(voidType);
+
+        typeSystem.setTypes(types);
         if (typeSystem.hasErrors()) {
             return typeSystem;
         }
 
-        TypeMirror genericType = context.getType(Object.class);
-        TypeData voidType = new TypeData(typeSystem, typeSystem.getTypes().size(), null, context.getType(void.class), context.getType(Void.class));
-
         typeSystem.setGenericType(genericType);
         typeSystem.setVoidType(voidType);
 
@@ -198,7 +201,6 @@
         verifyTypeOrder(types);
 
         types.add(new TypeData(typeSystem, index, annotationValue, objectType, objectType));
-
         return types;
     }