On 08.12.19 09:49, Nick Coghlan wrote: > On Fri., 6 Dec. 2019, 3:31 am Christian Tismer, <tis...@stackless.com > <mailto:tis...@stackless.com>> wrote: > > Hi guys, > > during the last few weeks I have been struggling quite much > in order to make PySide run with Python 3.8 at all. > > The expected problems were refcounting leaks due to changed > handling of heaptypes. But in fact, the runtime behavior was > much worse, because I always got negative refcounts! > > After exhaustive searching through the different 3.8 commits, I could > isolate the three problems with logarithmic search. > > The hard problem was this: > Whenever PySide creates a new type, it crashes in PyType_Ready. > The reason is the existence of the Py_TPFLAGS_METHOD_DESCRIPTOR > flag. > During the PyType_Ready call, the function mro() is called. > This mro() call results in a negative refcount, because something > behaves differently since this flag is set by default in mro(). > > When I patched this flag away during the type_new call, everything > worked ok. I don't understand why this problem affects PySide > at all. Here is the code that would normally be only the newType line: > > > // PYSIDE-939: This is a temporary patch that circumvents the > problem > // with Py_TPFLAGS_METHOD_DESCRIPTOR until this is finally solved. > PyObject *ob_PyType_Type = reinterpret_cast<PyObject > *>(&PyType_Type); > PyObject *mro = PyObject_GetAttr(ob_PyType_Type, > Shiboken::PyName::mro()); > auto hold = Py_TYPE(mro)->tp_flags; > Py_TYPE(mro)->tp_flags &= ~Py_TPFLAGS_METHOD_DESCRIPTOR; > auto *newType = reinterpret_cast<SbkObjectType *>(type_new(metatype, > args, kwds)); > Py_TYPE(mro)->tp_flags = hold; > > > Isn't this manipulating the flags in the tuple type, rather than > anything on a custom object? Or is "mro" a custom object rather than an > MRO tuple?
no, "mro" is the default mro implementation which is a method descriptor of the standard PyTypeType object. The implementation of PyType_Ready just touches the mro in some helper function lookup_maybe_method. This is so funny: This side effect seems to be totally unrelated to PySide, but something we are doing wrong. > If anything, given the combination of factors required to reproduce the > problem, I would guess that there might be a ref counting problem in the > __set_owner__ invocations when called on a new type rather than a > regular instance, and that was somehow affected by the change to > increment the type refcount in PyObject_Init rather than > PyType_GenericAlloc. Thanks a lot! I will try to use that to find finally what's wrong. Cheers -- Chris -- Christian Tismer :^) tis...@stackless.com Software Consulting : http://www.stackless.com/ Karl-Liebknecht-Str. 121 : https://github.com/PySide 14482 Potsdam : GPG key -> 0xFB7BEE0E phone +49 173 24 18 776 fax +49 (30) 700143-0023 _______________________________________________ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-le...@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/VGHUHPRPUTNEKZL7HT22W5V2VWCL6BOZ/ Code of Conduct: http://python.org/psf/codeofconduct/