In rts/Printer.c, print exact UPDATE_FRAME type
authorArash Rouhani <rarash@student.chalmers.se>
Thu, 26 Dec 2013 13:57:35 +0000 (14:57 +0100)
committerAustin Seipp <austin@well-typed.com>
Wed, 15 Jan 2014 16:36:59 +0000 (10:36 -0600)
When printing an update frame in printClosure(), it will not print
the unspecific UPDATE_FRAME, instead it prints BH_UPDATE_FRAME,
NORMAL_UPDATE_FRAME or MARKED_UPDATE_FRAME.

Signed-off-by: Austin Seipp <austin@well-typed.com>
rts/Printer.c
rts/Printer.h

index db2e7be..ca9ca49 100644 (file)
@@ -263,7 +263,7 @@ printClosure( StgClosure *obj )
     case UPDATE_FRAME:
         {
             StgUpdateFrame* u = (StgUpdateFrame*)obj;
-            debugBelch("UPDATE_FRAME(");
+            debugBelch("%s(", info_update_frame(obj));
             printPtr((StgPtr)GET_INFO((StgClosure *)u));
             debugBelch(",");
             printPtr((StgPtr)u->updatee);
@@ -389,6 +389,24 @@ printClosure( StgClosure *obj )
     }
 }
 
+// If you know you have an UPDATE_FRAME, but want to know exactly which.
+char *info_update_frame(StgClosure *closure) {
+    // Note: We intentionally don't take the info table pointer as
+    // an argument. As it will be confusing whether one should pass
+    // it pointing to the code or struct members when compiling with
+    // TABLES_NEXT_TO_CODE.
+    const StgInfoTable *info = closure->header.info;
+    if (info == &stg_upd_frame_info) {
+        return "NORMAL_UPDATE_FRAME";
+    } else if (info == &stg_bh_upd_frame_info) {
+        return "BH_UPDATE_FRAME";
+    } else if (info == &stg_marked_upd_frame_info) {
+        return "MARKED_UPDATE_FRAME";
+    } else {
+        return "ERROR: Not an update frame!!!";
+    }
+}
+
 /*
 void printGraph( StgClosure *obj )
 {
index 7b51ce5..0dae896 100644 (file)
@@ -19,6 +19,7 @@ extern char *      closure_type_names[];
 void                      info_hdr_type   ( StgClosure *closure, char *res );
 char  *                   info_type       ( StgClosure *closure );
 char  *                   info_type_by_ip ( StgInfoTable *ip );
+char  *            info_update_frame ( StgClosure *closure );
 
 #ifdef DEBUG
 extern void        prettyPrintClosure (StgClosure *obj);