# HG changeset patch # User Christian Humer # Date 1433847043 -7200 # Node ID 90fd692432272179ac4783267b95f64a89ac585c # Parent 79fb8b5ef18592db150b0c97913cfe798bfc5305 Truffle-DSL: speculate using a compilation final boolean that the unsupported branch is not taken for single specializable nodes. diff -r 79fb8b5ef185 -r 90fd69243227 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 Tue Jun 09 12:50:43 2015 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java Tue Jun 09 12:50:43 2015 +0200 @@ -32,6 +32,7 @@ import javax.lang.model.type.*; import javax.lang.model.util.*; +import com.oracle.truffle.api.*; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.*; @@ -241,7 +242,7 @@ } if (singleSpecializableUnsupportedUsed) { - clazz.add(createUnsupportedMethod()); + addUnsupportedMethod(clazz); } } else { @@ -298,10 +299,18 @@ } } - private Element createUnsupportedMethod() { + private void addUnsupportedMethod(CodeTypeElement clazz) { + CodeVariableElement seenUnsupportedField = new CodeVariableElement(modifiers(PRIVATE), getType(boolean.class), "seenUnsupported0"); + seenUnsupportedField.getAnnotationMirrors().add(new CodeAnnotationMirror(context.getDeclaredType(CompilationFinal.class))); + clazz.add(seenUnsupportedField); LocalContext locals = LocalContext.load(this); - CodeExecutableElement method = locals.createMethod(modifiers(PROTECTED), getType(UnsupportedSpecializationException.class), "unsupported", varArgsThreshold); + CodeExecutableElement method = locals.createMethod(modifiers(PRIVATE), getType(UnsupportedSpecializationException.class), "unsupported", varArgsThreshold); CodeTreeBuilder builder = method.createBuilder(); + builder.startIf().string("!").string(seenUnsupportedField.getName()).end().startBlock(); + builder.startStatement().startStaticCall(getType(CompilerDirectives.class), "transferToInterpreterAndInvalidate").end().end(); + builder.startStatement().string(seenUnsupportedField.getName()).string(" = true").end(); + builder.end(); + builder.startReturn(); builder.startNew(getType(UnsupportedSpecializationException.class)); builder.string("this"); @@ -309,7 +318,7 @@ locals.addReferencesTo(builder); builder.end(); builder.end(); - return method; + clazz.add(method); } private CodeExecutableElement createNodeConstructor(CodeTypeElement clazz, ExecutableElement superConstructor) {