Fix PR python/19438, PR python/18393 - initialize dictionaries

This fixes PR python/19438 and PR python/18393.  Both bugs are about
invoking dir() on some Python object implemented by gdb, and getting a
crash.

The crash happens because the dictionary field of these objects was
not initialized.  Apparently what happens is that this field can be
lazily initialized by Python when assigning to an attribute; and it
can also be handled ok when using dir() but without __dict__ defined;
but gdb defines __dict__ because this isn't supplied automatically by
Python.

The docs on this seem rather sparse, but this patch works ok.

An alternative might be to lazily create the dictionary in
gdb_py_generic_dict, but I went with this approach because it seemed
more straightforward.

Built and regtested on x86-64 Fedora 23.

2016-05-23  Tom Tromey  <tom@tromey.com>

	PR python/19438, PR python/18393:
	* python/py-objfile.c (objfpy_initialize): Initialize self->dict.
	* python/py-progspace.c (pspy_initialize): Initialize self->dict.

2016-05-23  Tom Tromey  <tom@tromey.com>

	PR python/19438, PR python/18393:
	* gdb.python/py-progspace.exp: Add "dir" test.
	* gdb.python/py-objfile.exp: Add "dir" test.
This commit is contained in:
Tom Tromey 2016-05-18 21:19:17 -06:00
parent d9eca1df01
commit 0f6ed0e0ef
6 changed files with 24 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2016-05-23 Tom Tromey <tom@tromey.com>
PR python/19438, PR python/18393:
* python/py-objfile.c (objfpy_initialize): Initialize self->dict.
* python/py-progspace.c (pspy_initialize): Initialize self->dict.
2016-05-23 Gary Benson <gbenson@redhat.com>
* nat/gdb_thread_db.h (td_thr_validate_ftype): Remove typedef.

View File

@ -196,7 +196,10 @@ static int
objfpy_initialize (objfile_object *self)
{
self->objfile = NULL;
self->dict = NULL;
self->dict = PyDict_New ();
if (self->dict == NULL)
return 0;
self->printers = PyList_New (0);
if (self->printers == NULL)

View File

@ -97,7 +97,10 @@ static int
pspy_initialize (pspace_object *self)
{
self->pspace = NULL;
self->dict = NULL;
self->dict = PyDict_New ();
if (self->dict == NULL)
return 0;
self->printers = PyList_New (0);
if (self->printers == NULL)

View File

@ -1,3 +1,9 @@
2016-05-23 Tom Tromey <tom@tromey.com>
PR python/19438, PR python/18393:
* gdb.python/py-progspace.exp: Add "dir" test.
* gdb.python/py-objfile.exp: Add "dir" test.
2016-05-23 Yao Qi <yao.qi@linaro.org>
* gdb.arch/thumb-prologue.exp: Use standard_testfile.

View File

@ -45,6 +45,8 @@ gdb_test "python print (objfile.filename)" "${testfile}" \
gdb_test "python print (objfile.username)" "${testfile}" \
"Get objfile user name"
gdb_test_no_output "python dir(objfile)"
gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").filename)" \
"${testfile}" "print lookup_objfile filename"
gdb_test "python print (gdb.lookup_objfile (\"junk\"))" \

View File

@ -37,6 +37,8 @@ gdb_test "python print (gdb.current_progspace().filename)" "None" \
"current progspace filename (None)"
gdb_test "python print (gdb.progspaces())" "\\\[<gdb.Progspace object at $hex>\\\]"
gdb_test_no_output "python dir(gdb.current_progspace())"
gdb_load ${binfile}
gdb_py_test_silent_cmd "python progspace = gdb.current_progspace()" \