From d8f9c1d890c3091e7331feb608013a1af55fa9d0 Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Thu, 16 Apr 2015 17:43:55 +0200
Subject: [PATCH] slight change to Utils.createStackTrace formatting

---
 .../com/oracle/truffle/r/runtime/Utils.java   | 38 +++++++++++--------
 1 file changed, 23 insertions(+), 15 deletions(-)

diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java
index d04d1e9ea8..7a73ae2d2b 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java
@@ -276,17 +276,27 @@ public final class Utils {
      */
     @TruffleBoundary
     public static String createStackTrace(boolean printFrameSlots) {
-        StringBuilder str = new StringBuilder();
-
         FrameInstance current = Truffle.getRuntime().getCurrentFrame();
-        dumpFrame(str, current.getCallTarget(), current.getFrame(FrameAccess.READ_ONLY, true), printFrameSlots, current.isVirtualFrame());
-
-        Truffle.getRuntime().iterateFrames(frameInstance -> {
-            dumpFrame(str, frameInstance.getCallTarget(), frameInstance.getFrame(FrameAccess.READ_ONLY, true), printFrameSlots, frameInstance.isVirtualFrame());
-            return null;
-        });
-        str.append("\n");
-        return str.toString();
+        if (current == null) {
+            return "no R stack trace available\n";
+        } else {
+            StringBuilder str = new StringBuilder();
+            dumpFrame(str, current.getCallTarget(), current.getFrame(FrameAccess.READ_ONLY, true), false, current.isVirtualFrame());
+            Truffle.getRuntime().iterateFrames(frameInstance -> {
+                dumpFrame(str, frameInstance.getCallTarget(), frameInstance.getFrame(FrameAccess.READ_ONLY, true), false, frameInstance.isVirtualFrame());
+                return null;
+            });
+            if (printFrameSlots) {
+                str.append("\n\nwith frame slot contents:\n");
+                dumpFrame(str, current.getCallTarget(), current.getFrame(FrameAccess.READ_ONLY, true), true, current.isVirtualFrame());
+                Truffle.getRuntime().iterateFrames(frameInstance -> {
+                    dumpFrame(str, frameInstance.getCallTarget(), frameInstance.getFrame(FrameAccess.READ_ONLY, true), true, frameInstance.isVirtualFrame());
+                    return null;
+                });
+            }
+            str.append("\n");
+            return str.toString();
+        }
     }
 
     private static void dumpFrame(StringBuilder str, CallTarget callTarget, Frame frame, boolean printFrameSlots, boolean isVirtual) {
@@ -295,15 +305,13 @@ public final class Utils {
         }
         SourceSection callSrc = RArguments.getCallSourceSection(frame);
         str.append("Frame: ").append(callTarget).append(isVirtual ? " (virtual)" : "");
-        if (callSrc == null) {
-            str.append("\n  <no call info>");
-        } else {
-            str.append("\n  called as: ").append(callSrc.getCode());
+        if (callSrc != null) {
+            str.append(" (called as: ").append(callSrc.getCode()).append(')');
         }
         if (printFrameSlots) {
             FrameDescriptor frameDescriptor = frame.getFrameDescriptor();
             for (FrameSlot s : frameDescriptor.getSlots()) {
-                str.append("\n  ").append(s.getIdentifier()).append("=").append(frame.getValue(s));
+                str.append("\n      ").append(s.getIdentifier()).append(" = ").append(frame.getValue(s));
             }
         }
     }
-- 
GitLab