From bed91f4da252b5f30d3cb4fd9f9febd61ad9560d Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Wed, 21 Oct 2015 15:57:22 -0400 Subject: [PATCH] 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. --- gdb/ChangeLog | 6 +++++ gdb/python/py-type.c | 5 ++-- gdb/testsuite/ChangeLog | 10 ++++++++ gdb/testsuite/gdb.python/py-type.c | 34 ++++++++++++++++++++++++++-- gdb/testsuite/gdb.python/py-type.exp | 28 +++++++++++++++++++---- 5 files changed, 75 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 53e55aee926..1d3f68350b4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2015-10-21 Simon Marchi + + PR python/18073 + * python/py-type.c (typy_get_composite): Allow returning a + function type. + 2015-10-21 Keven Boell * dwarf2read.c (set_die_type): Add read of diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index 7b3f8f9a771..ef4e7197ce6 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -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; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 8f47cc180f7..1313aa2780c 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2015-10-21 Simon Marchi + + 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 * gdb.fortran/vla-alloc-assoc.exp: New file. diff --git a/gdb/testsuite/gdb.python/py-type.c b/gdb/testsuite/gdb.python/py-type.c index e3901ccda3a..36ce1d8430f 100644 --- a/gdb/testsuite/gdb.python/py-type.c +++ b/gdb/testsuite/gdb.python/py-type.c @@ -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. */ } diff --git a/gdb/testsuite/gdb.python/py-type.exp b/gdb/testsuite/gdb.python/py-type.exp index ce6eddeaffc..10decee25b0 100644 --- a/gdb/testsuite/gdb.python/py-type.exp +++ b/gdb/testsuite/gdb.python/py-type.exp @@ -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" } } -- 2.30.2