# HG changeset patch # User Michael Van De Vanter # Date 1431476989 25200 # Node ID e34bc00733d19c7a83b307e83046bd11a50fbd27 # Parent 442b57a7f2088efa5dc965ec520d75384719b256 Truffle/Instrumentation: an Advanced Instrument can now be created that requires the evaluation result be of a specified type, reporting a failure if not diff -r 442b57a7f208 -r e34bc00733d1 graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/InstrumentationPartialEvaluationTest.java --- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/InstrumentationPartialEvaluationTest.java Tue May 12 16:06:00 2015 -0700 +++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/InstrumentationPartialEvaluationTest.java Tue May 12 17:29:49 2015 -0700 @@ -217,7 +217,7 @@ public AdvancedInstrumentRoot createInstrumentRoot(Probe probe, Node node) { return null; } - }, "test AdvancedInstrument"); + }, null, "test AdvancedInstrument"); testProbe.attach(instrument); // It all gets compiled away @@ -248,7 +248,7 @@ } }; } - }, "test AdvancedInstrument"); + }, null, "test AdvancedInstrument"); testProbe.attach(instrument); // It all gets compiled away. diff -r 442b57a7f208 -r e34bc00733d1 graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/instrument/AdvancedInstrumentTest.java --- a/graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/instrument/AdvancedInstrumentTest.java Tue May 12 16:06:00 2015 -0700 +++ b/graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/instrument/AdvancedInstrumentTest.java Tue May 12 17:29:49 2015 -0700 @@ -64,7 +64,7 @@ public AdvancedInstrumentRoot createInstrumentRoot(Probe p, Node n) { return null; } - }, "test AdvancedInstrument"); + }, null, "test AdvancedInstrument"); probe.attach(instrument); assertEquals(13, callTarget1.call()); @@ -77,7 +77,7 @@ public AdvancedInstrumentRoot createInstrumentRoot(Probe p, Node n) { return counter; } - }, "test AdvancedInstrument")); + }, null, "test AdvancedInstrument")); assertEquals(0, counter.getCount()); assertEquals(13, callTarget1.call()); diff -r 442b57a7f208 -r e34bc00733d1 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/AdvancedInstrumentResultListener.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/AdvancedInstrumentResultListener.java Tue May 12 16:06:00 2015 -0700 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/AdvancedInstrumentResultListener.java Tue May 12 17:29:49 2015 -0700 @@ -31,7 +31,7 @@ /** * Listener for receiving the result a client-provided {@linkplain AdvancedInstrumentRoot AST * fragment}, when executed by a - * {@linkplain Instrument#create(AdvancedInstrumentResultListener, AdvancedInstrumentRootFactory, String) + * {@linkplain Instrument#create(AdvancedInstrumentResultListener, AdvancedInstrumentRootFactory, Class, String) * Advanced Instrument}. * * @see Instrument @@ -43,7 +43,7 @@ /** * Notifies listener that a client-provided {@linkplain AdvancedInstrumentRoot AST fragment} has * been executed by an - * {@linkplain Instrument#create(AdvancedInstrumentResultListener, AdvancedInstrumentRootFactory, String) + * {@linkplain Instrument#create(AdvancedInstrumentResultListener, AdvancedInstrumentRootFactory, Class, String) * Advanced Instrument} with the specified result, possibly {@code null}. *

* Note: Truffle will attempt to optimize implementations through partial diff -r 442b57a7f208 -r e34bc00733d1 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/AdvancedInstrumentRoot.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/AdvancedInstrumentRoot.java Tue May 12 16:06:00 2015 -0700 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/AdvancedInstrumentRoot.java Tue May 12 17:29:49 2015 -0700 @@ -30,7 +30,7 @@ /** * Root of a client-provided AST fragment that can be executed efficiently, subject to full Truffle * optimization, by an - * {@linkplain Instrument#create(AdvancedInstrumentResultListener, AdvancedInstrumentRootFactory, String) + * {@linkplain Instrument#create(AdvancedInstrumentResultListener, AdvancedInstrumentRootFactory, Class, String) * Advanced Instrument}. * * @see Instrument diff -r 442b57a7f208 -r e34bc00733d1 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/AdvancedInstrumentRootFactory.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/AdvancedInstrumentRootFactory.java Tue May 12 16:06:00 2015 -0700 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/AdvancedInstrumentRootFactory.java Tue May 12 17:29:49 2015 -0700 @@ -29,7 +29,7 @@ /** * Creator of {@linkplain AdvancedInstrumentRoot AST fragments} suitable for efficient execution, * subject to full Truffle optimization, by an - * {@linkplain Instrument#create(AdvancedInstrumentResultListener, AdvancedInstrumentRootFactory, String) + * {@linkplain Instrument#create(AdvancedInstrumentResultListener, AdvancedInstrumentRootFactory, Class, String) * Advanced Instrument}. * * @see Instrument diff -r 442b57a7f208 -r e34bc00733d1 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/Instrument.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/Instrument.java Tue May 12 16:06:00 2015 -0700 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/Instrument.java Tue May 12 17:29:49 2015 -0700 @@ -133,11 +133,13 @@ * * @param resultListener optional client callback for results/failure notification * @param rootFactory provider of AST fragments on behalf of the client + * @param requiredResultType optional requirement, any non-assignable result is reported to the + * the listener, if any, as a failure * @param instrumentInfo optional description of the instrument's role, intended for debugging. * @return a new instrument, ready for attachment at a probe */ - public static Instrument create(AdvancedInstrumentResultListener resultListener, AdvancedInstrumentRootFactory rootFactory, String instrumentInfo) { - return new AdvancedInstrument(resultListener, rootFactory, instrumentInfo); + public static Instrument create(AdvancedInstrumentResultListener resultListener, AdvancedInstrumentRootFactory rootFactory, Class requiredResultType, String instrumentInfo) { + return new AdvancedInstrument(resultListener, rootFactory, requiredResultType, instrumentInfo); } // TODO (mlvdv) experimental @@ -383,16 +385,14 @@ private static final class AdvancedInstrument extends Instrument { private final AdvancedInstrumentResultListener resultListener; - /** - * Client-provided supplier of new node instances to attach. - */ private final AdvancedInstrumentRootFactory rootFactory; + private final Class requiredResultType; - private AdvancedInstrument(AdvancedInstrumentResultListener resultListener, AdvancedInstrumentRootFactory rootFactory, String instrumentInfo) { + private AdvancedInstrument(AdvancedInstrumentResultListener resultListener, AdvancedInstrumentRootFactory rootFactory, Class requiredResultType, String instrumentInfo) { super(instrumentInfo); this.resultListener = resultListener; this.rootFactory = rootFactory; - + this.requiredResultType = requiredResultType; } @Override @@ -448,6 +448,7 @@ try { final Object result = instrumentRoot.executeRoot(node, vFrame); if (resultListener != null) { + checkResultType(result); resultListener.notifyResult(node, vFrame, result); } } catch (RuntimeException ex) { @@ -461,6 +462,15 @@ } } + private void checkResultType(Object result) { + if (requiredResultType == null) { + return; + } + if (result == null || !(requiredResultType.isAssignableFrom(result.getClass()))) { + throw new RuntimeException("Instrument result " + result.toString() + " not assignable to " + requiredResultType.getSimpleName()); + } + } + public void returnVoid(Node node, VirtualFrame vFrame) { if (nextInstrumentNode != null) { nextInstrumentNode.returnVoid(node, vFrame);