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.
This commit is contained in:
Doug Evans 2014-07-26 14:58:58 -07:00
parent 74edf51613
commit ee7333ae06
6 changed files with 95 additions and 29 deletions

View 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

View 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>

View 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,

View File

@ -319,6 +319,8 @@
set-pretty-printer-enabled!
make-pretty-printer-worker
pretty-printer-worker?
pretty-printers
set-pretty-printers!
;; scm-progspace.c

View 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))))

View 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;
}
/* 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");