New submission from Segev Finer <segev...@gmail.com>:

This section in the documentation 
https://docs.python.org/3.7/howto/cporting.html#module-initialization-and-state 
shows how to implement an extension module that works for both Python 2 and 3. 
It also shows how to use m_size to manage module state instead of using static 
globals. But it omits implementing m_free. This is also done in 
https://www.python.org/dev/peps/pep-3121/#example

To my understanding, m_clear is *only* called by the Python GC when the object 
is a part of a reference cycle. It won't be called for a normal free when the 
object wasn't a part of a reference cycle. This means that for such a case the 
objects referenced in the state structure will leak!

Looking around the standard library, it seems the extension modules there point 
m_free to calling the function used to implement m_clear.

The documentation of the structure is also quite unclear on the subject 
https://docs.python.org/3/c-api/module.html?highlight=pymoduledef#c.PyModuleDef.

P.S. There is also no freeing/DECREF-ing stuff in the state on error in the 
Python 2 case, but I think even the standard library is like this.

----------
assignee: docs@python
components: Documentation
messages: 323955
nosy: Segev Finer, docs@python
priority: normal
severity: normal
status: open
title: Possibly misleading/wrong documentation about PyModuleDef.m_free
type: enhancement
versions: Python 3.7, Python 3.8

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue34478>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to