Mercurial > hg > graal-jvmci-8
diff graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java @ 8595:8a1115c92271
Implemented codegen guard definitions can now omit unused parameters.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Mon, 01 Apr 2013 21:43:20 +0200 |
parents | a80bf36c6a1e |
children | 586b5e117c44 |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java Mon Apr 01 12:19:15 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java Mon Apr 01 21:43:20 2013 +0200 @@ -335,13 +335,7 @@ specializations.add(new SpecializationData(uninializedMethod, false, true)); } - Collections.sort(specializations, new Comparator<SpecializationData>() { - - @Override - public int compare(SpecializationData o1, SpecializationData o2) { - return compareSpecialization(o1, o2); - } - }); + Collections.sort(specializations); node.setSpecializations(specializations); @@ -372,27 +366,13 @@ for (String guardDefinition : specialization.getGuardDefinitions()) { GuardParser parser = new GuardParser(context, specialization, guardDefinition); List<GuardData> guards = parser.parse(methods); - Collections.sort(guards, new Comparator<GuardData>() { - - @Override - public int compare(GuardData o1, GuardData o2) { - int compare = o1.compareBySignature(o2); - if (compare == 0) { - compare = o1.getId().compareTo(o2.getId()); - } - if (compare == 0) { - TypeElement enclosingType1 = Utils.findNearestEnclosingType(o1.getMethod()); - TypeElement enclosingType2 = Utils.findNearestEnclosingType(o2.getMethod()); - compare = enclosingType1.getQualifiedName().toString().compareTo(enclosingType2.getQualifiedName().toString()); - } - return compare; - } - }); if (!guards.isEmpty()) { foundGuards.add(guards.get(0)); } else { // error no guard found - specialization.addError("No guard found with with name '%s'.", guardDefinition); + MethodSpec spec = parser.createSpecification(specialization.getMethod(), null); + spec.applyTypeDefinitions("types"); + specialization.addError("Guard with method name '%s' not found. Expected signature: %n%s", guardDefinition, spec.toSignatureString("guard")); } } @@ -573,17 +553,17 @@ boolean valid = true; int args = -1; for (SpecializationData specializationData : nodeData.getSpecializations()) { - int specializationArgs = 0; + int signatureArgs = 0; for (ActualParameter param : specializationData.getParameters()) { - if (!param.getSpecification().isOptional()) { - specializationArgs++; + if (param.getSpecification().isSignature()) { + signatureArgs++; } } - if (args != -1 && args != specializationArgs) { + if (args != -1 && args != signatureArgs) { valid = false; break; } - args = specializationArgs; + args = signatureArgs; } if (!valid) { for (SpecializationData specialization : nodeData.getSpecializations()) { @@ -759,7 +739,11 @@ NodeFieldData fieldData = new NodeFieldData(var, findAccessElement(var), mirror, kind, execution); if (type != null && mirror != null) { - NodeData fieldNodeData = resolveNode(Utils.fromTypeMirror(type)); + TypeElement typeElement = Utils.fromTypeMirror(type); + if (typeElement == null) { + return null; + } + NodeData fieldNodeData = resolveNode(typeElement); fieldData.setNode(fieldNodeData); if (fieldNodeData == null) { @@ -974,7 +958,7 @@ SpecializationData m1 = specializations.get(i); for (int j = i + 1; j < specializations.size(); j++) { SpecializationData m2 = specializations.get(j); - int inferredOrder = compareSpecialization(m1, m2); + int inferredOrder = m1.compareBySignature(m2); if (m1.getOrder() != Specialization.DEFAULT_ORDER && m2.getOrder() != Specialization.DEFAULT_ORDER) { int specOrder = m1.getOrder() - m2.getOrder(); @@ -1014,26 +998,6 @@ } } - private static int compareSpecialization(SpecializationData m1, SpecializationData m2) { - if (m1 == m2) { - return 0; - } - - if (m1.getOrder() != Specialization.DEFAULT_ORDER && m2.getOrder() != Specialization.DEFAULT_ORDER) { - return m1.getOrder() - m2.getOrder(); - } else if (m1.isUninitialized() ^ m2.isUninitialized()) { - return m1.isUninitialized() ? -1 : 1; - } else if (m1.isGeneric() ^ m2.isGeneric()) { - return m1.isGeneric() ? 1 : -1; - } - - if (m1.getTemplate() != m2.getTemplate()) { - throw new UnsupportedOperationException("Cannot compare two specializations with different templates."); - } - - return m1.compareBySignature(m2); - } - @Override public Class<? extends Annotation> getAnnotationType() { return null;