From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 119023 invoked by alias); 28 Sep 2015 04:44:54 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 118572 invoked by uid 89); 28 Sep 2015 04:44:11 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.1 required=5.0 tests=AWL,BAYES_50,SPF_SOFTFAIL autolearn=no version=3.3.2 X-HELO: smtp.electronicbox.net Received: from smtp.electronicbox.net (HELO smtp.electronicbox.net) (96.127.255.83) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 28 Sep 2015 04:44:08 +0000 Received: from simark.lan. (cable-192.222.137.139.electronicbox.net [192.222.137.139]) by smtp.electronicbox.net (Postfix) with ESMTP id 1CC1F440E78; Mon, 28 Sep 2015 00:43:52 -0400 (EDT) From: Simon Marchi To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH] Fix accessing a function's fields (parameters) from Python (PR 18073) Date: Mon, 28 Sep 2015 04:44:00 -0000 Message-Id: <1443415430-31110-1-git-send-email-simon.marchi@polymtl.ca> X-SW-Source: 2015-09/txt/msg00596.txt.bz2 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/python/py-type.c | 5 +++-- gdb/testsuite/gdb.python/py-type.c | 34 ++++++++++++++++++++++++++++++++-- gdb/testsuite/gdb.python/py-type.exp | 28 ++++++++++++++++++++++++---- 3 files changed, 59 insertions(+), 8 deletions(-) diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index 7b3f8f9..ef4e719 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/gdb.python/py-type.c b/gdb/testsuite/gdb.python/py-type.c index e3901cc..36ce1d8 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 58a2394..26126eb 100644 --- a/gdb/testsuite/gdb.python/py-type.exp +++ b/gdb/testsuite/gdb.python/py-type.exp @@ -75,6 +75,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. @@ -109,10 +124,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" @@ -148,6 +163,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.5.3