# HG changeset patch # User Christian Humer # Date 1365258379 -7200 # Node ID 5eeade94023688b8c85d8849bd002acdd588960c # Parent e0ff5cf358a43565b51a89e3f27995db7cdde850 Fixed user generic signature must not match generated generic signature. diff -r e0ff5cf358a4 -r 5eeade940236 graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/Utils.java --- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/Utils.java Sat Apr 06 14:33:39 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/Utils.java Sat Apr 06 16:26:19 2013 +0200 @@ -799,4 +799,8 @@ return true; } + public static boolean isObject(TypeMirror actualType) { + return getQualifiedName(actualType).equals("java.lang.Object"); + } + } diff -r e0ff5cf358a4 -r 5eeade940236 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 Sat Apr 06 14:33:39 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java Sat Apr 06 16:26:19 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) { diff -r e0ff5cf358a4 -r 5eeade940236 graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeMethodParser.java --- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeMethodParser.java Sat Apr 06 14:33:39 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeMethodParser.java Sat Apr 06 16:26:19 2013 +0200 @@ -61,7 +61,7 @@ } protected ParameterSpec createReturnParameterSpec() { - return createValueParameterSpec("operation", getNode()); + return createValueParameterSpec("returnValue", getNode()); } @Override diff -r e0ff5cf358a4 -r 5eeade940236 graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java --- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java Sat Apr 06 14:33:39 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java Sat Apr 06 16:26:19 2013 +0200 @@ -328,6 +328,23 @@ } if (genericSpecialization != null) { + if (genericSpecialization.isUseSpecializationsForGeneric()) { + for (ActualParameter parameter : genericSpecialization.getReturnTypeAndParameters()) { + if (Utils.isObject(parameter.getActualType())) { + continue; + } + Set 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 diff -r e0ff5cf358a4 -r 5eeade940236 graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/SpecializationData.java --- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/SpecializationData.java Sat Apr 06 14:33:39 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/SpecializationData.java Sat Apr 06 16:26:19 2013 +0200 @@ -194,4 +194,5 @@ public String toString() { return String.format("%s [id = %s, method = %s, guards = %s]", getClass().getSimpleName(), getId(), getMethod(), getGuards()); } + } diff -r e0ff5cf358a4 -r 5eeade940236 graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/ActualParameter.java --- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/ActualParameter.java Sat Apr 06 14:33:39 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/ActualParameter.java Sat Apr 06 16:26:19 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; } diff -r e0ff5cf358a4 -r 5eeade940236 graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/TemplateMethod.java --- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/TemplateMethod.java Sat Apr 06 14:33:39 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/TemplateMethod.java Sat Apr 06 16:26:19 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 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 iterator = parameters.listIterator(); iterator.hasNext();) { + ActualParameter parameter = iterator.next(); + if (parameter.getLocalName().equals(localName)) { + iterator.set(newParameter); + newParameter.setMethod(this); + } + } + } + public List getRequiredParameters() { List 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; }