gdb/python: remove all uses of Py_TPFLAGS_HAVE_ITER
authorAndrew Burgess <andrew.burgess@embecosm.com>
Wed, 1 Sep 2021 13:24:15 +0000 (14:24 +0100)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Thu, 9 Sep 2021 08:50:38 +0000 (09:50 +0100)
Python 2 has a bit flag Py_TPFLAGS_HAVE_ITER which can be passed as
part of the tp_flags field when defining a new object type.  This flag
is not defined in Python 3 and so we define it to 0 in
python-internal.h (when IS_PY3K is defined).

The meaning of this flag is that the object has the fields tp_iter and
tp_iternext.  Note the use of "has" here, the flag says nothing about
the values in those fields, just that the type object has the fields.

In early versions of Python 2 these fields were no part of the
PyTypeObject struct, they were added in version 2.2 (see
https://docs.python.org/release/2.3/api/type-structs.html).  And so,
there could be a some code compiled out there which has a PyTypeObject
structure within it that doesn't even have the tp_iter and tp_iternext
fields, attempting to access these fields would be undefined
behaviour.

And so Python added the Py_TPFLAGS_HAVE_ITER flag.  If the flag is
present then Python is free to access the tp_iter and tp_iternext
fields.

If we consider GDB then we always assume that the tp_iter and
tp_iternext fields are part of PyTypeObject.  If someone was crazy
enough to try and compile GDB against Python 2.1 then we'd get lots of
build errors saying that we were passing too many fields when
initializing PyTypeObject structures.  And so, I claim, we can be sure
that GDB will always be compiled with a version of Python that has the
tp_iter and tp_iternext fields in PyTypeObject.

Next we can look at the Py_TPFLAGS_DEFAULT flag.  In Python 2, each
time additional fields are added to PyTypeObject a new Py_TPFLAGS_*
flag would be defined to indicate whether those flags are present or
not.  And, those new flags would be added to Py_TPFLAGS_DEFAULT.  And
so, in the latest version of Python 2 the Py_TPFLAGS_DEFAULT flag
includes Py_TPFLAGS_HAVE_ITER (see
https://docs.python.org/2.7/c-api/typeobj.html).

In GDB we pass Py_TPFLAGS_DEFAULT as part of the tp_flags for all
objects we define.

And so, in this commit, I propose to remove all uses of
Py_TPFLAGS_HAVE_ITER from GDB, it's simply not needed.

There should be no user visible changes after this commit.

gdb/python/py-block.c
gdb/python/py-inferior.c
gdb/python/py-infthread.c
gdb/python/py-linetable.c
gdb/python/py-registers.c
gdb/python/py-type.c
gdb/python/python-internal.h

index 244ff9a6bab6bcb1baf7038330431bfa6734b643..fe0efd62d46a69683d6d5428ed8e60a0c25f383d 100644 (file)
@@ -510,7 +510,7 @@ PyTypeObject block_object_type = {
   0,                             /*tp_getattro*/
   0,                             /*tp_setattro*/
   0,                             /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER,  /*tp_flags*/
+  Py_TPFLAGS_DEFAULT,            /*tp_flags*/
   "GDB block object",            /* tp_doc */
   0,                             /* tp_traverse */
   0,                             /* tp_clear */
@@ -550,7 +550,7 @@ PyTypeObject block_syms_iterator_object_type = {
   0,                             /*tp_getattro*/
   0,                             /*tp_setattro*/
   0,                             /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER,  /*tp_flags*/
+  Py_TPFLAGS_DEFAULT,            /*tp_flags*/
   "GDB block syms iterator object",          /*tp_doc */
   0,                             /*tp_traverse */
   0,                             /*tp_clear */
index cfbc2f6574f1cf5a57ce54378b8908c9516f7edb..0659c28ea9c5da4b03252bd1648c3a9fa8846497 100644 (file)
@@ -1026,7 +1026,7 @@ PyTypeObject inferior_object_type =
   0,                             /* tp_getattro */
   0,                             /* tp_setattro */
   0,                             /* tp_as_buffer */
-  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER,  /* tp_flags */
+  Py_TPFLAGS_DEFAULT,            /* tp_flags */
   "GDB inferior object",         /* tp_doc */
   0,                             /* tp_traverse */
   0,                             /* tp_clear */
index 3315af5eb5993e825e54477eaeeb5fe3fc45d847..5645442a42696ed21d9841ec5a9b21c7a7a93b3e 100644 (file)
@@ -408,7 +408,7 @@ PyTypeObject thread_object_type =
   0,                             /*tp_getattro*/
   0,                             /*tp_setattro*/
   0,                             /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER,  /*tp_flags*/
+  Py_TPFLAGS_DEFAULT,            /*tp_flags*/
   "GDB thread object",           /* tp_doc */
   0,                             /* tp_traverse */
   0,                             /* tp_clear */
index e989204a7f56ce71ce5cb3977ca2b43ff2225e66..071341f6cebf3ffa024a2023276c2ca4fddad7eb 100644 (file)
@@ -531,7 +531,7 @@ PyTypeObject ltpy_iterator_object_type = {
   0,                             /*tp_getattro*/
   0,                             /*tp_setattro*/
   0,                             /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER,  /*tp_flags*/
+  Py_TPFLAGS_DEFAULT,            /*tp_flags*/
   "GDB line table iterator object",          /*tp_doc */
   0,                             /*tp_traverse */
   0,                             /*tp_clear */
index 04e554f48e111c5006ac1d91bc63cf06d861ba31..df0ba764b46d9bc61a117b1913b48fc783a1670a 100644 (file)
@@ -497,7 +497,7 @@ PyTypeObject register_descriptor_iterator_object_type = {
   0,                             /*tp_getattro*/
   0,                             /*tp_setattro*/
   0,                             /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER,                   /*tp_flags*/
+  Py_TPFLAGS_DEFAULT,            /*tp_flags*/
   "GDB architecture register descriptor iterator object",      /*tp_doc */
   0,                             /*tp_traverse */
   0,                             /*tp_clear */
@@ -567,7 +567,7 @@ PyTypeObject reggroup_iterator_object_type = {
   0,                             /*tp_getattro*/
   0,                             /*tp_setattro*/
   0,                             /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER,   /*tp_flags*/
+  Py_TPFLAGS_DEFAULT,            /*tp_flags*/
   "GDB register groups iterator object",       /*tp_doc */
   0,                             /*tp_traverse */
   0,                             /*tp_clear */
index 04d1c7a0ee7d3ac0f0d64d06532769ce3ab80b2d..d82bdf849579e322ab69531126bb99399a8202d7 100644 (file)
@@ -1633,7 +1633,7 @@ PyTypeObject type_object_type =
   0,                             /*tp_getattro*/
   0,                             /*tp_setattro*/
   0,                             /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER,  /*tp_flags*/
+  Py_TPFLAGS_DEFAULT,            /*tp_flags*/
   "GDB type object",             /* tp_doc */
   0,                             /* tp_traverse */
   0,                             /* tp_clear */
@@ -1682,7 +1682,7 @@ PyTypeObject field_object_type =
   0,                             /*tp_getattro*/
   0,                             /*tp_setattro*/
   0,                             /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER,  /*tp_flags*/
+  Py_TPFLAGS_DEFAULT,            /*tp_flags*/
   "GDB field object",            /* tp_doc */
   0,                             /* tp_traverse */
   0,                             /* tp_clear */
@@ -1723,7 +1723,7 @@ PyTypeObject type_iterator_object_type = {
   0,                             /*tp_getattro*/
   0,                             /*tp_setattro*/
   0,                             /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER,  /*tp_flags*/
+  Py_TPFLAGS_DEFAULT,            /*tp_flags*/
   "GDB type iterator object",    /*tp_doc */
   0,                             /*tp_traverse */
   0,                             /*tp_clear */
index 0e140f1af61ef1e7d9b0ee62fa7115d1d08affda..368681b797cb146a73658c9fac5352ba17c537f5 100644 (file)
@@ -92,7 +92,6 @@
 #endif
 
 #ifdef IS_PY3K
-#define Py_TPFLAGS_HAVE_ITER 0
 #define Py_TPFLAGS_CHECKTYPES 0
 
 #define PyInt_Check PyLong_Check