Mercurial > hg > graal-compiler
diff graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java @ 7794:b891ec348f8a
Made the usage of generic types more flexible for short circuits and generic specializations.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Fri, 15 Feb 2013 19:32:58 +0100 |
parents | f81be78f15a5 |
children | c6c3515bea8e f4be7a2e783c |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java Fri Feb 15 16:48:22 2013 +0100 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java Fri Feb 15 19:32:58 2013 +0100 @@ -435,9 +435,9 @@ // TODO redirect errors from resolve. context.getLog().error(errorElement, "Node type '%s' is invalid.", Utils.getQualifiedName(nodeType)); return null; - } else if (fieldNodeData.findGenericExecutableType(context) == null) { + } else if (fieldNodeData.findGenericExecutableTypes(context).isEmpty()) { // TODO better error handling for (no or multiple?) - context.getLog().error(errorElement, "No or multiple executable generic types found for node '%s'.", Utils.getQualifiedName(nodeType)); + context.getLog().error(errorElement, "No executable generic types found for node '%s'.", Utils.getQualifiedName(nodeType)); return null; } } @@ -612,13 +612,21 @@ return valid; } - private static boolean isGenericShortCutMethod(NodeData node, TemplateMethod method) { + private boolean isGenericShortCutMethod(NodeData node, TemplateMethod method) { for (NodeFieldData field : node.getFields()) { ActualParameter parameter = method.findParameter(field.getName()); if (parameter == null) { continue; } - if (!Utils.typeEquals(node.getTypeSystem().getGenericType(), parameter.getActualType())) { + ExecutableTypeData found = null; + List<ExecutableTypeData> executableElements = field.getNodeData().findGenericExecutableTypes(context); + for (ExecutableTypeData executable : executableElements) { + if (executable.getType().equalsType(parameter.getActualTypeData(node.getTypeSystem()))) { + found = executable; + break; + } + } + if (found == null) { return false; } }