I’ll be adding a change to move the Py_INCREF of heap allocated types from 
PyType_GenericAlloc to PyObject_Init. You can follow the discussion and/or add 
comments to: https://bugs.python.org/issue35810. This change will make types 
created through PyType_FromSpec behave like classes in managed code. Thus, 
making CPython much safer.

Without this change, there are a couple of edge cases where the use of 
PyObject_{,GC}_New{,Var} does not correctly increase refcount. This leads to 
weird behavior, especially when migrating types from PyType_Ready to 
PyType_FromSpec. For example, consider a static type with tp_new = NULL and 
tp_dealloc = NULL. This type initializes instances through PyObject_New and 
never increases the type’s refcount. tp_dealloc will be a no-op since it's NULL 
and it's a static type. When this type is migrated to PyType_FromSpec, 
tp_dealloc will now inherit subtype_dealloc which decrefs the type. This leads 
to a crash.

For the vast majority of existing code this should not have a visible side 
effect. And, at worst, this will only cause some type to become immortal. I’ve 
added instructions in the “Porting to Python 3.8” to correctly account for this 
new incref along with examples. In general, there are only two cases that would 
require any modification:

  1.  If the type creates instances through PyObject_{,GC}_New{,Var} and the 
type manually increfs afterwards. The fix here is to remove that manual incref.
  2.  If the type has a custom tp_dealloc and it’s not decrefing the type. The 
fix here is that a custom tp_dealloc should ALWAYS decref the type.

Open to feedback/discussion so feel free to reply if you have any questions!

- Eddie Elizondo
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to