Fix accessing a function's fields (parameters) from Python (PR 18073)

Since 7.4, gdb doesn't allow calling .fields() on a function type, even
though the documentation states it should return a list corresponding to
the function's parameters.  This patch restores the intended behaviour
and adds a test for it.

Reg-tested on Arch Linux x86-64.

gdb/ChangeLog:

	PR python/18073
	* python/py-type.c (typy_get_composite): Allow returning a
	function type.

gdb/testsuite/ChangeLog:

	PR python/18073
	* gdb.python/py-type.c (C::a_method): New.
	(C::a_const_method): New.
	(C::a_static_method): New.
	(a_function): New.
	* gdb.python/py-type.exp (test_fields): Test getting fields
	from function and method.
This commit is contained in:
Simon Marchi 2015-10-21 15:57:22 -04:00
parent 3f2f83ddcb
commit bed91f4da2
5 changed files with 75 additions and 8 deletions

View File

@ -1,3 +1,9 @@
2015-10-21 Simon Marchi <simon.marchi@polymtl.ca>
PR python/18073
* python/py-type.c (typy_get_composite): Allow returning a
function type.
2015-10-21 Keven Boell <keven.boell@intel.com>
* dwarf2read.c (set_die_type): Add read of

View File

@ -495,10 +495,11 @@ typy_get_composite (struct type *type)
exception. */
if (TYPE_CODE (type) != TYPE_CODE_STRUCT
&& TYPE_CODE (type) != TYPE_CODE_UNION
&& TYPE_CODE (type) != TYPE_CODE_ENUM)
&& TYPE_CODE (type) != TYPE_CODE_ENUM
&& TYPE_CODE (type) != TYPE_CODE_FUNC)
{
PyErr_SetString (PyExc_TypeError,
"Type is not a structure, union, or enum type.");
"Type is not a structure, union, enum, or function type.");
return NULL;
}

View File

@ -1,3 +1,13 @@
2015-10-21 Simon Marchi <simon.marchi@polymtl.ca>
PR python/18073
* gdb.python/py-type.c (C::a_method): New.
(C::a_const_method): New.
(C::a_static_method): New.
(a_function): New.
* gdb.python/py-type.exp (test_fields): Test getting fields
from function and method.
2015-10-21 Keven Boell <keven.boell@intel.com>
* gdb.fortran/vla-alloc-assoc.exp: New file.

View File

@ -35,6 +35,24 @@ struct C
{
int c;
int d;
int
a_method (int x, char y)
{
return x + y;
}
int
a_const_method (int x, char y) const
{
return x + y;
}
static int
a_static_method (int x, char y)
{
return x + y;
}
};
struct D : C
@ -59,6 +77,12 @@ enum E
struct s vec_data_1 = {1, 1};
struct s vec_data_2 = {1, 2};
static int
a_function (int x, char y)
{
return x + y;
}
int
main ()
{
@ -72,15 +96,21 @@ main ()
D d;
d.e = 3;
d.f = 4;
c.a_method (0, 1);
c.a_const_method (0, 1);
C::a_static_method (0, 1);
#endif
enum E e;
st.a = 3;
st.b = 5;
e = v2;
ss.x = 100;
a_function (0, 1);
return 0; /* break to inspect struct and array. */
}

View File

@ -77,6 +77,21 @@ proc test_fields {lang} {
gdb_test "python print (c.type == gdb.parse_and_eval('d').type)" "False"
gdb_test "python print (c.type == gdb.parse_and_eval('d').type.fields()\[0\].type)" \
"True"
# Test fields of a method (its parameters)
gdb_test "python print (len (gdb.parse_and_eval ('C::a_method').type.fields ()))" "3"
gdb_test "python print (gdb.parse_and_eval ('C::a_method').type.fields ()\[0\].type)" "C \\* const"
gdb_test "python print (gdb.parse_and_eval ('C::a_method').type.fields ()\[1\].type)" "int"
gdb_test "python print (gdb.parse_and_eval ('C::a_method').type.fields ()\[2\].type)" "char"
gdb_test "python print (len (gdb.parse_and_eval ('C::a_const_method').type.fields ()))" "3"
gdb_test "python print (gdb.parse_and_eval ('C::a_const_method').type.fields ()\[0\].type)" "const C \\* const"
gdb_test "python print (gdb.parse_and_eval ('C::a_const_method').type.fields ()\[1\].type)" "int"
gdb_test "python print (gdb.parse_and_eval ('C::a_const_method').type.fields ()\[2\].type)" "char"
gdb_test "python print (len (gdb.parse_and_eval ('C::a_static_method').type.fields ()))" "2"
gdb_test "python print (gdb.parse_and_eval ('C::a_static_method').type.fields ()\[0\].type)" "int"
gdb_test "python print (gdb.parse_and_eval ('C::a_static_method').type.fields ()\[1\].type)" "char"
}
# Test normal fields usage in structs.
@ -111,10 +126,10 @@ proc test_fields {lang} {
gdb_test "python print (not not st.type)" "True" "Check conversion to bool"
# Test rejection of mapping operations on scalar types
gdb_test "python print (len (st.type\['a'\].type))" "TypeError: Type is not a structure, union, or enum type.*"
gdb_test "python print (st.type\['a'\].type.has_key ('x'))" "TypeError: Type is not a structure, union, or enum type.*"
gdb_test "python print (st.type\['a'\].type.keys ())" "TypeError: Type is not a structure, union, or enum type.*"
gdb_test "python print (st.type\['a'\].type\['x'\])" "TypeError: Type is not a structure, union, or enum type.*"
gdb_test "python print (len (st.type\['a'\].type))" "TypeError: Type is not a structure, union, enum, or function type.*"
gdb_test "python print (st.type\['a'\].type.has_key ('x'))" "TypeError: Type is not a structure, union, enum, or function type.*"
gdb_test "python print (st.type\['a'\].type\['x'\])" "TypeError: Type is not a structure, union, enum, or function type.*"
gdb_test "python print (st.type\['a'\].type.keys ())" "TypeError: Type is not a structure, union, enum, or function type.*"
# Test conversion to bool on scalar types
gdb_test "python print (not not st.type\['a'\].type)" "True"
@ -150,6 +165,11 @@ proc test_fields {lang} {
gdb_test "python print (vec1 == vec2)" "True"
gdb_py_test_silent_cmd "python vec3 = vec_data_2.cast(ar\[0\].type.vector(1))" "set vec3" 1
gdb_test "python print (vec1 == vec3)" "False"
# Test fields of a function (its parameters)
gdb_test "python print (len (gdb.parse_and_eval ('a_function').type.fields ()))" "2"
gdb_test "python print (gdb.parse_and_eval ('a_function').type.fields ()\[0\].type)" "int"
gdb_test "python print (gdb.parse_and_eval ('a_function').type.fields ()\[1\].type)" "char"
}
}