changeset 19489:c99c7a4cda7d

Truffle/Instrumentation: a new test, to be adapted for checking deopt
author Michael Van De Vanter <michael.van.de.vanter@oracle.com>
date Wed, 18 Feb 2015 16:16:38 -0800
parents 2f676c3ca430
children 745ecef4c9cd
files graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/InstrumentationPartialEvaluationTest.java graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/nodes/RootTestNode.java
diffstat 2 files changed, 62 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/InstrumentationPartialEvaluationTest.java	Wed Feb 18 16:07:09 2015 -0800
+++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/InstrumentationPartialEvaluationTest.java	Wed Feb 18 16:16:38 2015 -0800
@@ -25,9 +25,11 @@
 import org.junit.*;
 
 import com.oracle.graal.truffle.test.nodes.*;
+import com.oracle.truffle.api.*;
 import com.oracle.truffle.api.frame.*;
 import com.oracle.truffle.api.instrument.*;
 import com.oracle.truffle.api.instrument.impl.*;
+import com.oracle.truffle.api.nodes.*;
 
 /**
  * Tests for a single simple PE test with various combinations of instrumentation attached. None of
@@ -129,4 +131,57 @@
         instrument2.dispose();
         assertPartialEvalEquals("constant42", root);
     }
+
+    @Test
+    public void instrumentDeopt() {
+        final FrameDescriptor fd = new FrameDescriptor();
+        final AbstractTestNode result = new ConstantTestNode(42);
+        final RootTestNode root = new RootTestNode(fd, "constantValue", result);
+        final Probe[] probe = new Probe[1];
+        final int[] count = {1};
+        count[0] = 0;
+        // Register a "prober" that will get applied when CallTarget gets created.
+        Probe.registerASTProber(new ASTProber() {
+
+            @Override
+            public void probeAST(Node node) {
+                node.accept(new NodeVisitor() {
+
+                    @Override
+                    public boolean visit(Node visitedNode) {
+                        if (visitedNode instanceof ConstantTestNode) {
+                            probe[0] = visitedNode.probe();
+                        }
+                        return true;
+                    }
+
+                });
+            }
+        });
+        final RootCallTarget callTarget = Truffle.getRuntime().createCallTarget(root);
+
+        // The CallTarget has one Probe, attached to the ConstantTestNode, ready to run
+        Assert.assertEquals(42, callTarget.call()); // Correct result
+        Assert.assertEquals(0, count[0]);           // Didn't count anything
+
+        // Add a counting instrument; this changes the "Probe state" and should cause a deopt
+        final Instrument countingInstrument = Instrument.create(new DefaultEventListener() {
+
+            @Override
+            public void enter(Node node, VirtualFrame frame) {
+                count[0] = count[0] + 1;
+            }
+        });
+        probe[0].attach(countingInstrument);
+
+        Assert.assertEquals(42, callTarget.call()); // Correct result
+        Assert.assertEquals(1, count[0]);           // Counted the first call
+
+        // Remove the counting instrument; this changes the "Probe state" and should cause a deopt
+        countingInstrument.dispose();
+
+        Assert.assertEquals(42, callTarget.call()); // Correct result
+        Assert.assertEquals(1, count[0]);           // Didn't count this time
+
+    }
 }
--- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/nodes/RootTestNode.java	Wed Feb 18 16:07:09 2015 -0800
+++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/nodes/RootTestNode.java	Wed Feb 18 16:16:38 2015 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 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
@@ -23,6 +23,7 @@
 package com.oracle.graal.truffle.test.nodes;
 
 import com.oracle.truffle.api.frame.*;
+import com.oracle.truffle.api.instrument.*;
 import com.oracle.truffle.api.nodes.*;
 
 @NodeInfo
@@ -43,6 +44,11 @@
     }
 
     @Override
+    public void applyInstrumentation() {
+        Probe.applyASTProbers(node);
+    }
+
+    @Override
     public String toString() {
         return name;
     }