diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cf1d1b95f8..13d2e165c6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2014-01-07 Joel Brobecker + + * 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 * gnu-nat.c (set_exceptions_cmd): Remove an empty body 'if' diff --git a/gdb/NEWS b/gdb/NEWS index b64967eaed..d408f90b2f 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -44,6 +44,7 @@ ** Line tables representation has been added. ** New attribute 'parent_type' for gdb.Field objects. ** gdb.Field objects can be used as subscripts on gdb.Value objects. + ** New attribute 'name' for gdb.Type objects. * New targets diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index a7e1c2f06d..afcfbd981f 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,7 @@ +2014-01-07 Joel Brobecker + + * gdb.texinfo (Types In Python): Document new attribute Types.name. + 2013-12-30 Joel Brobecker * gdb.texinfo (Types In Python): Clarify the documentation diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 010bb6bdff..74ddcf5cee 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -24311,6 +24311,11 @@ The type code for this type. The type code will be one of the @code{TYPE_CODE_} constants defined below. @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 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 diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index 3941a11246..16bb4421ee 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -414,6 +414,18 @@ typy_items (PyObject *self, PyObject *args) 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. */ static PyObject * typy_get_tag (PyObject *self, void *closure) @@ -1395,6 +1407,8 @@ static PyGetSetDef type_object_getset[] = { { "code", typy_get_code, 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, "The size of this type, in bytes.", NULL }, { "tag", typy_get_tag, NULL, diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 662d161715..67e5cc127f 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2014-01-07 Joel Brobecker + + * 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 PR breakpoints/16297 diff --git a/gdb/testsuite/gdb.python/py-pp-integral.c b/gdb/testsuite/gdb.python/py-pp-integral.c new file mode 100644 index 0000000000..a5fe8c366f --- /dev/null +++ b/gdb/testsuite/gdb.python/py-pp-integral.c @@ -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 . */ + +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; +} diff --git a/gdb/testsuite/gdb.python/py-pp-integral.exp b/gdb/testsuite/gdb.python/py-pp-integral.exp new file mode 100644 index 0000000000..1262c3f941 --- /dev/null +++ b/gdb/testsuite/gdb.python/py-pp-integral.exp @@ -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 . + +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} diff --git a/gdb/testsuite/gdb.python/py-pp-integral.py b/gdb/testsuite/gdb.python/py-pp-integral.py new file mode 100644 index 0000000000..34f41a6ead --- /dev/null +++ b/gdb/testsuite/gdb.python/py-pp-integral.py @@ -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 . + +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)