# HG changeset patch # User Christian Humer # Date 1360335583 -3600 # Node ID bdcb3cc47e1642f3f8b22d3247133476871a269d # Parent d163365572152128f2e96ffbe66658880cf3b62b Generated nodes can now handle the case were a non generic execute methods does not throw an UVE. Optimized casting execute method generation. diff -r d16336557215 -r bdcb3cc47e16 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 Feb 04 17:04:23 2013 +0100 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java Fri Feb 08 15:59:43 2013 +0100 @@ -529,57 +529,77 @@ NodeData node = specialization.getNode(); TypeSystemData typeSystem = node.getTypeSystem(); - if (!type.isVoid()) { - builder.startStatement().type(specialization.getReturnType().getActualType()).string(" result").end(); - } - + ExecutableTypeData castedType = node.findExecutableType(type); TypeData primaryType = specialization.getReturnType().getActualTypeData(typeSystem); ExecutableTypeData execType = specialization.getNode().findExecutableType(primaryType); - boolean needsTry = !specialization.getReturnType().getActualTypeData(typeSystem).isGeneric(); - if (needsTry) { - builder.startTryBlock(); - } + boolean needsTry = execType.hasUnexpectedValue(getContext()); + boolean returnVoid = type.isVoid(); - builder.startStatement(); - if (!type.isVoid()) { - builder.string("result = "); - } - buildExecute(builder, null, execType); - builder.end(); // statement + CodeTree primaryExecuteCall = null; + + CodeTreeBuilder executeBuilder = CodeTreeBuilder.createBuilder(); + buildExecute(executeBuilder, null, execType); + primaryExecuteCall = executeBuilder.getRoot(); if (needsTry) { - builder.end().startCatchBlock(getUnexpectedValueException(), "ex"); + if (!returnVoid) { + builder.declaration(primaryType.getPrimitiveType(), "value"); + } + builder.startTryBlock(); - if (!type.isVoid()) { - builder.startReturn(); - if (!type.isGeneric()) { - startCallTypeSystemMethod(getContext(), builder, node, TypeSystemCodeGenerator.expectTypeMethodName(type)); - } + if (returnVoid) { + builder.statement(primaryExecuteCall); + } else { + builder.startStatement(); + builder.string("value = "); + builder.tree(primaryExecuteCall); + builder.end(); + } - builder.string("ex.getResult()"); + builder.end().startCatchBlock(getUnexpectedValueException(), "ex"); + if (returnVoid) { + builder.string("// ignore").newLine(); + } else { + builder.startReturn(); + builder.tree(castPrimaryExecute(node, castedType, CodeTreeBuilder.singleString("ex.getResult()"))); + builder.end(); + } + builder.end(); - if (!type.isGeneric()) { - builder.end().end(); - } - builder.end(); // return + if (!returnVoid) { + builder.startReturn(); + builder.tree(castPrimaryExecute(node, castedType, CodeTreeBuilder.singleString("value"))); + builder.end(); + } + } else { + if (returnVoid) { + builder.statement(primaryExecuteCall); } else { - builder.string("// ignore").newLine(); + builder.startReturn(); + builder.tree(castPrimaryExecute(node, castedType, primaryExecuteCall)); + builder.end(); } } - builder.end(); // try/catch + } + + private CodeTree castPrimaryExecute(NodeData node, ExecutableTypeData castedType, CodeTree value) { + if (castedType.getType().isVoid()) { + return value; + } + if (castedType.getType().isGeneric()) { + return value; + } - if (!type.isVoid()) { - builder.startReturn(); - if (!type.isGeneric()) { - startCallTypeSystemMethod(getContext(), builder, node, TypeSystemCodeGenerator.expectTypeMethodName(type)); - } - builder.string("result"); - if (!type.isGeneric()) { - builder.end().end(); - } - builder.end(); // return + CodeTreeBuilder builder = CodeTreeBuilder.createBuilder(); + if (castedType.hasUnexpectedValue(getContext())) { + startCallTypeSystemMethod(getContext(), builder, node, TypeSystemCodeGenerator.expectTypeMethodName(castedType.getType())); + } else { + startCallTypeSystemMethod(getContext(), builder, node, TypeSystemCodeGenerator.asTypeMethodName(castedType.getType())); } + builder.tree(value); + builder.end().end(); + return builder.getRoot(); } private void buildFunctionalExecuteMethod(CodeTreeBuilder builder, SpecializationData specialization) { @@ -794,16 +814,22 @@ addValueParameterNames(specializeCall, nextSpecialization.getNode().getGenericSpecialization(), exceptionSpec != null ? exceptionSpec.getName() : null, true); specializeCall.end().end(); + TypeData expectedType = currentSpecialization.getReturnType().getActualTypeData(currentSpecialization.getNode().getTypeSystem()); if (canThrowUnexpected) { builder.startReturn(); - TypeData expectedType = currentSpecialization.getReturnType().getActualTypeData(currentSpecialization.getNode().getTypeSystem()); startCallTypeSystemMethod(context, builder, currentSpecialization.getNode(), TypeSystemCodeGenerator.expectTypeMethodName(expectedType)); builder.tree(specializeCall.getRoot()); builder.end().end(); builder.end(); // return } else { builder.startReturn(); - builder.tree(specializeCall.getRoot()); + if (!expectedType.isVoid() && !expectedType.isGeneric()) { + startCallTypeSystemMethod(context, builder, currentSpecialization.getNode(), TypeSystemCodeGenerator.asTypeMethodName(expectedType)); + builder.tree(specializeCall.getRoot()); + builder.end().end(); + } else { + builder.tree(specializeCall.getRoot()); + } builder.end(); } diff -r d16336557215 -r bdcb3cc47e16 graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/typesystem/TypeSystemCodeGenerator.java --- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/typesystem/TypeSystemCodeGenerator.java Mon Feb 04 17:04:23 2013 +0100 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/typesystem/TypeSystemCodeGenerator.java Fri Feb 08 15:59:43 2013 +0100 @@ -215,6 +215,7 @@ method.addParameter(new CodeVariableElement(getContext().getType(Object.class), LOCAL_VALUE)); CodeTreeBuilder body = method.createBuilder(); + body.startAssert().startCall(isTypeMethodName(type)).string(LOCAL_VALUE).end().end(); body.startReturn().cast(type.getPrimitiveType(), body.create().string(LOCAL_VALUE).getTree()).end(); return method; @@ -233,5 +234,6 @@ return method; } + } }