summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGregory P. Smith <greg@krypto.org>2015-04-14 18:12:53 (GMT)
committerGregory P. Smith <greg@krypto.org>2015-04-14 18:12:53 (GMT)
commit1b24465c93a1ed757999e67eb784f0125a89fca1 (patch)
tree7f77daacc7ae76270fdd75c60889b5f415bae5f5
parent23a6a0daa1c02f3d3568be4053669183e3f91cbb (diff)
downloadcpython-1b24465c93a1ed757999e67eb784f0125a89fca1.zip
cpython-1b24465c93a1ed757999e67eb784f0125a89fca1.tar.gz
cpython-1b24465c93a1ed757999e67eb784f0125a89fca1.tar.bz2
issue9014: Properly document PyObject_HEAD and friends post-PEP-3123.
-rw-r--r--Doc/c-api/structures.rst70
1 files changed, 41 insertions, 29 deletions
diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst
index 66a3443..7f01c31 100644
--- a/Doc/c-api/structures.rst
+++ b/Doc/c-api/structures.rst
@@ -21,53 +21,65 @@ the definition of all other Python objects.
All object types are extensions of this type. This is a type which
contains the information Python needs to treat a pointer to an object as an
object. In a normal "release" build, it contains only the object's
- reference count and a pointer to the corresponding type object. It
- corresponds to the fields defined by the expansion of the ``PyObject_HEAD``
- macro.
+ reference count and a pointer to the corresponding type object.
+ Nothing is actually declared to be a PyObject, but every pointer to a
+ Python object can be cast to a PyObject*. Access to the members
+ must be done by using the macros :c:macro:`Py_REFCNT` and
+ :c:macro:`Py_TYPE`.
.. c:type:: PyVarObject
This is an extension of :c:type:`PyObject` that adds the :attr:`ob_size`
field. This is only used for objects that have some notion of *length*.
- This type does not often appear in the Python/C API. It corresponds to the
- fields defined by the expansion of the ``PyObject_VAR_HEAD`` macro.
+ This type does not often appear in the Python/C API.
+ Access to the members must be done by using the macros
+ :c:macro:`Py_REFCNT`, :c:macro:`Py_TYPE`, and :c:macro:`Py_SIZE`.
-These macros are used in the definition of :c:type:`PyObject` and
-:c:type:`PyVarObject`:
-
-.. XXX need to document PEP 3123 changes here
.. c:macro:: PyObject_HEAD
- This is a macro which expands to the declarations of the fields of the
- :c:type:`PyObject` type; it is used when declaring new types which represent
- objects without a varying length. The specific fields it expands to depend
- on the definition of :c:macro:`Py_TRACE_REFS`. By default, that macro is
- not defined, and :c:macro:`PyObject_HEAD` expands to::
-
- Py_ssize_t ob_refcnt;
- PyTypeObject *ob_type;
+ This is a macro used when declaring new types which represent objects
+ without a varying length. The PyObject_HEAD macro expands to::
- When :c:macro:`Py_TRACE_REFS` is defined, it expands to::
+ PyObject ob_base;
- PyObject *_ob_next, *_ob_prev;
- Py_ssize_t ob_refcnt;
- PyTypeObject *ob_type;
+ See documentation of :c:type::`PyObject` above.
.. c:macro:: PyObject_VAR_HEAD
- This is a macro which expands to the declarations of the fields of the
- :c:type:`PyVarObject` type; it is used when declaring new types which
- represent objects with a length that varies from instance to instance.
- This macro always expands to::
+ This is a macro used when declaring new types which represent objects
+ with a length that varies from instance to instance.
+ The PyObject_VAR_HEAD macro expands to::
+
+ PyVarObject ob_base;
+
+ See documentation of :c:type:`PyVarObject` above.
+
+
+.. c:macro:: Py_TYPE(o)
+
+ This macro is used to access the `ob_type` member of a Python object.
+ It expands to::
+
+ (((PyObject*)(o))->ob_type)
+
+
+.. c:macro:: Py_REFCNT(o)
+
+ This macro is used to access the `ob_refcnt` member of a Python object.
+ It expands to::
+
+ (((PyObject*)(o))->ob_refcnt)
+
+
+.. c:macro:: Py_SIZE(o)
- PyObject_HEAD
- Py_ssize_t ob_size;
+ This macro is used to access the `ob_size` member of a Python object.
+ It expands to::
- Note that :c:macro:`PyObject_HEAD` is part of the expansion, and that its own
- expansion varies depending on the definition of :c:macro:`Py_TRACE_REFS`.
+ (((PyVarObject*)(o))->ob_size)
.. c:macro:: PyObject_HEAD_INIT(type)