[m-rev.] diff: ssdebug fixes

Peter Wang novalazy at gmail.com
Fri Jun 18 17:10:31 AEST 2010


Branches: main, 10.04

ssdb/ssdb.m:
        Replace io.{stdin,stdout}_stream in places where I meant
        io.{input,output}_stream.

        Fix quadratic behaviour in compress_stack_frames.

        When printing stack traces, ensure that the stack depth number
        and the number of duplicate frames have whitespace between them.

diff --git a/ssdb/ssdb.m b/ssdb/ssdb.m
index cd65b80..79621b8 100755
--- a/ssdb/ssdb.m
+++ b/ssdb/ssdb.m
@@ -2105,7 +2105,7 @@ execute_ssdb_list_2(ContextLines, Depth, !IO) :-
     ;
         FirstLine = int.max(0, MarkLine - ContextLines),
         LastLine = MarkLine + ContextLines,
-        io.stdout_stream(StdOut, !IO),
+        io.output_stream(StdOut, !IO),
         io.stderr_stream(StdErr, !IO),
         get_list_params(Params, !IO),
         ListPath = Params ^ list_path,
@@ -2626,9 +2626,11 @@ print_stack_trace(CurLevel, StarDepth, RemainingLines, !IO) :-
     ;
         CurLevel < StackDepth
     ->
-        stack_index(CurLevel, CurFrame, !IO),
-        compress_stack_frames(CurFrame, StackDepth, CurLevel, NextLevel, !IO),
-        SkippedFrames = NextLevel - CurLevel,
+        get_shadow_stack(Stack0, !IO),
+        list.det_drop(CurLevel, Stack0, Stack),
+        CurFrame = list.det_head(Stack),
+        compress_stack_frames(CurFrame, Stack, 0, SkippedFrames),
+        NextLevel = CurLevel + SkippedFrames,
         (
             StarDepth >= CurLevel,
             StarDepth < NextLevel
@@ -2638,26 +2640,25 @@ print_stack_trace(CurLevel, StarDepth, RemainingLines, !IO) :-
             Star = (' ')
         ),
         print_stack_frame(Star, CurLevel, CurFrame, SkippedFrames, !IO),
-        print_stack_trace(CurLevel + SkippedFrames, StarDepth,
-            RemainingLines - 1, !IO)
+        print_stack_trace(NextLevel, StarDepth, RemainingLines - 1, !IO)
     ;
         true
     ).
 
-:- pred compress_stack_frames(stack_frame::in, int::in, int::in, int::out,
-    io::di, io::uo) is det.
+:- pred compress_stack_frames(stack_frame::in, list(stack_frame)::in,
+    int::in, int::out) is det.
 
-compress_stack_frames(RefFrame, StackDepth, Level, NextLevel, !IO) :-
-    ( Level < StackDepth ->
-        stack_index(Level, Frame, !IO),
+compress_stack_frames(RefFrame, Stack, Count0, Count) :-
+    (
+        Stack = [],
+        Count = Count0
+    ;
+        Stack = [Frame | Frames],
         ( RefFrame ^ sf_proc_id = Frame ^ sf_proc_id ->
-            compress_stack_frames(RefFrame, StackDepth, Level + 1, NextLevel,
-                !IO)
+            compress_stack_frames(RefFrame, Frames, Count0 + 1, Count)
         ;
-            NextLevel = Level
+            Count = Count0
         )
-    ;
-        NextLevel = Level
     ).
 
 :- pred print_stack_frame(char::in, int::in, stack_frame::in, int::in,
@@ -2668,12 +2669,12 @@ print_stack_frame(Star, Level, Frame, SkippedFrames, !IO) :-
     Procedure = Frame ^ sf_proc_id ^ proc_name,
     SiteFile = Frame ^ sf_call_site_file,
     SiteLine = Frame ^ sf_call_site_line,
-    io.format("%c%4d", [c(Star), i(Level)], !IO),
+    io.format("%c%4d ", [c(Star), i(Level)], !IO),
     ( SkippedFrames > 1 ->
-        io.format("%5d*", [i(SkippedFrames)], !IO),
+        io.format("%4d*", [i(SkippedFrames)], !IO),
         Etc = " and others"
     ;
-        io.write_string("      ", !IO),
+        io.write_string("     ", !IO),
         Etc = ""
     ),
     io.format(" %s.%s (%s:%d%s)\n",
@@ -2769,7 +2770,7 @@ safe_write(MaybeFormat, CallerType, Prefix, T, !IO) :-
         print_browser_term(MaybeFormat, CallerType, plain_term(Univ), !IO)
     ;
         io.write_string(Prefix, !IO),
-        io.write_string("<>", !IO)
+        io.write_string("(unsafe)\n", !IO)
     ).
 
 :- pred safe_to_write(T::in) is semidet.
@@ -2795,7 +2796,7 @@ safe_to_write(_) :-
     browser_term::in, io::di, io::uo) is det.
 
 print_browser_term(MaybeFormat, CallerType, Term, !IO) :-
-    io.stdout_stream(StdOut, !IO),
+    io.output_stream(StdOut, !IO),
     get_browser_state(State, !IO),
     promise_equivalent_solutions [!:IO] (
         (
@@ -2851,8 +2852,8 @@ browse_var(ListVarValue, VarName, !IO) :-
 :- pred browse_term(browser_term::in, io::di, io::uo) is det.
 
 browse_term(Term, !IO) :-
-    io.stdin_stream(StdIn, !IO),
-    io.stdout_stream(StdOut, !IO),
+    io.input_stream(StdIn, !IO),
+    io.output_stream(StdOut, !IO),
     get_browser_state(State0, !IO),
     promise_equivalent_solutions [State, !:IO] (
         browse.browse_browser_term_no_modes(Term, StdIn, StdOut, _,

--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to:       mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions:          mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------



More information about the reviews mailing list