binutils-gdb/gdb/python
Pedro Alves 0d1f4ceb39 -Wwrite-strings: Wrap PyGetSetDef for construction with string literals
Unfortunately, PyGetSetDef's 'name' and 'doc' members are 'char *'
instead of 'const char *', meaning that in order to list-initialize
PyGetSetDef arrays using string literals requires writing explicit
'char *' casts.  For example:

    static PyGetSetDef value_object_getset[] = {
   -  { "address", valpy_get_address, NULL, "The address of the value.",
   +  { (char *) "address", valpy_get_address, NULL,
   +    (char *) "The address of the value.",
	NULL },
   -  { "is_optimized_out", valpy_get_is_optimized_out, NULL,
   -    "Boolean telling whether the value is optimized "
   +  { (char *) "is_optimized_out", valpy_get_is_optimized_out, NULL,
   +    (char *) "Boolean telling whether the value is optimized "
	"out (i.e., not available).",
	NULL },
   -  { "type", valpy_get_type, NULL, "Type of the value.", NULL },
   -  { "dynamic_type", valpy_get_dynamic_type, NULL,
   -    "Dynamic type of the value.", NULL },
   -  { "is_lazy", valpy_get_is_lazy, NULL,
   -    "Boolean telling whether the value is lazy (not fetched yet\n\
   +  { (char *) "type", valpy_get_type, NULL,
   +    (char *) "Type of the value.", NULL },
   +  { (char *) "dynamic_type", valpy_get_dynamic_type, NULL,
   +    (char *) "Dynamic type of the value.", NULL },
   +  { (char *) "is_lazy", valpy_get_is_lazy, NULL,
   +    (char *) "Boolean telling whether the value is lazy (not fetched yet\n\
    from the inferior).  A lazy value is fetched when needed, or when\n\
    the \"fetch_lazy()\" method is called.", NULL },
      {NULL}  /* Sentinel */

We have ~20 such arrays, and I first wrote a patch that fixed all of
them like that...  It's not pretty...

One way to make these a bit less ugly would be add a new macro that
hides the casts, like:

  #define GDBPY_GSDEF(NAME, GET, SET, DOC, CLOSURE) \
     { (char *) NAME, GET, SET, (char *) DOC, CLOSURE }

and then use it like:

    static PyGetSetDef value_object_getset[] = {
       GDBPY_GSDEF ("address", valpy_get_address, NULL,
       		    "The address of the value.", NULL),
       GDBPY_GSDEF ("is_optimized_out", valpy_get_is_optimized_out, NULL,
       		    "Boolean telling whether the value is optimized ", NULL),
      {NULL}  /* Sentinel */
    };

But since we have C++11, which gives us constexpr and list
initialization, I thought of a way that requires no changes where the
arrays are initialized:

We add a new type that extends PyGetSetDef (called gdb_PyGetSetDef),
and add constexpr constructors that accept const 'name' and 'doc', and
then list/aggregate initialization simply "calls" these matching
constructors instead.

I put "calls" in quotes, because given "constexpr", it's all done at
compile time, and there's no overhead either in binary size or at run
time.  In fact, we get identical binaries, before/after this change.

Unlike the fixes that fix some old Python API to match the API of more
recent Python, this switches to using explicit "gdb_PyGetSetDef"
everywhere, just to be clear that we are using our own version of it.

gdb/ChangeLog:
2017-04-05  Pedro Alves  <palves@redhat.com>

	* python/python-internal.h (gdb_PyGetSetDef): New type.
	* python/py-block.c (block_object_getset)
	(breakpoint_object_getset): Now a gdb_PyGetSetDef array.
	* python/py-event.c (event_object_getset)
	(finish_breakpoint_object_getset): Likewise.
	* python/py-inferior.c (inferior_object_getset): Likewise.
	* python/py-infthread.c (thread_object_getset): Likewise.
	* python/py-lazy-string.c (lazy_string_object_getset): Likewise.
	* python/py-linetable.c (linetable_entry_object_getset): Likewise.
	* python/py-objfile.c (objfile_getset): Likewise.
	* python/py-progspace.c (pspace_getset): Likewise.
	* python/py-record-btrace.c (btpy_insn_getset, btpy_call_getset):
	Likewise.
	* python/py-record.c (recpy_record_getset): Likewise.
	* python/py-symbol.c (symbol_object_getset): Likewise.
	* python/py-symtab.c (symtab_object_getset, sal_object_getset):
	Likewise.
	* python/py-type.c (type_object_getset, field_object_getset):
	Likewise.
	* python/py-value.c (value_object_getset): Likewise.
2017-04-05 19:21:36 +01:00
..
lib/gdb Import sys in gdb/python/lib/gdb/printer/bound_registers.py 2017-03-22 11:22:07 +00:00
py-arch.c Turn gdbpy_ref into a template 2017-02-10 12:24:31 -07:00
py-auto-load.c update copyright year range in GDB files 2017-01-01 10:52:34 +04:00
py-block.c -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
py-bpevent.c Turn gdbpy_ref into a template 2017-02-10 12:24:31 -07:00
py-breakpoint.c -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
py-cmd.c Use gdbpy_ref to simplify some logic 2017-02-10 12:24:32 -07:00
py-continueevent.c Turn gdbpy_ref into a template 2017-02-10 12:24:31 -07:00
py-event.c -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
py-event.h Change event code to use gdbpy_ref 2017-01-10 19:13:29 -07:00
py-events.h PR python/13598 - add before_prompt event 2017-02-14 10:38:56 -07:00
py-evtregistry.c Use gdbpy_ref to simplify some logic 2017-02-10 12:24:32 -07:00
py-evts.c PR python/13598 - add before_prompt event 2017-02-14 10:38:56 -07:00
py-exitedevent.c Turn gdbpy_ref into a template 2017-02-10 12:24:31 -07:00
py-finishbreakpoint.c -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
py-frame.c Use gdbpy_ref to simplify some logic 2017-02-10 12:24:32 -07:00
py-framefilter.c Turn gdbpy_ref into a template 2017-02-10 12:24:31 -07:00
py-function.c Turn gdbpy_ref into a template 2017-02-10 12:24:31 -07:00
py-gdb-readline.c Fix python-interactive with Python 3.6 2017-01-20 20:39:08 -05:00
py-inferior.c -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
py-infevents.c Turn gdbpy_ref into a template 2017-02-10 12:24:31 -07:00
py-infthread.c -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
py-lazy-string.c -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
py-linetable.c -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
py-newobjfileevent.c Turn gdbpy_ref into a template 2017-02-10 12:24:31 -07:00
py-objfile.c -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
py-param.c Turn gdbpy_ref into a template 2017-02-10 12:24:31 -07:00
py-prettyprint.c Change one more spot to use gdbpy_ref 2017-02-10 12:24:33 -07:00
py-progspace.c -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
py-record-btrace.c -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
py-record-btrace.h python: Implement btrace Python bindings for record history. 2017-02-14 10:57:56 +01:00
py-record-full.c python: Implement btrace Python bindings for record history. 2017-02-14 10:57:56 +01:00
py-record-full.h python: Implement btrace Python bindings for record history. 2017-02-14 10:57:56 +01:00
py-record.c -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
py-ref.h Turn gdbpy_ref into a template 2017-02-10 12:24:31 -07:00
py-signalevent.c Turn gdbpy_ref into a template 2017-02-10 12:24:31 -07:00
py-stopevent.c Turn gdbpy_ref into a template 2017-02-10 12:24:31 -07:00
py-stopevent.h update copyright year range in GDB files 2017-01-01 10:52:34 +04:00
py-symbol.c -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
py-symtab.c -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
py-threadevent.c Turn gdbpy_ref into a template 2017-02-10 12:24:31 -07:00
py-type.c -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
py-unwind.c Turn gdbpy_ref into a template 2017-02-10 12:24:31 -07:00
py-utils.c Turn gdbpy_ref into a template 2017-02-10 12:24:31 -07:00
py-value.c -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
py-varobj.c Turn gdbpy_ref into a template 2017-02-10 12:24:31 -07:00
py-xmethods.c Support rvalue references in the gdb python module (includes doc/) 2017-03-20 13:47:52 -07:00
python-config.py
python-internal.h -Wwrite-strings: Wrap PyGetSetDef for construction with string literals 2017-04-05 19:21:36 +01:00
python.c gdb: Make ldirname return a std::string 2017-03-27 11:56:28 +01:00
python.h update copyright year range in GDB files 2017-01-01 10:52:34 +04:00