# HG changeset patch # User Michael Van De Vanter # Date 1442978758 25200 # Node ID f78c72e2e0b6f4737caf5c95d44a03a785c60994 # Parent e7e3826801d66705f01e85a4d14952dd18255f90 Truffle/Instrumentation: clean up, better encapsulate how the application of ASTProbers is managed - Guest Language RootNode implementations no longer involved - ASTProbers are now applied only to RootNodes - Methods renamed to clarify flow of control - Allowed removal of one Accessor instance - Remove tracing overhead when there are no ASTProbers registered diff -r e7e3826801d6 -r f78c72e2e0b6 truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/SymbolInvokerImpl.java --- a/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/SymbolInvokerImpl.java Tue Sep 22 15:10:25 2015 -0700 +++ b/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/SymbolInvokerImpl.java Tue Sep 22 20:25:58 2015 -0700 @@ -83,11 +83,6 @@ Object tmp = ForeignAccess.execute(foreignAccess, frame, function, args); return convert.convert(frame, tmp); } - - @Override - public void applyInstrumentation() { - SymbolInvokerImpl.ACCESSOR_INTEROP.applyInstrumentation(foreignAccess); - } } private static final class ConvertNode extends Node { @@ -131,14 +126,4 @@ return obj; } } - - static final class AccessorInterop extends Accessor { - - @Override - protected void applyInstrumentation(Node node) { - super.applyInstrumentation(node); - } - } - - static final AccessorInterop ACCESSOR_INTEROP = new AccessorInterop(); } diff -r e7e3826801d6 -r f78c72e2e0b6 truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java --- a/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java Tue Sep 22 15:10:25 2015 -0700 +++ b/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java Tue Sep 22 20:25:58 2015 -0700 @@ -960,5 +960,6 @@ TruffleVM vm = (TruffleVM) obj; vm.dispatch(event); } + } // end of SPIAccessor } diff -r e7e3826801d6 -r f78c72e2e0b6 truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java --- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java Tue Sep 22 15:10:25 2015 -0700 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java Tue Sep 22 20:25:58 2015 -0700 @@ -59,7 +59,6 @@ private static Accessor API; private static Accessor SPI; private static Accessor NODES; - private static Accessor INTEROP; private static Accessor INSTRUMENT; private static Accessor DEBUG; private static final ThreadLocal CURRENT_VM = new ThreadLocal<>(); @@ -162,11 +161,6 @@ throw new IllegalStateException(); } NODES = this; - } else if (this.getClass().getSimpleName().endsWith("Interop")) { - if (INTEROP != null) { - throw new IllegalStateException(); - } - INTEROP = this; } else if (this.getClass().getSimpleName().endsWith("Instrument")) { if (INSTRUMENT != null) { throw new IllegalStateException(); @@ -268,7 +262,7 @@ if (known == null) { vm = CURRENT_VM.get(); if (vm == null) { - throw new IllegalStateException(); + throw new IllegalStateException("Accessor.findLanguage access to vm"); } if (languageClass == null) { return null; @@ -284,7 +278,7 @@ if (known == null) { vm = CURRENT_VM.get(); if (vm == null) { - throw new IllegalStateException(); + throw new IllegalStateException("Accessor.findLanguageImpl access to vm"); } } else { vm = known; @@ -297,7 +291,7 @@ if (known == null) { vm = CURRENT_VM.get(); if (vm == null) { - throw new IllegalStateException(); + throw new IllegalStateException("Accessor.getInstrumenter access to vm"); } } else { vm = known; @@ -367,7 +361,8 @@ return API.findLanguage(env); } - protected void applyInstrumentation(Node node) { - INSTRUMENT.applyInstrumentation(node); + /** Applies all registered {@linkplain ASTProber probers} to the AST. */ + protected void probeAST(RootNode rootNode) { + INSTRUMENT.probeAST(rootNode); } } diff -r e7e3826801d6 -r f78c72e2e0b6 truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/Instrumenter.java --- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/Instrumenter.java Tue Sep 22 15:10:25 2015 -0700 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/instrument/Instrumenter.java Tue Sep 22 20:25:58 2015 -0700 @@ -563,29 +563,31 @@ * Enables instrumentation in a newly created AST by applying all registered instances of * {@link ASTProber}. */ - private void applyInstrumentation(Node node) { + private void probeAST(RootNode rootNode) { + if (!astProbers.isEmpty()) { - String name = ""; - final Source source = findSource(node); - if (source != null) { - name = source.getShortName(); - } else { - final SourceSection sourceSection = node.getEncapsulatingSourceSection(); - if (sourceSection != null) { - name = sourceSection.getShortDescription(); + String name = ""; + final Source source = findSource(rootNode); + if (source != null) { + name = source.getShortName(); + } else { + final SourceSection sourceSection = rootNode.getEncapsulatingSourceSection(); + if (sourceSection != null) { + name = sourceSection.getShortDescription(); + } } + trace("START %s", name); + for (ProbeListener listener : probeListeners) { + listener.startASTProbing(source); + } + for (ASTProber prober : astProbers) { + prober.probeAST(this, rootNode); // TODO (mlvdv) + } + for (ProbeListener listener : probeListeners) { + listener.endASTProbing(source); + } + trace("FINISHED %s", name); } - trace("START %s", name); - for (ProbeListener listener : probeListeners) { - listener.startASTProbing(source); - } - for (ASTProber prober : astProbers) { - prober.probeAST(this, node); // TODO (mlvdv) - } - for (ProbeListener listener : probeListeners) { - listener.endASTProbing(source); - } - trace("FINISHED %s", name); } static final class AccessorInstrument extends Accessor { @@ -618,11 +620,15 @@ } @Override - protected void applyInstrumentation(Node node) { - super.getInstrumenter(null).applyInstrumentation(node); + protected void probeAST(RootNode rootNode) { + // Normally null vm argument; can be reflectively set for testing + super.getInstrumenter(testVM).probeAST(rootNode); } } static final AccessorInstrument ACCESSOR = new AccessorInstrument(); + // Normally null; set for testing where the Accessor hasn't been fully initialized + private static Object testVM = null; + } diff -r e7e3826801d6 -r f78c72e2e0b6 truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java --- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java Tue Sep 22 15:10:25 2015 -0700 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java Tue Sep 22 20:25:58 2015 -0700 @@ -41,7 +41,6 @@ import com.oracle.truffle.api.TruffleLanguage; import com.oracle.truffle.api.TruffleOptions; import com.oracle.truffle.api.impl.Accessor; -import com.oracle.truffle.api.instrument.WrapperNode; import com.oracle.truffle.api.source.SourceSection; import com.oracle.truffle.api.utilities.JSONHelper; @@ -492,8 +491,9 @@ return ""; } - protected final void applyInstrumentation(Node node) { - ACCESSOR.applyInstrumentation(node); + @SuppressWarnings("static-method") + protected final void probeAST(RootNode rootNode) { + ACCESSOR.probeAST(rootNode); } private static final Object GIL = new Object(); @@ -527,8 +527,8 @@ } @Override - protected void applyInstrumentation(Node node) { - super.applyInstrumentation(node); + protected void probeAST(RootNode rootNode) { + super.probeAST(rootNode); } } diff -r e7e3826801d6 -r f78c72e2e0b6 truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/RootNode.java --- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/RootNode.java Tue Sep 22 15:10:25 2015 -0700 +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/RootNode.java Tue Sep 22 20:25:58 2015 -0700 @@ -35,7 +35,6 @@ import com.oracle.truffle.api.frame.FrameInstance; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.impl.DefaultCompilerOptions; -import com.oracle.truffle.api.instrument.ASTProber; import com.oracle.truffle.api.source.SourceSection; /** @@ -161,7 +160,7 @@ * stack) without prior knowledge of the language it has come from. * * Used for instance to determine the language of a RootNode: - * + * *
      * 
      * rootNode.getExecutionContext().getLanguageShortName();
