[python] Add gdb.Type.name attribute.
Consider the following declarations: typedef long our_time_t; our_time_t current_time = 1384395743; The purpose of this patch is to allow the use of a pretty-printer for variables of type our_time_t. Normally, pretty-printing sniffers use the tag name in order to determine which, if any, pretty-printer should be used. But in the case above, the tag name is not set, since it does not apply to integral types. This patch extends the gdb.Type list of attributes to also include the name of the type, thus allowing the sniffer to match against that name. With that change, I was able to write a pretty-printer which displays our variable as follow: (gdb) print current_time $1 = Thu Nov 14 02:22:23 2013 (1384395743) gdb/ChangeLog: * python/py-type.c (typy_get_name): New function. (type_object_getset): Add entry for attribute "name". * NEWS: Add entry mentioning this new attribute. gdb/doc/ChangeLog: * gdb.texinfo (Types In Python): Document new attribute Types.name. gdb/testsuite: * gdb.python/py-pp-integral.c: New file. * gdb.python/py-pp-integral.py: New file. * gdb.python/py-pp-integral.exp: New file. Tested on x86_64-linux.
This commit is contained in:
parent
c26e9cbb0c
commit
c0d4881122
@ -1,3 +1,9 @@
|
|||||||
|
2014-01-07 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
|
* python/py-type.c (typy_get_name): New function.
|
||||||
|
(type_object_getset): Add entry for attribute "name".
|
||||||
|
* NEWS: Add entry mentioning this new attribute.
|
||||||
|
|
||||||
2014-01-07 Yao Qi <yao@codesourcery.com>
|
2014-01-07 Yao Qi <yao@codesourcery.com>
|
||||||
|
|
||||||
* gnu-nat.c (set_exceptions_cmd): Remove an empty body 'if'
|
* gnu-nat.c (set_exceptions_cmd): Remove an empty body 'if'
|
||||||
|
1
gdb/NEWS
1
gdb/NEWS
@ -44,6 +44,7 @@
|
|||||||
** Line tables representation has been added.
|
** Line tables representation has been added.
|
||||||
** New attribute 'parent_type' for gdb.Field objects.
|
** New attribute 'parent_type' for gdb.Field objects.
|
||||||
** gdb.Field objects can be used as subscripts on gdb.Value objects.
|
** gdb.Field objects can be used as subscripts on gdb.Value objects.
|
||||||
|
** New attribute 'name' for gdb.Type objects.
|
||||||
|
|
||||||
* New targets
|
* New targets
|
||||||
|
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
2014-01-07 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
|
* gdb.texinfo (Types In Python): Document new attribute Types.name.
|
||||||
|
|
||||||
2013-12-30 Joel Brobecker <brobecker@adacore.com>
|
2013-12-30 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
* gdb.texinfo (Types In Python): Clarify the documentation
|
* gdb.texinfo (Types In Python): Clarify the documentation
|
||||||
|
@ -24311,6 +24311,11 @@ The type code for this type. The type code will be one of the
|
|||||||
@code{TYPE_CODE_} constants defined below.
|
@code{TYPE_CODE_} constants defined below.
|
||||||
@end defvar
|
@end defvar
|
||||||
|
|
||||||
|
@defvar Type.name
|
||||||
|
The name of this type. If this type has no name, then @code{None}
|
||||||
|
is returned.
|
||||||
|
@end defvar
|
||||||
|
|
||||||
@defvar Type.sizeof
|
@defvar Type.sizeof
|
||||||
The size of this type, in target @code{char} units. Usually, a
|
The size of this type, in target @code{char} units. Usually, a
|
||||||
target's @code{char} type will be an 8-bit byte. However, on some
|
target's @code{char} type will be an 8-bit byte. However, on some
|
||||||
|
@ -414,6 +414,18 @@ typy_items (PyObject *self, PyObject *args)
|
|||||||
return typy_fields_items (self, iter_items);
|
return typy_fields_items (self, iter_items);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return the type's name, or None. */
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
typy_get_name (PyObject *self, void *closure)
|
||||||
|
{
|
||||||
|
struct type *type = ((type_object *) self)->type;
|
||||||
|
|
||||||
|
if (TYPE_NAME (type) == NULL)
|
||||||
|
Py_RETURN_NONE;
|
||||||
|
return PyString_FromString (TYPE_NAME (type));
|
||||||
|
}
|
||||||
|
|
||||||
/* Return the type's tag, or None. */
|
/* Return the type's tag, or None. */
|
||||||
static PyObject *
|
static PyObject *
|
||||||
typy_get_tag (PyObject *self, void *closure)
|
typy_get_tag (PyObject *self, void *closure)
|
||||||
@ -1395,6 +1407,8 @@ static PyGetSetDef type_object_getset[] =
|
|||||||
{
|
{
|
||||||
{ "code", typy_get_code, NULL,
|
{ "code", typy_get_code, NULL,
|
||||||
"The code for this type.", NULL },
|
"The code for this type.", NULL },
|
||||||
|
{ "name", typy_get_name, NULL,
|
||||||
|
"The name for this type, or None.", NULL },
|
||||||
{ "sizeof", typy_get_sizeof, NULL,
|
{ "sizeof", typy_get_sizeof, NULL,
|
||||||
"The size of this type, in bytes.", NULL },
|
"The size of this type, in bytes.", NULL },
|
||||||
{ "tag", typy_get_tag, NULL,
|
{ "tag", typy_get_tag, NULL,
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
2014-01-07 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
|
* gdb.python/py-pp-integral.c: New file.
|
||||||
|
* gdb.python/py-pp-integral.py: New file.
|
||||||
|
* gdb.python/py-pp-integral.exp: New file.
|
||||||
|
|
||||||
2013-12-19 Sergio Durigan Junior <sergiodj@redhat.com>
|
2013-12-19 Sergio Durigan Junior <sergiodj@redhat.com>
|
||||||
|
|
||||||
PR breakpoints/16297
|
PR breakpoints/16297
|
||||||
|
33
gdb/testsuite/gdb.python/py-pp-integral.c
Normal file
33
gdb/testsuite/gdb.python/py-pp-integral.c
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/* This testcase is part of GDB, the GNU debugger.
|
||||||
|
|
||||||
|
Copyright 2013-2014 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
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
typedef long time_t;
|
||||||
|
|
||||||
|
static void
|
||||||
|
tick_tock (time_t *t)
|
||||||
|
{
|
||||||
|
*t++;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
time_t current_time = 1384395743;
|
||||||
|
|
||||||
|
tick_tock (¤t_time);
|
||||||
|
return 0;
|
||||||
|
}
|
38
gdb/testsuite/gdb.python/py-pp-integral.exp
Normal file
38
gdb/testsuite/gdb.python/py-pp-integral.exp
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# Copyright (C) 2013-2014 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
|
||||||
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
standard_testfile
|
||||||
|
|
||||||
|
if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Skip all tests if Python scripting is not enabled.
|
||||||
|
if { [skip_python_tests] } { continue }
|
||||||
|
|
||||||
|
if ![runto tick_tock] {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
set remote_python_file [gdb_remote_download host \
|
||||||
|
${srcdir}/${subdir}/${testfile}.py]
|
||||||
|
|
||||||
|
gdb_test_no_output "source ${remote_python_file}"
|
||||||
|
|
||||||
|
gdb_test "print *t" " = Thu Nov 14 02:22:23 2013 \\(1384395743\\)"
|
||||||
|
|
||||||
|
gdb_test "print /r *t" "= 1384395743"
|
||||||
|
|
||||||
|
remote_file host delete ${remote_python_file}
|
35
gdb/testsuite/gdb.python/py-pp-integral.py
Normal file
35
gdb/testsuite/gdb.python/py-pp-integral.py
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# Copyright (C) 2013-2014 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
|
||||||
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
from time import asctime, gmtime
|
||||||
|
import gdb # silence pyflakes
|
||||||
|
|
||||||
|
|
||||||
|
class TimePrinter:
|
||||||
|
def __init__(self, val):
|
||||||
|
self.val = val
|
||||||
|
|
||||||
|
def to_string(self):
|
||||||
|
secs = int(self.val)
|
||||||
|
return "%s (%d)" % (asctime(gmtime(secs)), secs)
|
||||||
|
|
||||||
|
|
||||||
|
def time_sniffer(val):
|
||||||
|
if hasattr(val.type, 'name') and val.type.name == "time_t":
|
||||||
|
return TimePrinter(val)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
gdb.pretty_printers.append(time_sniffer)
|
Loading…
Reference in New Issue
Block a user