Also compare frame_id_is_next in frapy_richcompare
authorHannes Domani <ssbssa@yahoo.de>
Fri, 18 Dec 2020 17:23:41 +0000 (18:23 +0100)
committerHannes Domani <ssbssa@yahoo.de>
Sun, 7 Feb 2021 18:08:23 +0000 (19:08 +0100)
The last frame in a corrupt stack stores the frame_id of the next frame,
so these two frames currently compare as equal.

So if you have a backtrace where the oldest frame is corrupt, this happens:

(gdb) py
 >f = gdb.selected_frame()
 >while f.older():
 >  f = f.older()
 >print(f == f.newer())
 >end
True

With this change, that same example returns False.

gdb/ChangeLog:

2021-02-07  Hannes Domani  <ssbssa@yahoo.de>

* python/py-frame.c (frapy_richcompare): Compare frame_id_is_next.

gdb/ChangeLog
gdb/python/py-frame.c

index 78cd0590e518a18a5bbbdcfa7efe4d2d0fead1eb..9e66fad08022d237a5925cf3bf00e00c97bb383d 100644 (file)
@@ -1,3 +1,7 @@
+2021-02-07  Hannes Domani  <ssbssa@yahoo.de>
+
+       * python/py-frame.c (frapy_richcompare): Compare frame_id_is_next.
+
 2021-02-05  Simon Marchi  <simon.marchi@polymtl.ca>
 
        * symmisc.c (std_in, std_out, std_err): Remove.
index 5c027547825a3ae0b385ee34efa37ca813825af9..8e32ba55de4909c25326aed7fc39c7e672a43093 100644 (file)
@@ -658,8 +658,11 @@ frapy_richcompare (PyObject *self, PyObject *other, int op)
       return Py_NotImplemented;
     }
 
-  if (frame_id_eq (((frame_object *) self)->frame_id,
-                  ((frame_object *) other)->frame_id))
+  frame_object *self_frame = (frame_object *) self;
+  frame_object *other_frame = (frame_object *) other;
+
+  if (self_frame->frame_id_is_next == other_frame->frame_id_is_next
+      && frame_id_eq (self_frame->frame_id, other_frame->frame_id))
     result = Py_EQ;
   else
     result = Py_NE;