@@ -186,26 +185,13 @@
         }
     }
 
-    /**
-     * Apply to the AST all instances of {@link ASTProber} specified for the language, if any, held
-     * by this root node. This can only be done once the AST is complete, notably once all parent
-     * pointers are correctly assigned. But it also must be done before any AST cloning or
-     * execution.
-     * 

- * If this is not done, then the AST will not be subject to debugging or any other - * instrumentation-supported tooling. - *

- * Implementations should ensure that instrumentation is never applied more than once to an AST, - * as this is not guaranteed to be error-free. - * - * @see TruffleLanguage - */ - public void applyInstrumentation() { + public final void applyInstrumentation() { + super.probeAST(this); } /** * Helper method to create a root node that always returns the same value. Certain operations - * (expecially {@link com.oracle.truffle.api.interop inter-operability} API) require return of + * (especially {@link com.oracle.truffle.api.interop inter-operability} API) require return of * stable {@link RootNode root nodes}. To simplify creation of such nodes, here is a factory * method that can create {@link RootNode} that returns always the same value. * diff -r e7e3826801d6 -r f78c72e2e0b6 truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLRootNode.java --- a/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLRootNode.java Tue Sep 22 15:10:25 2015 -0700 +++ b/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/SLRootNode.java Tue Sep 22 20:25:58 2015 -0700 @@ -88,21 +88,12 @@ this.isCloningAllowed = isCloningAllowed; } - public SLExpressionNode getBodyNode() { - return bodyNode; - } - @Override public boolean isCloningAllowed() { return isCloningAllowed; } @Override - public void applyInstrumentation() { - super.applyInstrumentation(bodyNode); - } - - @Override public String toString() { return "root " + name; }