PR guile/17177
authorDoug Evans <xdje42@gmail.com>
Sat, 26 Jul 2014 21:58:58 +0000 (14:58 -0700)
committerDoug Evans <xdje42@gmail.com>
Sat, 26 Jul 2014 21:58:58 +0000 (14:58 -0700)
* guile/lib/gdb.scm (pretty-printers): Export.
(set-pretty-printers!): Export.
* guile/lib/gdb/printing.scm (gdb module): Update.
(prepend-pretty-printer!, append-pretty-printer!): Update.
* guile/scm-pretty-print.c (pretty_printer_list_name): Delete.
(pretty_printer_list_var): Delete.
(pretty_printer_list): New static global.
(gdbscm_pretty_printers): New function.
(gdbscm_set_pretty_printers_x): New function.
(ppscm_find_pretty_printer_from_gdb): Update.
(pretty_printer_functions): Add pretty-printers, set-pretty-printers!.
(gdbscm_initialize_pretty_printers): Update.

doc/
* guile.texi (Guile Pretty Printing API): Fix typo.
Document set-pretty-printers!, pretty-printers.
(Selecting Guile Pretty-Printers): Update.
Mention program-space based pretty-printers.

gdb/ChangeLog
gdb/doc/ChangeLog
gdb/doc/guile.texi
gdb/guile/lib/gdb.scm
gdb/guile/lib/gdb/printing.scm
gdb/guile/scm-pretty-print.c

index c5ebd2a37125f72751f2824709d18da6085fe7a8..3243afd3587f579e2ba639ee1d76511bc71ce683 100644 (file)
@@ -1,3 +1,19 @@
+2014-07-26  Doug Evans  <xdje42@gmail.com>
+
+       PR guile/17177
+       * guile/lib/gdb.scm (pretty-printers): Export.
+       (set-pretty-printers!): Export.
+       * guile/lib/gdb/printing.scm (gdb module): Update.
+       (prepend-pretty-printer!, append-pretty-printer!): Update.
+       * guile/scm-pretty-print.c (pretty_printer_list_name): Delete.
+       (pretty_printer_list_var): Delete.
+       (pretty_printer_list): New static global.
+       (gdbscm_pretty_printers): New function.
+       (gdbscm_set_pretty_printers_x): New function.
+       (ppscm_find_pretty_printer_from_gdb): Update.
+       (pretty_printer_functions): Add pretty-printers, set-pretty-printers!.
+       (gdbscm_initialize_pretty_printers): Update.
+
 2014-07-26  Doug Evans  <xdje42@gmail.com>
 
        PR 17185
index 41de328272105c5bc6f1087e61fd21c92ef064f5..0bfddd7b970fd5a52229de34293f86417ac03a1a 100644 (file)
@@ -1,3 +1,11 @@
+2014-07-26  Doug Evans  <xdje42@gmail.com>
+
+       PR guile/17177
+       * guile.texi (Guile Pretty Printing API): Fix typo.
+       Document set-pretty-printers!, pretty-printers.
+       (Selecting Guile Pretty-Printers): Update.
+       Mention program-space based pretty-printers.
+
 2014-07-25  Pedro Alves  <palves@redhat.com>
            Eli Zaretskii  <eliz@gnu.org>
 
