# HG changeset patch # User Christian Humer # Date 1373728388 -7200 # Node ID 00a9dbcbe431ef1be70bc3f131ee0f4a7c9299a0 # Parent bdd7c8e2293e6fe7d268980b00f4439c60a45bcb Truffle-DSL: Fixed a bug in polymorphic code generation. diff -r bdd7c8e2293e -r 00a9dbcbe431 graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java Fri Jul 12 23:26:01 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java Sat Jul 13 17:13:08 2013 +0200 @@ -32,6 +32,7 @@ import javax.lang.model.util.*; import com.oracle.truffle.api.dsl.*; +import com.oracle.truffle.api.nodes.*; import com.oracle.truffle.api.nodes.NodeInfo.Kind; import com.oracle.truffle.dsl.processor.*; import com.oracle.truffle.dsl.processor.ast.*; @@ -1226,6 +1227,12 @@ private CodeExecutableElement createCachedExecute(NodeData node, SpecializationData polymorph, CodeExecutableElement genericPolymorphMethod) { String name = executeCachedName(polymorph); CodeExecutableElement cachedExecute = new CodeExecutableElement(modifiers(PROTECTED), polymorph.getReturnType().getType(), name); + + ExecutableTypeData sourceExecutableType = node.findExecutableType(polymorph.getReturnType().getTypeSystemType(), 0); + boolean sourceThrowsUnexpected = sourceExecutableType != null && sourceExecutableType.hasUnexpectedValue(getContext()); + if (sourceThrowsUnexpected) { + cachedExecute.getThrownTypes().add(getContext().getType(UnexpectedResultException.class)); + } addInternalValueParameters(cachedExecute, polymorph, true, true); if (polymorph == node.getGenericPolymorphicSpecialization()) { @@ -2441,11 +2448,18 @@ } if (!returnBuilder.isEmpty()) { - builder.startReturn(); + + ExecutableTypeData sourceExecutableType = node.findExecutableType(specialization.getReturnType().getTypeSystemType(), 0); + boolean sourceThrowsUnexpected = sourceExecutableType != null && sourceExecutableType.hasUnexpectedValue(getContext()); + boolean targetSupportsUnexpected = executable.hasUnexpectedValue(getContext()); TypeData targetType = node.getTypeSystem().findTypeData(builder.findMethod().getReturnType()); TypeData sourceType = specialization.getReturnType().getTypeSystemType(); + if (specialization.isPolymorphic() && sourceThrowsUnexpected && !targetSupportsUnexpected) { + builder.startTryBlock(); + } + builder.startReturn(); if (targetType == null || sourceType == null) { builder.tree(returnBuilder.getRoot()); } else if (sourceType.needsCastTo(getContext(), targetType)) { @@ -2454,6 +2468,19 @@ builder.tree(returnBuilder.getRoot()); } builder.end(); + if (specialization.isPolymorphic() && sourceThrowsUnexpected && !targetSupportsUnexpected) { + builder.end(); + builder.startCatchBlock(getUnexpectedValueException(), "ex"); + builder.startReturn(); + CodeTree returns = CodeTreeBuilder.singleString("ex.getResult()"); + if (sourceType.needsCastTo(getContext(), targetType)) { + builder.tree(createCallTypeSystemMethod(context, parent, node, TypeSystemCodeGenerator.asTypeMethodName(targetType), returns)); + } else { + builder.tree(returns); + } + builder.end(); + builder.end(); + } } if (!specialization.getExceptions().isEmpty()) {