]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Implement tp_richcompare for gdb.Block
authorTom Tromey <tromey@adacore.com>
Wed, 24 Apr 2024 17:58:38 +0000 (11:58 -0600)
committerTom Tromey <tromey@adacore.com>
Fri, 10 May 2024 18:09:32 +0000 (12:09 -0600)
I noticed that two gdb.Block objects will never compare as equal with
'=='.  This patch fixes the problem by implementing tp_richcompare, as
was done for gdb.Frame.

gdb/python/py-block.c

index 3e30faf08560779742bf58e3fb9a0715ccc357b4..3de6200e7c26096e1a979a1e589b47a6560d1647 100644 (file)
@@ -452,6 +452,28 @@ blpy_repr (PyObject *self)
                               name, str.c_str ());
 }
 
+/* Implements the equality comparison for Block objects.  All other
+   comparison operators will throw NotImplemented, as they aren't
+   valid for blocks.  */
+
+static PyObject *
+blpy_richcompare (PyObject *self, PyObject *other, int op)
+{
+  if (!PyObject_TypeCheck (other, &block_object_type)
+      || (op != Py_EQ && op != Py_NE))
+    {
+      Py_INCREF (Py_NotImplemented);
+      return Py_NotImplemented;
+    }
+
+  block_object *self_block = (block_object *) self;
+  block_object *other_block = (block_object *) other;
+
+  bool expected = self_block->block == other_block->block;
+  bool equal = op == Py_EQ;
+  return PyBool_FromLong (equal == expected);
+}
+
 static int CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION
 gdbpy_initialize_blocks (void)
 {
@@ -530,7 +552,7 @@ PyTypeObject block_object_type = {
   "GDB block object",            /* tp_doc */
   0,                             /* tp_traverse */
   0,                             /* tp_clear */
-  0,                             /* tp_richcompare */
+  blpy_richcompare,              /* tp_richcompare */
   0,                             /* tp_weaklistoffset */
   blpy_iter,                     /* tp_iter */
   0,                             /* tp_iternext */