index 4aaba8a21e32b068e2ba0bd3b6e0ff6fe9069ac7..a6ce2da1d073a8637e3aa57ac6f523051575e4fa 100644 (file)
@@ -1377,7 +1377,16 @@ Otherwise return @code{#f}.
 
 @deffn {Scheme Procedure} set-pretty-printer-enabled! pretty-printer flag
 Set the enabled flag of @var{pretty-printer} to @var{flag}.
-The value returned in unspecified.
+The value returned is unspecified.
+@end deffn
+
+@deffn {Scheme Procedure} pretty-printers
+Return the list of global pretty-printers.
+@end deffn
+
+@deffn {Scheme Procedure} set-pretty-printers! pretty-printers
+Set the list of global pretty-printers to @var{pretty-printers}.
+The value returned is unspecified.
 @end deffn
 
 @deffn {Scheme Procedure} make-pretty-printer-worker display-hint to-string children
@@ -1476,27 +1485,36 @@ printer exists, then this returns @code{#f}.
 @subsubsection Selecting Guile Pretty-Printers
 @cindex selecting guile pretty-printers
 
-The Guile list @code{*pretty-printers*} contains a set of
-@code{<gdb:pretty-printer>} registered objects.
-Printers in this list are called @code{global}
-printers, they're available when debugging any inferior.
-In addition to this, each @code{<gdb:objfile>} object contains its
-own set of pretty-printers (@pxref{Objfiles In Guile}).
+There are three sets of pretty-printers that @value{GDBN} searches:
+
+@itemize @bullet
+@item
+Per-objfile list of pretty-printers (@pxref{Objfiles In Guile}).
+@item
+Per-progspace list of pretty-printers (@pxref{Progspaces In Guile}).
+@item
+The global list of pretty-printers (@pxref{Guile Pretty Printing API}).
+These printers are available when debugging any inferior.
+@end itemize
 
 Pretty-printer lookup is done by passing the value to be printed to the
 lookup function of each enabled object in turn.
 Lookup stops when a lookup function returns a non-@code{#f} value
 or when the list is exhausted.
+Lookup functions must return either a @code{<gdb:pretty-printer-worker>}
+object or @code{#f}.  Otherwise an exception is thrown.
 
 @value{GDBN} first checks the result of @code{objfile-pretty-printers}
 of each @code{<gdb:objfile>} in the current program space and iteratively
 calls each enabled lookup function in the list for that @code{<gdb:objfile>}
 until a non-@code{#f} object is returned.
-Lookup functions must return either a @code{<gdb:pretty-printer-worker>}
-object or @code{#f}.  Otherwise an exception is thrown.
 If no pretty-printer is found in the objfile lists, @value{GDBN} then
-searches the global pretty-printer list, calling each enabled function
-until a non-@code{#f} object is returned.
+searches the result of @code{progspace-pretty-printers} of the current
+program space, calling each enabled function until a non-@code{#f} object
+is returned.
+After these lists have been exhausted, it tries the global pretty-printers
+list, obtained with @code{pretty-printers}, again calling each enabled
+function until a non-@code{#f} object is returned.
 
 The order in which the objfiles are searched is not specified.  For a
 given list, functions are always invoked from the head of the list,
index 120fcc6ac82c7d1df2f03a6b0c5dfccb8122a90e..4fd4699b9399be55c990e3449f87318447a00c3c 100644 (file)
  set-pretty-printer-enabled!
  make-pretty-printer-worker
  pretty-printer-worker?
+ pretty-printers
+ set-pretty-printers!
 
  ;; scm-progspace.c
 
index eac94178cbdbb38ee6c36e3d4e2b0ec4831bc5b7..2d1274f984dd5c83b683f1684475245101e63898 100644 (file)
@@ -19,7 +19,8 @@
 
 (define-module (gdb printing)
   #:use-module ((gdb) #:select
-               (*pretty-printers* pretty-printer? objfile? progspace?
+               (pretty-printer? objfile? progspace?
+                pretty-printers set-pretty-printers!
                 objfile-pretty-printers set-objfile-pretty-printers!
                 progspace-pretty-printers set-progspace-pretty-printers!))
   #:use-module (gdb init))
@@ -30,7 +31,7 @@ If OBJ is #f, add MATCHER to the global list."
   (%assert-type (pretty-printer? matcher) matcher SCM_ARG1
                'prepend-pretty-printer!)
   (cond ((eq? obj #f)
-        (set! *pretty-printers* (cons matcher *pretty-printers*)))
+        (set-pretty-printers! (cons matcher (pretty-printers))))
        ((objfile? obj)
         (set-objfile-pretty-printers!
          obj (cons matcher (objfile-pretty-printers obj))))
@@ -46,7 +47,7 @@ If OBJ is #f, add MATCHER to the global list."
   (%assert-type (pretty-printer? matcher) matcher SCM_ARG1
                'append-pretty-printer!)
   (cond ((eq? obj #f)
-        (set! *pretty-printers* (append! *pretty-printers* (list matcher))))
+        (set-pretty-printers! (append! (pretty-printers) (list matcher))))
        ((objfile? obj)
         (set-objfile-pretty-printers!
          obj (append! (objfile-pretty-printers obj) (list matcher))))
index e20da68027cf8975f14c98897fd63b78bb39791b..79b9e64339a8a2cf63816c74ee22ebe841fd250d 100644 (file)
@@ -111,11 +111,8 @@ static const char pretty_printer_worker_smob_name[] =
 static scm_t_bits pretty_printer_smob_tag;
 static scm_t_bits pretty_printer_worker_smob_tag;
 
-/* Global list of pretty-printers.  */
-static const char pretty_printer_list_name[] = "*pretty-printers*";
-
-/* The *pretty-printer* variable.  */
-static SCM pretty_printer_list_var;
+/* The global pretty-printer list.  */
+static SCM pretty_printer_list;
 
 /* gdb:pp-type-error.  */
 static SCM pp_type_error_symbol;
@@ -239,6 +236,29 @@ gdbscm_set_pretty_printer_enabled_x (SCM self, SCM enabled)
 
   return SCM_UNSPECIFIED;
 }
+
+/* (pretty-printers) -> list
+   Returns the list of global pretty-printers.  */
+
+static SCM
+gdbscm_pretty_printers (void)
+{
+  return pretty_printer_list;
+}
+
+/* (set-pretty-printers! list) -> unspecified
+   Set the global pretty-printers list.  */
+
+static SCM
+gdbscm_set_pretty_printers_x (SCM printers)
+{
+  SCM_ASSERT_TYPE (gdbscm_is_true (scm_list_p (printers)), printers,
+                  SCM_ARG1, FUNC_NAME, _("list"));
+
+  pretty_printer_list = printers;
+
+  return SCM_UNSPECIFIED;
+}
 \f
 /* Administrivia for pretty-printer-worker smobs.
    These are created when a matcher recognizes a value.  */
@@ -457,11 +477,8 @@ ppscm_find_pretty_printer_from_progspace (SCM value)
 static SCM
 ppscm_find_pretty_printer_from_gdb (SCM value)
 {
-  SCM pp_list, pp;
+  SCM pp = ppscm_search_pp_list (pretty_printer_list, value);
 
-  /* Fetch the global pretty printer list.  */
-  pp_list = scm_variable_ref (pretty_printer_list_var);
-  pp = ppscm_search_pp_list (pp_list, value);
   return pp;
 }
 
@@ -1074,6 +1091,15 @@ Create a <gdb:pretty-printer-worker> object.\n\
     "\
 Return #t if the object is a <gdb:pretty-printer-worker> object." },
 
+  { "pretty-printers", 0, 0, 0, gdbscm_pretty_printers,
+    "\
+Return the list of global pretty-printers." },
+
+  { "set-pretty-printers!", 1, 0, 0,
+    gdbscm_set_pretty_printers_x,
+    "\
+Set the list of global pretty-printers." },
+
   END_FUNCTIONS
 };
 
@@ -1094,12 +1120,7 @@ gdbscm_initialize_pretty_printers (void)
 
   gdbscm_define_functions (pretty_printer_functions, 1);
 
-  scm_c_define (pretty_printer_list_name, SCM_EOL);
-
-  pretty_printer_list_var
-    = scm_c_private_variable (gdbscm_module_name,
-                             pretty_printer_list_name);
-  gdb_assert (!gdbscm_is_false (pretty_printer_list_var));
+  pretty_printer_list = SCM_EOL;
 
   pp_type_error_symbol = scm_from_latin1_symbol ("gdb:pp-type-error");