GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — Add Py_HOLD_REF() macro to hold a strong reference to a Python object while executing code · Issue #99481 · python/cpython Closed Labels type-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error DescriptionReference counting in Python is complicated. It's never obvious if we are holding a strong reference or a borrowed reference to a Python object. If we have a borrowed reference to a Python object, to make sure that it cannot be deleted while we execute arbitrary Python code, it's needed to creating a temporary strong reference by increasing temporarily its reference counter. Example from The scls variable is assigned to a borrowed reference to a list item. The list is the result of the IMO in terms of semantics, such code is hard to understand if read aloud in English, since INCREF and DECREF modify the object in-place. Py_INCREF() and Py_DECREF() are like the low-level implementation, I would prefer to have an abstraction on top of it. That's also why I added It would be nice to have a macro to clarify the scope of the temporary strong reference rather than having to INCREF/DECREF temporarily. Something like: #define Py_HOLD_REF(var, code) \ Py_INCREF(var); \ code; \ Py_DECREF(var) Example of usage: Py_HOLD_REF(scls, int r = PyObject_IsSubclass(subclass, scls); ); Example holding two (different) strong references: Py_HOLD_REF(keys, Py_HOLD_REF(values, PyObject *res = PyTuple_Pack(2, keys, values); ) // note: there is no ";" here ); Alternative compact syntax: Py_HOLD_REF(keys, Py_HOLD_REF(values, PyObject *res = PyTuple_Pack(2, keys, values); )); Obviously, the macro name is open for bikeshedding :-) Activity
MetadataMetadataAssigneesLabelstype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error ProjectsMilestoneRelationshipsDevelopmentIssue actions |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |