[doc,RFA] PR guile/17177: replace *pretty-printers*

Message ID yjt2lhrnoao4.fsf@ruffy.mtv.corp.google.com
State Committed
Headers

Commit Message

Doug Evans July 20, 2014, 11:47 p.m. UTC
  Hi.
This patch implements the fix for pr 17177.
Namely it replaces Guile global *pretty-printers*
with two functions: pretty-printers, set-pretty-printers!.

2014-07-19  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.

	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.
  

Comments

Eli Zaretskii July 21, 2014, 4 a.m. UTC | #1
> From: Doug Evans <dje@google.com>
> cc: ludo@gnu.org
> Date: Sun, 20 Jul 2014 16:47:07 -0700
> 
> This patch implements the fix for pr 17177.
> Namely it replaces Guile global *pretty-printers*
> with two functions: pretty-printers, set-pretty-printers!.

OK for the documentation parts.

Thanks.
  
Ludovic Courtès July 21, 2014, 2:12 p.m. UTC | #2
Doug Evans <dje@google.com> skribis:

> Namely it replaces Guile global *pretty-printers*
> with two functions: pretty-printers, set-pretty-printers!.

Looks good to me.

‘pretty-printers’ could maybe eventually be made a SRFI-39 parameter
(info "(guile) Parameters"), which would be backward compatible in terms
of API.  That would allow for dynamically scoped changes to the pretty
printers, which might be useful in some cases.

Thanks,
Ludo’.
  
Doug Evans July 27, 2014, 4:23 a.m. UTC | #3
ludo@gnu.org (Ludovic Courtès) writes:
> Doug Evans <dje@google.com> skribis:
>
>> Namely it replaces Guile global *pretty-printers*
>> with two functions: pretty-printers, set-pretty-printers!.
>
> Looks good to me.
>
> ‘pretty-printers’ could maybe eventually be made a SRFI-39 parameter
> (info "(guile) Parameters"), which would be backward compatible in terms
> of API.  That would allow for dynamically scoped changes to the pretty
> printers, which might be useful in some cases.
>
> Thanks,
> Ludo’.

Committed to trunk and 7.8 branch.
  

Patch

diff --git a/gdb/doc/guile.texi b/gdb/doc/guile.texi
index 4aaba8a..a6ce2da 100644
--- a/gdb/doc/guile.texi
+++ b/gdb/doc/guile.texi
@@ -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,
diff --git a/gdb/guile/lib/gdb.scm b/gdb/guile/lib/gdb.scm
index 120fcc6..4fd4699 100644
--- a/gdb/guile/lib/gdb.scm
+++ b/gdb/guile/lib/gdb.scm
@@ -319,6 +319,8 @@ 
  set-pretty-printer-enabled!
  make-pretty-printer-worker
  pretty-printer-worker?
+ pretty-printers
+ set-pretty-printers!
 
  ;; scm-progspace.c
 
diff --git a/gdb/guile/lib/gdb/printing.scm b/gdb/guile/lib/gdb/printing.scm
index eac9417..2d1274f 100644
--- a/gdb/guile/lib/gdb/printing.scm
+++ b/gdb/guile/lib/gdb/printing.scm
@@ -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))))
diff --git a/gdb/guile/scm-pretty-print.c b/gdb/guile/scm-pretty-print.c
index e20da68..79b9e64 100644
--- a/gdb/guile/scm-pretty-print.c
+++ b/gdb/guile/scm-pretty-print.c
@@ -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;
+}
 
 /* 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");