[doc,RFA] PR guile/17177: replace *pretty-printers*
Commit Message
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
> 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.
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’.
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.
@@ -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,
@@ -319,6 +319,8 @@
set-pretty-printer-enabled!
make-pretty-printer-worker
pretty-printer-worker?
+ pretty-printers
+ set-pretty-printers!
;; scm-progspace.c
@@ -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))))
@@ -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");