From 9b7ffe74c400756115f328409b9511ddd35ad5fa Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Wed, 22 Jun 2016 17:16:21 -0700
Subject: [PATCH] add FFI up-return tracing

---
 .../truffle/r/runtime/ffi/RFFIUtils.java      | 25 ++++++++++++++++---
 .../r/runtime/ffi/jnr/CallRFFIHelper.java     | 19 ++++++++------
 2 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/RFFIUtils.java b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/RFFIUtils.java
index 137427c09f..01dc849c60 100644
--- a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/RFFIUtils.java
+++ b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/RFFIUtils.java
@@ -74,20 +74,37 @@ public class RFFIUtils {
         }
     }
 
+    private enum CallMode {
+        UP("Up"),
+        UP_RETURN("UpReturn"),
+        DOWN("Down"),
+        DOWN_RETURN("DownReturn");
+
+        private final String printName;
+
+        CallMode(String printName) {
+            this.printName = printName;
+        }
+    }
+
     public static void traceUpCall(String name, Object... args) {
-        traceCall(false, name, args);
+        traceCall(CallMode.UP, name, args);
+    }
+
+    public static void traceUpCallReturn(String name, Object... args) {
+        traceCall(CallMode.UP_RETURN, name, args);
     }
 
     public static void traceDownCall(String name, Object... args) {
-        traceCall(true, name, args);
+        traceCall(CallMode.DOWN, name, args);
     }
 
-    private static void traceCall(boolean down, String name, Object... args) {
+    private static void traceCall(CallMode mode, String name, Object... args) {
         if (alwaysTrace || FastROptions.TraceNativeCalls.getBooleanValue()) {
             initialize();
             StringBuffer sb = new StringBuffer();
             sb.append("CallRFFI[");
-            sb.append(down ? "Down" : "Up");
+            sb.append(mode.printName);
             sb.append(']');
             sb.append(name);
             sb.append('(');
diff --git a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java
index 48954bea3b..8f52981874 100644
--- a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java
+++ b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java
@@ -327,24 +327,27 @@ public class CallRFFIHelper {
 
     public static RStringVector getClassHr(Object v) {
         RFFIUtils.traceUpCall("getClassHr", v);
+        RStringVector result;
         if (v instanceof RAttributable) {
-            return ((RAttributable) v).getClassHierarchy();
+            result = ((RAttributable) v).getClassHierarchy();
         } else if (v instanceof Byte) {
-            return RLogicalVector.implicitClassHeader;
+            result = RLogicalVector.implicitClassHeader;
         } else if (v instanceof String) {
-            return RStringVector.implicitClassHeader;
+            result = RStringVector.implicitClassHeader;
         } else if (v instanceof Integer) {
-            return RIntVector.implicitClassHeader;
+            result = RIntVector.implicitClassHeader;
         } else if (v instanceof Double) {
-            return RDoubleVector.implicitClassHeader;
+            result = RDoubleVector.implicitClassHeader;
         } else if (v instanceof RComplex) {
-            return RComplexVector.implicitClassHeader;
+            result = RComplexVector.implicitClassHeader;
         } else if (v instanceof RRaw) {
-            return RRawVector.implicitClassHeader;
+            result = RRawVector.implicitClassHeader;
         } else {
             guaranteeInstanceOf(v, RNull.class);
-            return RNull.implicitClassHeader;
+            result = RNull.implicitClassHeader;
         }
+        RFFIUtils.traceUpCallReturn("getClassHr", result);
+        return result;
     }
 
     public static int Rf_inherits(Object x, String clazz) {
-- 
GitLab