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:
parent
3f2f83ddcb
commit
bed91f4da2
5 changed files with 75 additions and 8 deletions
|
@ -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>
|
2015-10-21 Keven Boell <keven.boell@intel.com>
|
||||||
|
|
||||||
* dwarf2read.c (set_die_type): Add read of
|
* dwarf2read.c (set_die_type): Add read of
|
||||||
|
|
|
@ -495,10 +495,11 @@ typy_get_composite (struct type *type)
|
||||||
exception. */
|
exception. */
|
||||||
if (TYPE_CODE (type) != TYPE_CODE_STRUCT
|
if (TYPE_CODE (type) != TYPE_CODE_STRUCT
|
||||||
&& TYPE_CODE (type) != TYPE_CODE_UNION
|
&& 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,
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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>
|
2015-10-21 Keven Boell <keven.boell@intel.com>
|
||||||
|
|
||||||
* gdb.fortran/vla-alloc-assoc.exp: New file.
|
* gdb.fortran/vla-alloc-assoc.exp: New file.
|
||||||
|
|
|
@ -35,6 +35,24 @@ struct C
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
int d;
|
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
|
struct D : C
|
||||||
|
@ -59,6 +77,12 @@ enum E
|
||||||
struct s vec_data_1 = {1, 1};
|
struct s vec_data_1 = {1, 1};
|
||||||
struct s vec_data_2 = {1, 2};
|
struct s vec_data_2 = {1, 2};
|
||||||
|
|
||||||
|
static int
|
||||||
|
a_function (int x, char y)
|
||||||
|
{
|
||||||
|
return x + y;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main ()
|
main ()
|
||||||
{
|
{
|
||||||
|
@ -72,15 +96,21 @@ main ()
|
||||||
D d;
|
D d;
|
||||||
d.e = 3;
|
d.e = 3;
|
||||||
d.f = 4;
|
d.f = 4;
|
||||||
|
|
||||||
|
c.a_method (0, 1);
|
||||||
|
c.a_const_method (0, 1);
|
||||||
|
C::a_static_method (0, 1);
|
||||||
#endif
|
#endif
|
||||||
enum E e;
|
enum E e;
|
||||||
|
|
||||||
st.a = 3;
|
st.a = 3;
|
||||||
st.b = 5;
|
st.b = 5;
|
||||||
|
|
||||||
e = v2;
|
e = v2;
|
||||||
|
|
||||||
ss.x = 100;
|
ss.x = 100;
|
||||||
|
|
||||||
|
a_function (0, 1);
|
||||||
|
|
||||||
return 0; /* break to inspect struct and array. */
|
return 0; /* break to inspect struct and array. */
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)" "False"
|
||||||
gdb_test "python print (c.type == gdb.parse_and_eval('d').type.fields()\[0\].type)" \
|
gdb_test "python print (c.type == gdb.parse_and_eval('d').type.fields()\[0\].type)" \
|
||||||
"True"
|
"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.
|
# 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"
|
gdb_test "python print (not not st.type)" "True" "Check conversion to bool"
|
||||||
|
|
||||||
# Test rejection of mapping operations on scalar types
|
# 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 (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, or enum 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.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, enum, or function type.*"
|
||||||
gdb_test "python print (st.type\['a'\].type\['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, enum, or function type.*"
|
||||||
|
|
||||||
# Test conversion to bool on scalar types
|
# Test conversion to bool on scalar types
|
||||||
gdb_test "python print (not not st.type\['a'\].type)" "True"
|
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_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_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"
|
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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue