# HG changeset patch # User Christian Humer # Date 1369156853 -7200 # Node ID 763100239da69459a4eea231e6277dcdd93088db # Parent 0e4db5ee06953a5a6315be9b837dec02b969801c Fixed GRAAL-276. diff -r 0e4db5ee0695 -r 763100239da6 graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/ExecutableTypeData.java --- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/ExecutableTypeData.java Tue May 21 19:20:04 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/ExecutableTypeData.java Tue May 21 19:20:53 2013 +0200 @@ -75,23 +75,6 @@ return count; } - public boolean startsWithSignature(TemplateMethod method) { - for (ActualParameter param : getParameters()) { - if (!param.getSpecification().isSignature()) { - continue; - } - ActualParameter foundParam = method.findParameter(param.getLocalName()); - if (foundParam != null) { - TypeData actualType = param.getTypeSystemType(); - TypeData foundType = foundParam.getTypeSystemType(); - if (actualType == null || foundType == null || !actualType.equalsType(foundType)) { - return false; - } - } - } - return true; - } - public boolean hasGenericSignature() { List types = getSignature(); for (TypeData typeData : types) { diff -r 0e4db5ee0695 -r 763100239da6 graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/ExecutableTypeMethodParser.java --- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/ExecutableTypeMethodParser.java Tue May 21 19:20:04 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/ExecutableTypeMethodParser.java Tue May 21 19:20:53 2013 +0200 @@ -44,8 +44,15 @@ @Override public MethodSpec createSpecification(ExecutableElement method, AnnotationMirror mirror) { MethodSpec spec = createDefaultMethodSpec(method, mirror, false, null); + List requiredSpecs = new ArrayList<>(spec.getRequired()); + spec.getRequired().clear(); + + for (ParameterSpec originalSpec : requiredSpecs) { + spec.addRequired(new ParameterSpec(originalSpec, Arrays.asList(getNode().getTypeSystem().getGenericType()))); + } + spec.setVariableRequiredArguments(true); - ParameterSpec other = new ParameterSpec("other", nodeTypeMirrors(getNode())); + ParameterSpec other = new ParameterSpec("other", Arrays.asList(getNode().getTypeSystem().getGenericType())); other.setCardinality(Cardinality.MANY); other.setSignature(true); other.setIndexed(true); diff -r 0e4db5ee0695 -r 763100239da6 graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java --- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java Tue May 21 19:20:04 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java Tue May 21 19:20:53 2013 +0200 @@ -1394,12 +1394,13 @@ CodeTreeBuilder builder = new CodeTreeBuilder(parent); - ExecutableTypeData foundEvaluatedPrimaryType = findFunctionalExecutableType(specialization, execType.getEvaluatedCount()); + List primaryExecutes = findFunctionalExecutableType(specialization, execType.getEvaluatedCount()); - if (execType == foundEvaluatedPrimaryType || foundEvaluatedPrimaryType == null) { + if (primaryExecutes.contains(execType) || primaryExecutes.isEmpty()) { builder.tree(createFunctionalExecute(builder, specialization, execType)); } else if (needsCastingExecuteMethod(execType, primaryType)) { - builder.tree(createCastingExecute(builder, specialization, execType, foundEvaluatedPrimaryType)); + assert !primaryExecutes.isEmpty(); + builder.tree(createCastingExecute(builder, specialization, execType, primaryExecutes.get(0))); } else { return null; } @@ -1441,7 +1442,7 @@ return false; } - private ExecutableTypeData findFunctionalExecutableType(SpecializationData specialization, int evaluatedCount) { + private List findFunctionalExecutableType(SpecializationData specialization, int evaluatedCount) { TypeData primaryType = specialization.getReturnType().getTypeSystemType(); List otherTypes = specialization.getNode().getExecutableTypes(evaluatedCount); @@ -1453,19 +1454,24 @@ filteredTypes.add(compareType); } - for (ExecutableTypeData compareType : filteredTypes) { - if (compareType.startsWithSignature(specialization)) { - return compareType; + // no direct matches found use generic where the type is Object + if (filteredTypes.isEmpty()) { + for (ExecutableTypeData compareType : otherTypes) { + if (compareType.getType().isGeneric() && !compareType.hasUnexpectedValue(getContext())) { + filteredTypes.add(compareType); + } } } - for (ExecutableTypeData compareType : otherTypes) { - if (compareType.startsWithSignature(specialization)) { - return compareType; + if (filteredTypes.isEmpty()) { + for (ExecutableTypeData compareType : otherTypes) { + if (compareType.getType().isGeneric()) { + filteredTypes.add(compareType); + } } } - return null; + return filteredTypes; } private CodeTree createCastingExecute(CodeTreeBuilder parent, SpecializationData specialization, ExecutableTypeData executable, ExecutableTypeData castExecutable) { diff -r 0e4db5ee0695 -r 763100239da6 graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/ParameterSpec.java --- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/ParameterSpec.java Tue May 21 19:20:04 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/ParameterSpec.java Tue May 21 19:20:53 2013 +0200 @@ -55,6 +55,16 @@ this.allowedTypes = allowedTypes; } + public ParameterSpec(ParameterSpec o, List allowedTypes) { + this.name = o.name; + this.cardinality = o.cardinality; + this.signature = o.signature; + this.indexed = o.indexed; + this.local = o.local; + this.typeDefinition = o.typeDefinition; + this.allowedTypes = allowedTypes; + } + void setTypeDefinition(TypeDef typeDefinition) { this.typeDefinition = typeDefinition; }