Uploaded image for project: 'Qt for Python'
  1. Qt for Python
  2. PYSIDE-1422

Signal crashes when class defined __eq__

    XMLWordPrintable

Details

    • Bug
    • Resolution: Fixed
    • P2: Important
    • 5.15.4
    • 5.15.1
    • PySide
    • None
    • 28fe4291c29d3f8333a126c6e58f1ecb163e3ea6 (pyside/pyside-setup/dev) 3f55b0f6c6e566bf83a0ffcc626d085ae01d640c (pyside/tqtc-pyside-setup/5.15)

    Description

      When a class defines __eq__, a signal on this class will crash immediately when connected.
      Example code:

      from PySide6 import QtCore
      from PySide6 import QtWidgets
      
      class Main:
          def setup(self):
              self.input_dialog = QtWidgets.QInputDialog()
      
              print('before', flush=True)
              self.input_dialog.accepted.connect(self.input_accepted)
              print('after', flush=True)
      
          def input_accepted(self):
              pass
      
          def __eq__(self, other): return super().__eq__(other)
          # def __hash__(self): return id(self)
      
      def main():
          application = QtWidgets.QApplication([])
          main_object = Main()
          main_object.setup()
          QtCore.QTimer.singleShot(0, application.quit)
          application.exec_()
      
      if __name__ == "__main__":
          main()
      

      When we also define a __hash__ function, everything works, again.

      What happens?

      In the implementation, PyObject_Hash is called, both on the signal function and on the class instance.
      The class instance by default is hashable by PyObject s default, but when __eq__ gets explicitly
      defined, the default __hash__ is gone.

      The second hash call then creates an undetected error, which in turn has the effect that new types
      cannot be created, and we segfault.

      Solution: We don't call __hash__ a second time, but use the object address directly.
      That has no negative effect on the hash function since random plus some offset remains random.

      Attachments

        1. pyside1422_stack.txt
          6 kB
        2. pyside1422.py
          0.7 kB

        Issue Links

          No reviews matched the request. Check your Options in the drop-down menu of this sections header.

          Activity

            People

              ctismer Christian Tismer
              ctismer Christian Tismer
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Gerrit Reviews

                  There are no open Gerrit changes