diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RNode.java index 588c398aeb00f004e2f9433f5b9035f78e6b9ed5..059e6dade7bae4a05f0b7f2de061d2b525185d39 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ package com.oracle.truffle.r.nodes; import com.oracle.truffle.api.CompilerDirectives.*; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.frame.*; +import com.oracle.truffle.api.instrument.ProbeNode.*; import com.oracle.truffle.r.nodes.instrument.CreateWrapper; import com.oracle.truffle.api.nodes.*; import com.oracle.truffle.r.nodes.instrument.*; @@ -201,4 +202,14 @@ public abstract class RNode extends Node implements RSyntaxNode, RInstrumentable public static boolean areSameLength(RAbstractContainer a, RAbstractContainer b) { return a.getLength() == b.getLength(); } + + @Override + public WrapperNode createWrapperNode() { + return new RNodeWrapper(this); + } + + @Override + public boolean isInstrumentable() { + return true; + } } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadArgumentNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadArgumentNode.java index 95cf435633a04ac2621477be1deb1bcb259dc1c4..c0f2262b1e743cc3f7feb5d3c13fb0d4b9f4254b 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadArgumentNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadArgumentNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,7 @@ public class ReadArgumentNode extends RNode { } @Override - public ProbeNode.WrapperNode createWrapperNode(RNode node) { - return new ReadArgumentNodeWrapper((ReadArgumentNode) node); + public ProbeNode.WrapperNode createWrapperNode() { + return new ReadArgumentNodeWrapper(this); } } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/WriteVariableNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/WriteVariableNode.java index 27fbd0cb6c8a3a00fc516344e860b82e8ae675eb..926a39b75c1caff9736e872fbe26918d356cc519 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/WriteVariableNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/WriteVariableNode.java @@ -503,8 +503,8 @@ public abstract class WriteVariableNode extends RNode implements VisibilityContr } @Override - public ProbeNode.WrapperNode createWrapperNode(RNode child) { - return new WriteVariableNodeWrapper((WriteVariableNode) child); + public ProbeNode.WrapperNode createWrapperNode() { + return new WriteVariableNodeWrapper(this); } } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java index 60bcb0b85ff91c61a58a312fc12c9a2d50a1a4c4..712c2d7bf7ba134dc1e9cbe9f628790c166c9eed 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java @@ -373,8 +373,8 @@ public class CallArgumentsNode extends ArgumentsNode implements UnmatchedArgumen } @Override - public ProbeNode.WrapperNode createWrapperNode(RNode node) { - return new CallArgumentsNodeWrapper((CallArgumentsNode) node); + public ProbeNode.WrapperNode createWrapperNode() { + return new CallArgumentsNodeWrapper(this); } protected CallArgumentsNode() { diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/instrument/RASTProber.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/instrument/RASTProber.java index b3be87079ff836c3344863e838ffd585a41ebcd4..0d27cf268f1f8c30f64b5ab98560b130ab9d95d4 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/instrument/RASTProber.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/instrument/RASTProber.java @@ -62,27 +62,24 @@ public final class RASTProber implements NodeVisitor, ASTProber { @Override public boolean visit(Node node) { - if (node instanceof RInstrumentableNode) { - RInstrumentableNode iNode = (RInstrumentableNode) node; - if (iNode.isInstrumentable()) { - if (iNode instanceof RCallNode) { - iNode.probe().tagAs(CALL, RASTUtils.findFunctionName(node, false)); - } else if (iNode instanceof FunctionStatementsNode) { - iNode.probe().tagAs(START_METHOD, getFunctionDefinitionNode((Node) iNode).getUID()); - } else if (iNode instanceof FunctionBodyNode) { - iNode.probe().tagAs(RSyntaxTag.FUNCTION_BODY, getFunctionDefinitionNode((Node) iNode).getUID()); - } - if (iNode instanceof SequenceNode) { - RNode[] sequence = ((SequenceNode) iNode).getSequence(); - for (RNode n : sequence) { - boolean tag = false; - if (n.isSyntax()) { - n.probe().tagAs(STATEMENT, n); - tag = true; - } - if (FastROptions.debugMatches("RASTProber") && tag) { - System.out.printf("Tag %s as STATEMENT: %b%n", n.toString(), tag); - } + if (node.isInstrumentable()) { + if (node instanceof RCallNode) { + node.probe().tagAs(CALL, RASTUtils.findFunctionName(node, false)); + } else if (node instanceof FunctionStatementsNode) { + node.probe().tagAs(START_METHOD, getFunctionDefinitionNode((Node) node).getUID()); + } else if (node instanceof FunctionBodyNode) { + node.probe().tagAs(RSyntaxTag.FUNCTION_BODY, getFunctionDefinitionNode((Node) node).getUID()); + } + if (node instanceof SequenceNode) { + RNode[] sequence = ((SequenceNode) node).getSequence(); + for (RNode n : sequence) { + boolean tag = false; + if (n.isSyntax()) { + n.probe().tagAs(STATEMENT, n); + tag = true; + } + if (FastROptions.debugMatches("RASTProber") && tag) { + System.out.printf("Tag %s as STATEMENT: %b%n", n.toString(), tag); } } } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/instrument/RInstrumentableNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/instrument/RInstrumentableNode.java index 2929a2c618650addbd100a74d762457b61363ba7..7ccebd572f64a9679044775a6fecfc7938bb8c57 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/instrument/RInstrumentableNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/instrument/RInstrumentableNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,56 +22,15 @@ */ package com.oracle.truffle.r.nodes.instrument; -import com.oracle.truffle.api.instrument.*; -import com.oracle.truffle.api.instrument.ProbeNode.Instrumentable; import com.oracle.truffle.api.instrument.ProbeNode.WrapperNode; import com.oracle.truffle.api.nodes.*; import com.oracle.truffle.r.nodes.*; /** - * Denotes an {@link RNode} that can be instrumented using the {@link Instrumentable}. By default - * all {@link RNode} instances are instrumentable. + * Some additional support for instrumentable node. */ public interface RInstrumentableNode { - default boolean isInstrumentable() { - return true; - } - - default Probe probe() { - RNode thisNode = (RNode) this; - Node parent = thisNode.getParent(); - - if (parent == null) { - throw new IllegalStateException("Cannot call probe() on a node without a parent."); - } - - if (parent instanceof WrapperNode) { - return ((WrapperNode) parent).getProbe(); - } - - // Create a new wrapper/probe with this node as its child. - WrapperNode wrapper = createWrapperNode(thisNode); - - // Connect it to a Probe - Probe probe = ProbeNode.insertProbe(wrapper); - - // Replace this node in the AST with the wrapper - thisNode.replace((RNode) wrapper); - return probe; - - } - - /** - * Any AST nodes that are used as exactly typed fields of other nodes, i.e., not just - * {@link RNode} must override this method to create an explicit subclass that implements - * {@link WrapperNode} and forwards all pertinent behavior to {@code child}. The default - * implementation is suitable for all children typed as plain {@link RNode}. - */ - default WrapperNode createWrapperNode(RNode child) { - return new RNodeWrapper(child); - } - /** * Unwrap a (potentially) wrapped node, returning the child. Since an AST may contain wrapper * nodes <b>anywhere</b>, this method <b>must</b> be called before casting or checking the type diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/ConvertBooleanNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/ConvertBooleanNode.java index 0cd9f5282f735709397f13356e266106ecc59888..07d7a2b5de87ccc371015435da300fb1e2c2ca42 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/ConvertBooleanNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/ConvertBooleanNode.java @@ -157,7 +157,7 @@ public abstract class ConvertBooleanNode extends UnaryNode { } @Override - public WrapperNode createWrapperNode(RNode node) { - return new ConvertBooleanNodeWrapper((ConvertBooleanNode) node); + public WrapperNode createWrapperNode() { + return new ConvertBooleanNodeWrapper(this); } }