aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Doc/c-api
diff options
context:
space:
mode:
Diffstat (limited to 'Doc/c-api')
-rw-r--r--Doc/c-api/code.rst65
-rw-r--r--Doc/c-api/structures.rst75
-rw-r--r--Doc/c-api/typeobj.rst11
-rw-r--r--Doc/c-api/veryhigh.rst8
4 files changed, 133 insertions, 26 deletions
diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst
index 42594f063b0..717b0da8f87 100644
--- a/Doc/c-api/code.rst
+++ b/Doc/c-api/code.rst
@@ -211,6 +211,71 @@ bound into a function.
.. versionadded:: 3.12
+.. _c_codeobject_flags:
+
+Code Object Flags
+-----------------
+
+Code objects contain a bit-field of flags, which can be retrieved as the
+:attr:`~codeobject.co_flags` Python attribute (for example using
+:c:func:`PyObject_GetAttrString`), and set using a *flags* argument to
+:c:func:`PyUnstable_Code_New` and similar functions.
+
+Flags whose names start with ``CO_FUTURE_`` correspond to features normally
+selectable by :ref:`future statements <future>`. These flags can be used in
+:c:member:`PyCompilerFlags.cf_flags`.
+Note that many ``CO_FUTURE_`` flags are mandatory in current versions of
+Python, and setting them has no effect.
+
+The following flags are available.
+For their meaning, see the linked documentation of their Python equivalents.
+
+
+.. list-table::
+ :widths: auto
+ :header-rows: 1
+
+ * * Flag
+ * Meaning
+ * * .. c:macro:: CO_OPTIMIZED
+ * :py:data:`inspect.CO_OPTIMIZED`
+ * * .. c:macro:: CO_NEWLOCALS
+ * :py:data:`inspect.CO_NEWLOCALS`
+ * * .. c:macro:: CO_VARARGS
+ * :py:data:`inspect.CO_VARARGS`
+ * * .. c:macro:: CO_VARKEYWORDS
+ * :py:data:`inspect.CO_VARKEYWORDS`
+ * * .. c:macro:: CO_NESTED
+ * :py:data:`inspect.CO_NESTED`
+ * * .. c:macro:: CO_GENERATOR
+ * :py:data:`inspect.CO_GENERATOR`
+ * * .. c:macro:: CO_COROUTINE
+ * :py:data:`inspect.CO_COROUTINE`
+ * * .. c:macro:: CO_ITERABLE_COROUTINE
+ * :py:data:`inspect.CO_ITERABLE_COROUTINE`
+ * * .. c:macro:: CO_ASYNC_GENERATOR
+ * :py:data:`inspect.CO_ASYNC_GENERATOR`
+ * * .. c:macro:: CO_HAS_DOCSTRING
+ * :py:data:`inspect.CO_HAS_DOCSTRING`
+ * * .. c:macro:: CO_METHOD
+ * :py:data:`inspect.CO_METHOD`
+
+ * * .. c:macro:: CO_FUTURE_DIVISION
+ * no effect (:py:data:`__future__.division`)
+ * * .. c:macro:: CO_FUTURE_ABSOLUTE_IMPORT
+ * no effect (:py:data:`__future__.absolute_import`)
+ * * .. c:macro:: CO_FUTURE_WITH_STATEMENT
+ * no effect (:py:data:`__future__.with_statement`)
+ * * .. c:macro:: CO_FUTURE_PRINT_FUNCTION
+ * no effect (:py:data:`__future__.print_function`)
+ * * .. c:macro:: CO_FUTURE_UNICODE_LITERALS
+ * no effect (:py:data:`__future__.unicode_literals`)
+ * * .. c:macro:: CO_FUTURE_GENERATOR_STOP
+ * no effect (:py:data:`__future__.generator_stop`)
+ * * .. c:macro:: CO_FUTURE_ANNOTATIONS
+ * :py:data:`__future__.annotations`
+
+
Extra information
-----------------
diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst
index 987bc167c68..58dd915e04f 100644
--- a/Doc/c-api/structures.rst
+++ b/Doc/c-api/structures.rst
@@ -28,18 +28,52 @@ under :ref:`reference counting <countingrefs>`.
object. In a normal "release" build, it contains only the object's
reference count and a pointer to the corresponding type object.
Nothing is actually declared to be a :c:type:`PyObject`, but every pointer
- to a Python object can be cast to a :c:expr:`PyObject*`. Access to the
- members must be done by using the macros :c:macro:`Py_REFCNT` and
- :c:macro:`Py_TYPE`.
+ to a Python object can be cast to a :c:expr:`PyObject*`.
+
+ The members must not be accessed directly; instead use macros such as
+ :c:macro:`Py_REFCNT` and :c:macro:`Py_TYPE`.
+
+ .. c:member:: Py_ssize_t ob_refcnt
+
+ The object's reference count, as returned by :c:macro:`Py_REFCNT`.
+ Do not use this field directly; instead use functions and macros such as
+ :c:macro:`!Py_REFCNT`, :c:func:`Py_INCREF` and :c:func:`Py_DecRef`.
+
+ The field type may be different from ``Py_ssize_t``, depending on
+ build configuration and platform.
+
+ .. c:member:: PyTypeObject* ob_type
+
+ The object's type.
+ Do not use this field directly; use :c:macro:`Py_TYPE` and
+ :c:func:`Py_SET_TYPE` instead.
.. c:type:: PyVarObject
- This is an extension of :c:type:`PyObject` that adds the :c:member:`~PyVarObject.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.
- Access to the members must be done by using the macros
- :c:macro:`Py_REFCNT`, :c:macro:`Py_TYPE`, and :c:macro:`Py_SIZE`.
+ An extension of :c:type:`PyObject` that adds the
+ :c:member:`~PyVarObject.ob_size` field.
+ This is intended for objects that have some notion of *length*.
+
+ As with :c:type:`!PyObject`, the members must not be accessed directly;
+ instead use macros such as :c:macro:`Py_SIZE`, :c:macro:`Py_REFCNT` and
+ :c:macro:`Py_TYPE`.
+
+ .. c:member:: Py_ssize_t ob_size
+
+ A size field, whose contents should be considered an object's internal
+ implementation detail.
+
+ Do not use this field directly; use :c:macro:`Py_SIZE` instead.
+
+ Object creation functions such as :c:func:`PyObject_NewVar` will
+ generally set this field to the requested size (number of items).
+ After creation, arbitrary values can be stored in :c:member:`!ob_size`
+ using :c:macro:`Py_SET_SIZE`.
+
+ To get an object's publicly exposed length, as returned by
+ the Python function :py:func:`len`, use :c:func:`PyObject_Length`
+ instead.
.. c:macro:: PyObject_HEAD
@@ -103,9 +137,8 @@ under :ref:`reference counting <countingrefs>`.
Get the type of the Python object *o*.
- Return a :term:`borrowed reference`.
-
- Use the :c:func:`Py_SET_TYPE` function to set an object type.
+ The returned reference is :term:`borrowed <borrowed reference>` from *o*.
+ Do not release it with :c:func:`Py_DECREF` or similar.
.. versionchanged:: 3.11
:c:func:`Py_TYPE()` is changed to an inline static function.
@@ -122,16 +155,26 @@ under :ref:`reference counting <countingrefs>`.
.. c:function:: void Py_SET_TYPE(PyObject *o, PyTypeObject *type)
- Set the object *o* type to *type*.
+ Set the type of object *o* to *type*, without any checking or reference
+ counting.
+
+ This is a very low-level operation.
+ Consider instead setting the Python attribute :attr:`~object.__class__`
+ using :c:func:`PyObject_SetAttrString` or similar.
+
+ Note that assigning an incompatible type can lead to undefined behavior.
+
+ If *type* is a :ref:`heap type <heap-types>`, the caller must create a
+ new reference to it.
+ Similarly, if the old type of *o* is a heap type, the caller must release
+ a reference to that type.
.. versionadded:: 3.9
.. c:function:: Py_ssize_t Py_SIZE(PyVarObject *o)
- Get the size of the Python object *o*.
-
- Use the :c:func:`Py_SET_SIZE` function to set an object size.
+ Get the :c:member:`~PyVarObject.ob_size` field of *o*.
.. versionchanged:: 3.11
:c:func:`Py_SIZE()` is changed to an inline static function.
@@ -140,7 +183,7 @@ under :ref:`reference counting <countingrefs>`.
.. c:function:: void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size)
- Set the object *o* size to *size*.
+ Set the :c:member:`~PyVarObject.ob_size` field of *o* to *size*.
.. versionadded:: 3.9
diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst
index af2bead3bb5..060d6f60174 100644
--- a/Doc/c-api/typeobj.rst
+++ b/Doc/c-api/typeobj.rst
@@ -492,9 +492,9 @@ metatype) initializes :c:member:`~PyTypeObject.tp_itemsize`, which means that it
type objects) *must* have the :c:member:`~PyVarObject.ob_size` field.
-.. c:member:: Py_ssize_t PyObject.ob_refcnt
+:c:member:`PyObject.ob_refcnt`
- This is the type object's reference count, initialized to ``1`` by the
+ The type object's reference count is initialized to ``1`` by the
``PyObject_HEAD_INIT`` macro. Note that for :ref:`statically allocated type
objects <static-types>`, the type's instances (objects whose :c:member:`~PyObject.ob_type`
points back to the type) do *not* count as references. But for
@@ -506,7 +506,7 @@ type objects) *must* have the :c:member:`~PyVarObject.ob_size` field.
This field is not inherited by subtypes.
-.. c:member:: PyTypeObject* PyObject.ob_type
+:c:member:`PyObject.ob_type`
This is the type's type, in other words its metatype. It is initialized by the
argument to the ``PyObject_HEAD_INIT`` macro, and its value should normally be
@@ -532,14 +532,13 @@ type objects) *must* have the :c:member:`~PyVarObject.ob_size` field.
PyVarObject Slots
-----------------
-.. c:member:: Py_ssize_t PyVarObject.ob_size
+:c:member:`PyVarObject.ob_size`
For :ref:`statically allocated type objects <static-types>`, this should be
initialized to zero. For :ref:`dynamically allocated type objects
<heap-types>`, this field has a special internal meaning.
- This field should be accessed using the :c:func:`Py_SIZE()` and
- :c:func:`Py_SET_SIZE()` macros.
+ This field should be accessed using the :c:func:`Py_SIZE()` macro.
**Inheritance:**
diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst
index 1ef4181d52e..fb07fec7eff 100644
--- a/Doc/c-api/veryhigh.rst
+++ b/Doc/c-api/veryhigh.rst
@@ -361,7 +361,7 @@ the same library that the Python runtime is using.
:py:mod:`!ast` Python module, which exports these constants under
the same names.
- .. c:var:: int CO_FUTURE_DIVISION
-
- This bit can be set in *flags* to cause division operator ``/`` to be
- interpreted as "true division" according to :pep:`238`.
+ The "``PyCF``" flags above can be combined with "``CO_FUTURE``" flags such
+ as :c:macro:`CO_FUTURE_ANNOTATIONS` to enable features normally
+ selectable using :ref:`future statements <future>`.
+ See :ref:`c_codeobject_flags` for a complete list.