Mercurial > hg > graal-jvmci-8
diff graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/TemplateMethod.java @ 8592:a80bf36c6a1e
Refactor to shared template method signature comparison.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Mon, 01 Apr 2013 11:52:38 +0200 |
parents | 89006c76f737 |
children | 8a1115c92271 |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/TemplateMethod.java Fri Mar 29 21:39:54 2013 +0100 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/template/TemplateMethod.java Mon Apr 01 11:52:38 2013 +0200 @@ -28,6 +28,7 @@ import javax.lang.model.type.*; import com.oracle.truffle.codegen.processor.*; +import com.oracle.truffle.codegen.processor.typesystem.*; public class TemplateMethod extends MessageContainer { @@ -161,4 +162,51 @@ } return prev; } + + public List<TypeData> getSignature(TypeSystemData typeSystem) { + List<TypeData> types = new ArrayList<>(); + for (ActualParameter parameter : getReturnTypeAndParameters()) { + if (!parameter.getSpecification().isSignature()) { + continue; + } + TypeData typeData = parameter.getActualTypeData(typeSystem); + if (typeData != null) { + types.add(typeData); + } + } + return types; + } + + public int compareBySignature(TemplateMethod compareMethod) { + TypeSystemData typeSystem = getTemplate().getTypeSystem(); + if (typeSystem != compareMethod.getTemplate().getTypeSystem()) { + throw new IllegalStateException("Cannot compare two methods with different type systems."); + } + + List<TypeData> signature1 = getSignature(typeSystem); + List<TypeData> signature2 = compareMethod.getSignature(typeSystem); + if (signature1.size() != signature2.size()) { + return signature1.size() - signature2.size(); + } + + int result = 0; + for (int i = 0; i < signature1.size(); i++) { + int typeResult = compareActualParameter(typeSystem, signature1.get(i), signature2.get(i)); + if (result == 0) { + result = typeResult; + } else if (Math.signum(result) != Math.signum(typeResult)) { + // We cannot define an order. + return 0; + } + } + + return result; + } + + private static int compareActualParameter(TypeSystemData typeSystem, TypeData t1, TypeData t2) { + int index1 = typeSystem.findType(t1); + int index2 = typeSystem.findType(t2); + return index1 - index2; + } + }