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> 2014-07-26 Doug Evans <xdje42@gmail.com>
PR 17185 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> 2014-07-25 Pedro Alves <palves@redhat.com>
Eli Zaretskii <eliz@gnu.org> 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 @deffn {Scheme Procedure} set-pretty-printer-enabled! pretty-printer flag
Set the enabled flag of @var{pretty-printer} to @var{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 @end deffn
@deffn {Scheme Procedure} make-pretty-printer-worker display-hint to-string children @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 @subsubsection Selecting Guile Pretty-Printers
@cindex selecting guile pretty-printers @cindex selecting guile pretty-printers
The Guile list @code{*pretty-printers*} contains a set of There are three sets of pretty-printers that @value{GDBN} searches:
@code{<gdb:pretty-printer>} registered objects.
Printers in this list are called @code{global} @itemize @bullet
printers, they're available when debugging any inferior. @item
In addition to this, each @code{<gdb:objfile>} object contains its Per-objfile list of pretty-printers (@pxref{Objfiles In Guile}).
own set 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 Pretty-printer lookup is done by passing the value to be printed to the
lookup function of each enabled object in turn. lookup function of each enabled object in turn.
Lookup stops when a lookup function returns a non-@code{#f} value Lookup stops when a lookup function returns a non-@code{#f} value
or when the list is exhausted. 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} @value{GDBN} first checks the result of @code{objfile-pretty-printers}
of each @code{<gdb:objfile>} in the current program space and iteratively 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>} calls each enabled lookup function in the list for that @code{<gdb:objfile>}
until a non-@code{#f} object is returned. 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 If no pretty-printer is found in the objfile lists, @value{GDBN} then
searches the global pretty-printer list, calling each enabled function searches the result of @code{progspace-pretty-printers} of the current
until a non-@code{#f} object is returned. 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 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, given list, functions are always invoked from the head of the list,

View File

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

View File

@ -19,7 +19,8 @@
(define-module (gdb printing) (define-module (gdb printing)
#:use-module ((gdb) #:select #: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! objfile-pretty-printers set-objfile-pretty-printers!
progspace-pretty-printers set-progspace-pretty-printers!)) progspace-pretty-printers set-progspace-pretty-printers!))
#:use-module (gdb init)) #: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 (%assert-type (pretty-printer? matcher) matcher SCM_ARG1
'prepend-pretty-printer!) 'prepend-pretty-printer!)
(cond ((eq? obj #f) (cond ((eq? obj #f)
(set! *pretty-printers* (cons matcher *pretty-printers*))) (set-pretty-printers! (cons matcher (pretty-printers))))
((objfile? obj) ((objfile? obj)
(set-objfile-pretty-printers! (set-objfile-pretty-printers!
obj (cons matcher (objfile-pretty-printers obj)))) 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 (%assert-type (pretty-printer? matcher) matcher SCM_ARG1
'append-pretty-printer!) 'append-pretty-printer!)
(cond ((eq? obj #f) (cond ((eq? obj #f)
(set! *pretty-printers* (append! *pretty-printers* (list matcher)))) (set-pretty-printers! (append! (pretty-printers) (list matcher))))
((objfile? obj) ((objfile? obj)
(set-objfile-pretty-printers! (set-objfile-pretty-printers!
obj (append! (objfile-pretty-printers obj) (list matcher)))) 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_smob_tag;
static scm_t_bits pretty_printer_worker_smob_tag; static scm_t_bits pretty_printer_worker_smob_tag;
/* Global list of pretty-printers. */ /* The global pretty-printer list. */
static const char pretty_printer_list_name[] = "*pretty-printers*"; static SCM pretty_printer_list;
/* The *pretty-printer* variable. */
static SCM pretty_printer_list_var;
/* gdb:pp-type-error. */ /* gdb:pp-type-error. */
static SCM pp_type_error_symbol; static SCM pp_type_error_symbol;
@ -239,6 +236,29 @@ gdbscm_set_pretty_printer_enabled_x (SCM self, SCM enabled)
return SCM_UNSPECIFIED; 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. /* Administrivia for pretty-printer-worker smobs.
These are created when a matcher recognizes a value. */ These are created when a matcher recognizes a value. */
@ -457,11 +477,8 @@ ppscm_find_pretty_printer_from_progspace (SCM value)
static SCM static SCM
ppscm_find_pretty_printer_from_gdb (SCM value) 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; 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." }, 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 END_FUNCTIONS
}; };
@ -1094,12 +1120,7 @@ gdbscm_initialize_pretty_printers (void)
gdbscm_define_functions (pretty_printer_functions, 1); gdbscm_define_functions (pretty_printer_functions, 1);
scm_c_define (pretty_printer_list_name, SCM_EOL); pretty_printer_list = 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));
pp_type_error_symbol = scm_from_latin1_symbol ("gdb:pp-type-error"); pp_type_error_symbol = scm_from_latin1_symbol ("gdb:pp-type-error");