Mercurial > hg > graal-jvmci-8
changeset 21066:82539241ff38
Truffle-DSL: initialize the polymorphic cached type also if the child node throws an exception.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Tue, 21 Apr 2015 11:54:50 +0200 |
parents | 986f1c0d6f55 |
children | 69d03eeb5eed 53b2d64f8ad1 |
files | graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java |
diffstat | 1 files changed, 9 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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