# HG changeset patch # User Christian Humer # Date 1407945986 -7200 # Node ID 0370880ac9ce6bd9b4529c0b561a63b6441fc0d7 # Parent 8d374faacb7eadc9e85cd7da00db0ba740f6d2d9 Truffle-DSL: better caching for type checks. diff -r 8d374faacb7e -r 0370880ac9ce graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/AbstractClassElementFactory.java --- 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; } } diff -r 8d374faacb7e -r 0370880ac9ce graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/TypeSystemCodeGenerator.java --- 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; diff -r 8d374faacb7e -r 0370880ac9ce graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/ElementUtils.java --- 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) { diff -r 8d374faacb7e -r 0370880ac9ce graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/ParameterSpec.java --- 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 allowedTypes; + private final Set 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 allowedTypes) { + public ParameterSpec(String name, List allowedTypes, Set 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 allowedTypes) { + public ParameterSpec(ParameterSpec o, List allowedTypes, Set 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 diff -r 8d374faacb7e -r 0370880ac9ce graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/TypeSystemData.java --- 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 getTypeIdentifiers() { + return cachedTypes.keySet(); + } + public List 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; } diff -r 8d374faacb7e -r 0370880ac9ce graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/CreateCastParser.java --- 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 diff -r 8d374faacb7e -r 0370880ac9ce graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/ExecutableTypeMethodParser.java --- 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 allowedTypes = getNode().getTypeSystem().getPrimitiveTypeMirrors(); + Set 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 nodeTypeMirrors(NodeData nodeData) { + return getNode().getTypeSystem().getPrimitiveTypeMirrors(); + } + + @Override + protected Set 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 nodeTypeMirrors(NodeData nodeData) { - List 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); diff -r 8d374faacb7e -r 0370880ac9ce graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/GenericParser.java --- 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 execTypes = execution.getChild().findGenericExecutableTypes(getContext()); List types = new ArrayList<>(); + Set 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; } diff -r 8d374faacb7e -r 0370880ac9ce graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/GuardParser.java --- 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 typeMirrors = ElementUtils.getAssignableTypes(getContext(), parameter.getType()); + Set 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 nodeTypeIdentifiers(NodeData nodeData) { + return nodeData.getTypeSystem().getTypeIdentifiers(); + } + + @Override protected ParameterSpec createReturnParameterSpec() { return new ParameterSpec("returnType", getContext().getType(boolean.class)); } diff -r 8d374faacb7e -r 0370880ac9ce graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/ImplicitCastParser.java --- 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 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 types = getTypeSystem().getPrimitiveTypeMirrors(); + Set identifiers = getTypeSystem().getTypeIdentifiers(); + MethodSpec spec = new MethodSpec(new ParameterSpec("target", types, identifiers)); + spec.addRequired(new ParameterSpec("source", types, identifiers)); return spec; } diff -r 8d374faacb7e -r 0370880ac9ce graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeMethodParser.java --- 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 nodeTypeMirrors(NodeData nodeData) { - Set 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 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; } diff -r 8d374faacb7e -r 0370880ac9ce graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java --- 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 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); diff -r 8d374faacb7e -r 0370880ac9ce graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeCastParser.java --- 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; } diff -r 8d374faacb7e -r 0370880ac9ce graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeCheckParser.java --- 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; } diff -r 8d374faacb7e -r 0370880ac9ce graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/TypeSystemParser.java --- 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 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; }