public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM] archer-pmuldoon-pretty-printers-lookup: Account for a Py_Incref(null) bug. Convert pretty-print testsuite.
@ 2009-02-09 14:17 pmuldoon
0 siblings, 0 replies; only message in thread
From: pmuldoon @ 2009-02-09 14:17 UTC (permalink / raw)
To: archer-commits
The branch, archer-pmuldoon-pretty-printers-lookup has been updated
via 1f68dc61fb7c0e20e96439e16ca08643a822fad1 (commit)
from 5e79d7e4f26c7cf2b7d4dd9a5ee41d8674e02c3d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email.
- Log -----------------------------------------------------------------
commit 1f68dc61fb7c0e20e96439e16ca08643a822fad1
Author: Phil Muldoon <pmuldoon@redhat.com>
Date: Mon Feb 9 14:15:30 2009 +0000
Account for a Py_Incref(null) bug. Convert pretty-print testsuite.
-----------------------------------------------------------------------
Summary of changes:
gdb/python/python.c | 17 +++---
gdb/testsuite/gdb.python/python-prettyprint.py | 65 +++++++++++++++++-------
2 files changed, 54 insertions(+), 28 deletions(-)
First 500 lines of diff:
diff --git a/gdb/python/python.c b/gdb/python/python.c
index 027526f..c5097b6 100644
--- a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -869,7 +869,7 @@ find_pretty_printer (struct value *value)
{
PyObject *pp_list = NULL;
- PyObject *function = NULL;
+ PyObject *function = Py_None;
struct objfile *obj;
/* Look at the pretty-printer dictionary for each objfile. */
@@ -1274,7 +1274,7 @@ apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
const struct value_print_options *options,
const struct language_defn *language)
{
- PyObject *func = NULL;
+ PyObject *printer = NULL;
struct value *value;
char *hint = NULL;
struct cleanup *cleanups;
@@ -1290,23 +1290,22 @@ apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
value = value_from_contents_and_address (type, valaddr, address);
/* Find the constructor. */
- func = find_pretty_printer (value);
- if (func == Py_None)
+ printer = find_pretty_printer (value);
+ if (printer == Py_None)
goto done;
/* If we are printing a map, we want some special formatting. */
- hint = gdbpy_get_display_hint (func);
+ hint = gdbpy_get_display_hint (printer);
make_cleanup (free_current_contents, &hint);
/* Print the section */
- print_string_repr (func, hint, stream, recurse, options, language);
- print_children (func, hint, stream, recurse, options, language);
- make_cleanup_py_decref (func);
+ print_string_repr (printer, hint, stream, recurse, options, language);
+ print_children (printer, hint, stream, recurse, options, language);
+ make_cleanup_py_decref (printer);
result = 1;
done:
- Py_DECREF(func);
do_cleanups (cleanups);
return result;
}
diff --git a/gdb/testsuite/gdb.python/python-prettyprint.py b/gdb/testsuite/gdb.python/python-prettyprint.py
index ecd4fc6..fcedb66 100644
--- a/gdb/testsuite/gdb.python/python-prettyprint.py
+++ b/gdb/testsuite/gdb.python/python-prettyprint.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2008 Free Software Foundation, Inc.
+# Copyright (C) 2008, 2009 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -16,6 +16,8 @@
# This file is part of the GDB testsuite. It tests python pretty
# printers.
+import re
+
# Test returning a Value from a printer.
class string_print:
def __init__(self, val):
@@ -76,21 +78,46 @@ class pp_sss:
def to_string(self):
return "a=<" + str(self.val['a']) + "> b=<" + str(self.val["b"]) + ">"
-gdb.pretty_printers['^struct s$'] = pp_s
-gdb.pretty_printers['^s$'] = pp_s
-gdb.pretty_printers['^S$'] = pp_s
-
-gdb.pretty_printers['^struct ss$'] = pp_ss
-gdb.pretty_printers['^ss$'] = pp_ss
-
-gdb.pretty_printers['^const S &$'] = pp_s
-gdb.pretty_printers['^SSS$'] = pp_sss
-
-# Note that we purposely omit the typedef names here.
-# Printer lookup is based on canonical name.
-# However, we do need both tagged and untagged variants, to handle
-# both the C and C++ cases.
-gdb.pretty_printers['^struct string_repr$'] = string_print
-gdb.pretty_printers['^struct container$'] = ContainerPrinter
-gdb.pretty_printers['^string_repr$'] = string_print
-gdb.pretty_printers['^container$'] = ContainerPrinter
+def lookup_function (val):
+ "Look-up and return a pretty-printer that can print val."
+ # Extract the type from the value.
+ typename = val.type ().tag ()
+
+ if (typename == None):
+ return None
+
+ # Iterate over local dictionary of types to determine
+ # if a printer is registered for that type. Return an
+ # instantiation of the printer if found.
+ for function in pretty_printers_dict:
+ if function.search(typename):
+ return pretty_printers_dict[function] (val)
+
+ # Cannot find a pretty printer. Return None.
+
+ return None
+
+
+def register_pretty_printers ():
+ pretty_printers_dict[re.compile('^struct s$')] = pp_s
+ pretty_printers_dict[re.compile('^s$')] = pp_s
+ pretty_printers_dict[re.compile('^S$')] = pp_s
+
+ pretty_printers_dict[re.compile('^struct ss$')] = pp_ss
+ pretty_printers_dict[re.compile('^ss$')] = pp_ss
+ pretty_printers_dict[re.compile('^const S &$')] = pp_s
+ pretty_printers_dict[re.compile('^SSS$')] = pp_sss
+
+ # Note that we purposely omit the typedef names here.
+ # Printer lookup is based on canonical name.
+ # However, we do need both tagged and untagged variants, to handle
+ # both the C and C++ cases.
+ pretty_printers_dict[re.compile('^struct string_repr$')] = string_print
+ pretty_printers_dict[re.compile('^struct container$')] = ContainerPrinter
+ pretty_printers_dict[re.compile('^string_repr$')] = string_print
+ pretty_printers_dict[re.compile('^container$')] = ContainerPrinter
+
+pretty_printers_dict = {}
+
+register_pretty_printers ()
+gdb.pretty_printers.append (lookup_function)
hooks/post-receive
--
Repository for Project Archer.
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2009-02-09 14:17 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-02-09 14:17 [SCM] archer-pmuldoon-pretty-printers-lookup: Account for a Py_Incref(null) bug. Convert pretty-print testsuite pmuldoon
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).