# HG changeset patch # User Christian Humer # Date 1429610090 -7200 # Node ID 82539241ff38c3fed484f618195f2c9824defef7 # Parent 986f1c0d6f558304a1404efdf22ed4d07982727f Truffle-DSL: initialize the polymorphic cached type also if the child node throws an exception. diff -r 986f1c0d6f55 -r 82539241ff38 graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java Fri Apr 17 16:18:17 2015 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java Tue Apr 21 11:54:50 2015 +0200 @@ -2356,6 +2356,7 @@ final CodeTreeBuilder polyChainBuilder = builder.create(); final String profileField = polymorphicTypeProfileFieldName(execution); final String valueFieldName = "_value"; + final String typeFieldName = "_type"; builder.declaration(getType(Class.class), profileField, accessParent(profileField)); @@ -2378,6 +2379,8 @@ polyChainBuilder.startElseIf().string(profileField).string(" == null").end(); polyChainBuilder.startBlock(); polyChainBuilder.tree(createTransferToInterpreterAndInvalidate()); + polyChainBuilder.declaration(context.getType(Class.class), typeFieldName, polyChainBuilder.create().typeLiteral(genericType).build()); + polyChainBuilder.startTryBlock(); polyChainBuilder.declaration(genericExecutableType.getReturnType(), valueFieldName, executeGeneric); hasSpecializedTypes = false; @@ -2386,14 +2389,17 @@ polyChainBuilder.tree(TypeSystemCodeGenerator.check(typeSystem, executableType.getReturnType(), CodeTreeBuilder.singleString(valueFieldName))); polyChainBuilder.end(); polyChainBuilder.startBlock(); - polyChainBuilder.startStatement().tree(accessParent(profileField)).string(" = ").typeLiteral(executableType.getReturnType()).end(); + polyChainBuilder.startStatement().string(typeFieldName).string(" = ").typeLiteral(executableType.getReturnType()).end(); polyChainBuilder.end(); } - polyChainBuilder.startElseBlock(); - polyChainBuilder.startStatement().tree(accessParent(profileField)).string(" = ").typeLiteral(genericType).end(); + polyChainBuilder.startStatement().string(typeFieldName).string(" = ").typeLiteral(genericType).end(); polyChainBuilder.end(); polyChainBuilder.startReturn().string(valueFieldName).end(); + + polyChainBuilder.end().startFinallyBlock(); + polyChainBuilder.startStatement().tree(accessParent(profileField)).string(" = ").string(typeFieldName).end(); + polyChainBuilder.end(); polyChainBuilder.end(); // else -> execute generic