Mercurial > hg > graal-compiler
diff graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/NodeData.java @ 20940:476374f3fe9a
Truffle-DSL: generate better polymorphic execute signatures
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Tue, 14 Apr 2015 15:12:48 +0200 |
parents | 18c0f02fa4d2 |
children | 1ed58a90b510 |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/NodeData.java Tue Apr 14 15:12:48 2015 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/NodeData.java Tue Apr 14 15:12:48 2015 +0200 @@ -48,7 +48,7 @@ private final List<SpecializationData> specializations = new ArrayList<>(); private final List<ShortCircuitData> shortCircuits = new ArrayList<>(); private final List<CreateCastData> casts = new ArrayList<>(); - private Map<Integer, List<ExecutableTypeData>> executableTypes; + private final List<ExecutableTypeData> executableTypes = new ArrayList<>(); private final NodeExecutionData thisExecution; private final boolean generateFactory; @@ -135,10 +135,7 @@ } public int getSignatureSize() { - if (getSpecializations() != null && !getSpecializations().isEmpty()) { - return getSpecializations().get(0).getSignatureSize(); - } - return 0; + return getChildExecutions().size(); } public boolean isFrameUsedByAnyGuard() { @@ -292,9 +289,10 @@ } for (ExecutableTypeData execType : getExecutableTypes()) { - methods.add(execType.getMethod()); + if (execType.getMethod() != null) { + methods.add(execType.getMethod()); + } } - for (ShortCircuitData shortcircuit : getShortCircuits()) { methods.add(shortcircuit.getMethod()); } @@ -329,21 +327,16 @@ } public List<ExecutableTypeData> getExecutableTypes(int evaluatedCount) { - if (executableTypes == null) { - return Collections.emptyList(); - } if (evaluatedCount == -1) { - List<ExecutableTypeData> typeData = new ArrayList<>(); - for (int currentEvaluationCount : executableTypes.keySet()) { - typeData.addAll(executableTypes.get(currentEvaluationCount)); + return executableTypes; + } else { + List<ExecutableTypeData> filteredTypes = new ArrayList<>(); + for (ExecutableTypeData type : executableTypes) { + if (type.getEvaluatedCount() == evaluatedCount) { + filteredTypes.add(type); + } } - return typeData; - } else { - List<ExecutableTypeData> types = executableTypes.get(evaluatedCount); - if (types == null) { - return Collections.emptyList(); - } - return types; + return filteredTypes; } } @@ -496,6 +489,25 @@ return specializations; } + public ExecutableTypeData getGenericExecutableType(ExecutableTypeData typeHint) { + ExecutableTypeData polymorphicDelegate = null; + if (typeHint != null) { + polymorphicDelegate = typeHint; + while (polymorphicDelegate.getDelegatedTo() != null && polymorphicDelegate.getEvaluatedCount() != getSignatureSize()) { + polymorphicDelegate = polymorphicDelegate.getDelegatedTo(); + } + } + if (polymorphicDelegate == null) { + for (ExecutableTypeData type : getExecutableTypes()) { + if (type.getDelegatedTo() == null && type.getEvaluatedCount() == getSignatureSize()) { + polymorphicDelegate = type; + break; + } + } + } + return polymorphicDelegate; + } + public List<ExecutableTypeData> getExecutableTypes() { return getExecutableTypes(-1); } @@ -512,10 +524,6 @@ return minimalEvaluatedParameters; } - public void setExecutableTypes(Map<Integer, List<ExecutableTypeData>> executableTypes) { - this.executableTypes = executableTypes; - } - @Override public String toString() { return getClass().getSimpleName() + "[" + getNodeId() + "]"; @@ -536,7 +544,7 @@ return getNodeId().compareTo(o.getNodeId()); } - public List<TypeMirror> getPossibleTypes(NodeExecutionData execution) { + public List<TypeMirror> getGenericTypes(NodeExecutionData execution) { List<TypeMirror> types = new ArrayList<>(); // add types possible through return types and evaluated parameters in execute methods