# HG changeset patch # User Christian Humer # Date 1365437873 -7200 # Node ID bd067a48a9c20117f238d27be88081e87d7b3b5d # Parent 9f3bade42fd2db80a6e4b1fe96306cfd6c098371 Changed execute method generation strategy. Limited it for primitive execute methods. diff -r 9f3bade42fd2 -r bd067a48a9c2 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 Mon Apr 08 18:16:19 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/Utils.java Mon Apr 08 18:17:53 2013 +0200 @@ -332,6 +332,10 @@ return mirror.getKind().isPrimitive(); } + public static boolean isPrimitiveOrVoid(TypeMirror mirror) { + return isPrimitive(mirror) || isVoid(mirror); + } + public static List getQualifiedSuperTypeNames(TypeElement element) { List types = getSuperTypes(element); List qualifiedNames = new ArrayList<>(); diff -r 9f3bade42fd2 -r bd067a48a9c2 graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/ExecutableTypeData.java --- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/ExecutableTypeData.java Mon Apr 08 18:16:19 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/ExecutableTypeData.java Mon Apr 08 18:17:53 2013 +0200 @@ -59,6 +59,10 @@ return getMethod().getModifiers().contains(Modifier.FINAL); } + public boolean isAbstract() { + return getMethod().getModifiers().contains(Modifier.ABSTRACT); + } + @Override public int hashCode() { return type.hashCode(); diff -r 9f3bade42fd2 -r bd067a48a9c2 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 Mon Apr 08 18:16:19 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java Mon Apr 08 18:17:53 2013 +0200 @@ -1104,25 +1104,23 @@ } } + TypeData primaryType = specialization.getReturnType().getActualTypeData(node.getTypeSystem()); + for (ExecutableTypeData execType : node.getExecutableTypes()) { if (execType.isFinal()) { continue; } - CodeExecutableElement method = CodeExecutableElement.clone(getContext().getEnvironment(), execType.getMethod()); - if (method.getParameters().size() == 1) { - CodeVariableElement var = CodeVariableElement.clone(method.getParameters().get(0)); - var.setName("frameValue"); - method.getParameters().set(0, var); + + if (primaryType == execType.getType()) { + CodeExecutableElement executeMethod = createExecutableTypeOverride(execType); + clazz.add(executeMethod); + executeMethod.setBodyTree(createFunctionalExecute(executeMethod.createBuilder(), specialization)); + } else if (needsCastingExecuteMethod(execType, primaryType)) { + CodeExecutableElement executeMethod = createExecutableTypeOverride(execType); + clazz.add(executeMethod); + executeMethod.setBodyTree(createCastingExecute(executeMethod.createBuilder(), specialization, execType.getType())); } - method.getModifiers().remove(Modifier.ABSTRACT); - clazz.add(method); - TypeData primaryType = specialization.getReturnType().getActualTypeData(node.getTypeSystem()); - if (primaryType == execType.getType()) { - buildFunctionalExecuteMethod(method.createBuilder(), specialization); - } else { - buildCastingExecuteMethod(method.createBuilder(), specialization, execType.getType()); - } } if (node.needsRewrites(getContext()) && !specialization.isGeneric() && !specialization.isUninitialized()) { @@ -1130,7 +1128,32 @@ } } - private void buildCastingExecuteMethod(CodeTreeBuilder builder, SpecializationData specialization, TypeData type) { + private CodeExecutableElement createExecutableTypeOverride(ExecutableTypeData execType) { + CodeExecutableElement method = CodeExecutableElement.clone(getContext().getEnvironment(), execType.getMethod()); + if (method.getParameters().size() == 1) { + CodeVariableElement var = CodeVariableElement.clone(method.getParameters().get(0)); + var.setName("frameValue"); + method.getParameters().set(0, var); + } + method.getModifiers().remove(Modifier.ABSTRACT); + return method; + } + + private boolean needsCastingExecuteMethod(ExecutableTypeData execType, TypeData primaryType) { + if (execType.isAbstract()) { + return true; + } + if (Utils.isPrimitiveOrVoid(primaryType.getPrimitiveType()) && Utils.isPrimitiveOrVoid(execType.getType().getPrimitiveType())) { + return true; + } + if (execType.getType().isGeneric()) { + return true; + } + return false; + } + + private CodeTree createCastingExecute(CodeTreeBuilder parent, SpecializationData specialization, TypeData type) { + CodeTreeBuilder builder = new CodeTreeBuilder(parent); NodeData node = specialization.getNode(); TypeSystemData typeSystem = node.getTypeSystem(); @@ -1143,7 +1166,7 @@ CodeTree primaryExecuteCall = null; - CodeTreeBuilder executeBuilder = CodeTreeBuilder.createBuilder(); + CodeTreeBuilder executeBuilder = new CodeTreeBuilder(builder); buildExecute(executeBuilder, null, null, execType); primaryExecuteCall = executeBuilder.getRoot(); @@ -1186,6 +1209,8 @@ builder.end(); } } + + return builder.getRoot(); } private CodeTree createExpectType(NodeData node, ExecutableTypeData castedType, CodeTree value) { @@ -1211,7 +1236,8 @@ return builder.getRoot(); } - private void buildFunctionalExecuteMethod(CodeTreeBuilder builder, SpecializationData specialization) { + private CodeTree createFunctionalExecute(CodeTreeBuilder parent, SpecializationData specialization) { + CodeTreeBuilder builder = new CodeTreeBuilder(parent); if (specialization.isUninitialized()) { builder.tree(createDeoptimize(builder)); } @@ -1230,6 +1256,8 @@ returnSpecialized = createReturnSpecializeAndExecute(builder, next, null); } builder.tree(createGuardAndCast(builder, null, specialization, specialization, true, executeNode, returnSpecialized)); + + return builder.getRoot(); } private CodeTree createDeoptimize(CodeTreeBuilder parent) {