# HG changeset patch # User Gilles Duboscq # Date 1365356258 -7200 # Node ID 89ea104f29accb2bfcdddbdb77370eb4e5e8dc53 # Parent 34d13df4165beb28b48ab87c5ac954557506b855# Parent 31f1390766d9b3c2e8ffa07bed86d581947fe282 Merge diff -r 34d13df4165b -r 89ea104f29ac 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 Sun Apr 07 17:04:59 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/Utils.java Sun Apr 07 19:37:38 2013 +0200 @@ -799,4 +799,8 @@ return true; } + public static boolean isObject(TypeMirror actualType) { + return getQualifiedName(actualType).equals("java.lang.Object"); + } + } diff -r 34d13df4165b -r 89ea104f29ac 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 Sun Apr 07 17:04:59 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java Sun Apr 07 19:37:38 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) { @@ -1476,7 +1475,12 @@ builder.end(); // call replace builder.end(); // statement - String generatedMethodName = generatedGenericMethodName(specialization.findNextSpecialization()); + String generatedMethodName; + if (specialization.getNode().getGenericSpecialization().isUseSpecializationsForGeneric()) { + generatedMethodName = generatedGenericMethodName(null); + } else { + generatedMethodName = generatedGenericMethodName(specialization.findNextSpecialization()); + } ExecutableElement generatedGeneric = clazz.getEnclosingClass().getMethod(generatedMethodName); CodeTreeBuilder genericExecute = CodeTreeBuilder.createBuilder(); diff -r 34d13df4165b -r 89ea104f29ac 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 Sun Apr 07 17:04:59 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeMethodParser.java Sun Apr 07 19:37:38 2013 +0200 @@ -61,7 +61,7 @@ } protected ParameterSpec createReturnParameterSpec() { - return createValueParameterSpec("operation", getNode()); + return createValueParameterSpec("returnValue", getNode()); } @Override diff -r 34d13df4165b -r 89ea104f29ac 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 Sun Apr 07 17:04:59 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java Sun Apr 07 19:37:38 2013 +0200 @@ -108,8 +108,7 @@ } NodeData rootNode = parseNode(rootType); - boolean hasErrors = rootNode != null ? rootNode.hasErrors() : false; - if ((rootNode == null || hasErrors) && children.size() > 0) { + if (rootNode == null && children.size() > 0) { rootNode = new NodeData(rootType, rootType.getSimpleName().toString()); } @@ -328,6 +327,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 34d13df4165b -r 89ea104f29ac 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 Sun Apr 07 17:04:59 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/SpecializationData.java Sun Apr 07 19:37:38 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 34d13df4165b -r 89ea104f29ac 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 Sun Apr 07 17:04:59 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/ActualParameter.java Sun Apr 07 19:37:38 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 34d13df4165b -r 89ea104f29ac 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 Sun Apr 07 17:04:59 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/TemplateMethod.java Sun Apr 07 19:37:38 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; }