Opaque PyObject structure — pythoncapi 0.1 documentation (original) (raw)
A blocker issue for many optimization ideas is that thePyObject
structure fields are exposed in the public C API. Example:
PyObject * PyUnicode_FromObject(PyObject *obj) { ... PyErr_Format(PyExc_TypeError, "Can't convert '%.100s' object to str implicitly", Py_TYPE(obj)->tp_name); return NULL; }
with:
#define Py_TYPE(ob) (_PyObject_CAST(ob)->ob_type) #define _PyObject_CAST(op) ((PyObject*)(op))
The issue is that obj->ob_type
is accessed directly. It prevents to implement Tagged pointers for example.
By the way, Py_TYPE()
returns a borrowed referencewhich is another kind of problem. See Py_TYPE() corner case.
In the long term, PyObject
structure should be opaque. Accessingob_refcnt
and ob_type
fields should always go through functions.
XXX which functions?
XXX how to convert old code to these new functions?