Fix accessing a method's fields from Python
authorHannes Domani <ssbssa@yahoo.de>
Fri, 18 Dec 2020 15:17:46 +0000 (16:17 +0100)
committerHannes Domani <ssbssa@yahoo.de>
Fri, 18 Dec 2020 21:02:13 +0000 (22:02 +0100)
Considering this example:

struct C
{
  int func() { return 1; }
} c;
int main()
{
  return c.func();
}

Accessing the fields of C::func, when requesting the function by its
type, works:

(gdb) py print(gdb.parse_and_eval('C::func').type.fields()[0].type)
C * const

But when trying to do the same via a class instance, it fails:

(gdb) py print(gdb.parse_and_eval('c')['func'].type.fields()[0].type)
Traceback (most recent call last):
  File "<string>", line 1, in <module>
TypeError: Type is not a structure, union, enum, or function type.
Error while executing Python code.

The difference is that in the former the function type is TYPE_CODE_FUNC:

(gdb) py print(gdb.parse_and_eval('C::func').type.code == gdb.TYPE_CODE_FUNC)
True

And in the latter the function type is TYPE_CODE_METHOD:

(gdb) py print(gdb.parse_and_eval('c')['func'].type.code == gdb.TYPE_CODE_METHOD)
True

So this adds the functionality for TYPE_CODE_METHOD as well.

gdb/ChangeLog:

2020-12-18  Hannes Domani  <ssbssa@yahoo.de>

* python/py-type.c (typy_get_composite): Add TYPE_CODE_METHOD.

gdb/testsuite/ChangeLog:

2020-12-18  Hannes Domani  <ssbssa@yahoo.de>

* gdb.python/py-type.exp: Add tests for TYPE_CODE_METHOD.

gdb/ChangeLog
gdb/python/py-type.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-type.exp

index 9b7b0105db50829c3ef50716ccedb22c07fbcfe8..1a104b1f339dd15c62a58360b199e6f4a8bc5ffa 100644 (file)
@@ -1,3 +1,7 @@
+2020-12-18  Hannes Domani  <ssbssa@yahoo.de>
+
+       * python/py-type.c (typy_get_composite): Add TYPE_CODE_METHOD.
+
 2020-12-18  Jameson Nash  <vtjnash@gmail.com>
 
        * coffread.c (linetab_offset): Change type to file_ptr.
index 1c7cacbddf32082999607ffadb9c28bc72504878..3fc0f61c635033699a33a8737c55988f8b0da38a 100644 (file)
@@ -471,6 +471,7 @@ typy_get_composite (struct type *type)
   if (type->code () != TYPE_CODE_STRUCT
       && type->code () != TYPE_CODE_UNION
       && type->code () != TYPE_CODE_ENUM
+      && type->code () != TYPE_CODE_METHOD
       && type->code () != TYPE_CODE_FUNC)
     {
       PyErr_SetString (PyExc_TypeError,
index 24df95135db3d980186ea3d89456874f7eb5ee45..73425638a23b12b272b3c4c339511fc9edb34d0a 100644 (file)
@@ -1,3 +1,7 @@
+2020-12-18  Hannes Domani  <ssbssa@yahoo.de>
+
+       * gdb.python/py-type.exp: Add tests for TYPE_CODE_METHOD.
+
 2020-12-18  Tom Tromey  <tromey@adacore.com>
 
        * gdb.ada/fixed_points.exp: Also run with
index c01442c388728c79104df600844f0844f555bdbe..5166f9ecee6844d62c2d2c4ab9d6654f0cc44618 100644 (file)
@@ -83,15 +83,18 @@ proc test_fields {lang} {
       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 (gdb.parse_and_eval ('c')\['a_method'\].type.fields ()\[0\].type)" "C \\* const"
 
       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 (gdb.parse_and_eval ('c')\['a_const_method'\].type.fields ()\[0\].type)" "const C \\* const"
 
       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"
+      gdb_test "python print (gdb.parse_and_eval ('c')\['a_static_method'\].type.fields ()\[0\].type)" "int"
     }
 
     # Test normal fields usage in structs.