@@ -473,7 +473,7 @@ PyTypeObject Definition
473473----------------------- 
474474
475475The structure definition for :c:type: `PyTypeObject ` can be found in
476- :file: `Include/object.h `.  For convenience of reference, this repeats the
476+ :file: `Include/cpython/ object.h `.  For convenience of reference, this repeats the
477477definition found there:
478478
479479..  XXX Drop this?
@@ -559,6 +559,9 @@ PyVarObject Slots
559559   initialized to zero. For :ref: `dynamically allocated type objects 
560560   <heap-types>`, this field has a special internal meaning.
561561
562+    This field should be accessed using the :c:func: `Py_SIZE() ` and
563+    :c:func: `Py_SET_SIZE() ` macros.
564+ 
562565   **Inheritance: **
563566
564567   This field is not inherited by subtypes.
@@ -609,47 +612,86 @@ and :c:data:`PyType_Type` effectively act as defaults.)
609612
610613
611614.. c :member :: Py_ssize_t PyTypeObject.tp_basicsize 
612-              Py_ssize_t PyTypeObject.tp_itemsize 
615+                Py_ssize_t PyTypeObject.tp_itemsize 
613616
614617    These fields allow calculating the size in bytes of instances of the type.
615618
616619   There are two kinds of types: types with fixed-length instances have a zero
617-    :c:member: `~PyTypeObject.tp_itemsize ` field, types with variable-length instances have a non-zero
618-    :c:member: `~PyTypeObject.tp_itemsize ` field.  For a type with fixed-length instances, all
619-    instances have the same size, given in :c:member: `~PyTypeObject.tp_basicsize `.
620+    :c:member: `!tp_itemsize ` field, types with variable-length instances have a non-zero
621+    :c:member: `!tp_itemsize ` field.  For a type with fixed-length instances, all
622+    instances have the same size, given in :c:member: `!tp_basicsize `.
623+    (Exceptions to this rule can be made using
624+    :c:func: `PyUnstable_Object_GC_NewWithExtraData `.)
620625
621626   For a type with variable-length instances, the instances must have an
622-    :c:member: `~PyVarObject.ob_size ` field, and the instance size is :c:member: `~PyTypeObject.tp_basicsize ` plus N
623-    times :c:member: `~PyTypeObject.tp_itemsize `, where N is the "length" of the object.  The value of
624-    N is typically stored in the instance's :c:member: `~PyVarObject.ob_size ` field.  There are
625-    exceptions:  for example, ints use a negative :c:member: `~PyVarObject.ob_size ` to indicate a
626-    negative number, and N is ``abs(ob_size) `` there.  Also, the presence of an
627-    :c:member: `~PyVarObject.ob_size ` field in the instance layout doesn't mean that the instance
628-    structure is variable-length (for example, the structure for the list type has
629-    fixed-length instances, yet those instances have a meaningful :c:member: `~PyVarObject.ob_size `
630-    field).
631- 
632-    The basic size includes the fields in the instance declared by the macro
633-    :c:macro: `PyObject_HEAD ` or :c:macro: `PyObject_VAR_HEAD ` (whichever is used to
634-    declare the instance struct) and this in turn includes the  :c:member: `~PyObject._ob_prev ` and
635-    :c:member: `~PyObject._ob_next ` fields if they are present.  This means that the only correct
636-    way to get an initializer for the :c:member: `~PyTypeObject.tp_basicsize ` is to use the
637-    ``sizeof `` operator on the struct used to declare the instance layout.
638-    The basic size does not include the GC header size.
627+    :c:member: `~PyVarObject.ob_size ` field, and the instance size is
628+    :c:member: `!tp_basicsize ` plus N times :c:member: `!tp_itemsize `,
629+    where N is the "length" of the object.
630+ 
631+    Functions like :c:func: `PyObject_NewVar ` will take the value of N as an
632+    argument, and store in the instance's :c:member: `~PyVarObject.ob_size ` field.
633+    Note that the :c:member: `~PyVarObject.ob_size ` field may later be used for
634+    other purposes. For example, :py:type: `int ` instances use the bits of
635+    :c:member: `~PyVarObject.ob_size ` in an implementation-defined
636+    way; the underlying storage and its size should be acessed using
637+    :c:func: `PyLong_Export `.
638+ 
639+    .. note ::
639640
640-    A note about alignment: if the variable items require a particular alignment,
641-    this should be taken care of by the value of :c:member: `~PyTypeObject.tp_basicsize `.  Example:
642-    suppose a type implements an array of ``double ``. :c:member: `~PyTypeObject.tp_itemsize ` is
643-    ``sizeof(double) ``. It is the programmer's responsibility that
644-    :c:member: `~PyTypeObject.tp_basicsize ` is a multiple of ``sizeof(double) `` (assuming this is the
645-    alignment requirement for ``double ``).
641+       The :c:member: `~PyVarObject.ob_size ` field should be accessed using
642+       the :c:func: `Py_SIZE() ` and :c:func: `Py_SET_SIZE() ` macros.
646643
647-    For any type with variable-length instances, this field must not be ``NULL ``.
644+    Also, the presence of an :c:member: `~PyVarObject.ob_size ` field in the
645+    instance layout doesn't mean that the instance structure is variable-length.
646+    For example, the :py:type: `list ` type has fixed-length instances, yet those
647+    instances have a :c:member: `~PyVarObject.ob_size ` field.
648+    (As with :py:type: `int `, avoid reading lists' :c:member: `!ob_size ` directly.
649+    Call :c:func: `PyList_Size ` instead.)
650+ 
651+    The :c:member: `!tp_basicsize ` includes size needed for data of the type's
652+    :c:member: `~PyTypeObject.tp_base `, plus any extra data needed
653+    by each instance.
654+ 
655+    The  correct way to set :c:member: `!tp_basicsize ` is to use the
656+    ``sizeof `` operator on the struct used to declare the instance layout.
657+    This struct must include the struct used to declare the base type.
658+    In other words, :c:member: `!tp_basicsize ` must be greater than or equal
659+    to the base's :c:member: `!tp_basicsize `.
660+ 
661+    Since every type is a subtype of :py:type: `object `, this struct must
662+    include :c:type: `PyObject ` or :c:type: `PyVarObject ` (depending on
663+    whether :c:member: `~PyVarObject.ob_size ` should be included). These are
664+    usually defined by the macro :c:macro: `PyObject_HEAD ` or
665+    :c:macro: `PyObject_VAR_HEAD `, respectively.
666+ 
667+    The basic size does not include the GC header size, as that header is not
668+    part of :c:macro: `PyObject_HEAD `.
669+ 
670+    For cases where struct used to declare the base type is unknown,
671+    see :c:member: `PyType_Spec.basicsize ` and :c:func: `PyType_FromMetaclass `.
672+ 
673+    Notes about alignment:
674+ 
675+    - :c:member: `!tp_basicsize ` must be a multiple of ``_Alignof(PyObject) ``.
676+      When using ``sizeof `` on a ``struct `` that includes
677+      :c:macro: `PyObject_HEAD `, as recommended, the compiler ensures this.
678+      When not using a C ``struct ``, or when using compiler
679+      extensions like ``__attribute__((packed)) ``, it is up to you.
680+    - If the variable items require a particular alignment,
681+      :c:member: `!tp_basicsize ` and :c:member: `!tp_itemsize ` must each be a
682+      multiple of that alignment.
683+      For example, if a type's variable part stores a ``double ``, it is
684+      your responsibility that both fields are a multiple of
685+      ``_Alignof(double) ``.
648686
649687   **Inheritance: **
650688
651-    These fields are inherited separately by subtypes.  If the base type has a
652-    non-zero :c:member: `~PyTypeObject.tp_itemsize `, it is generally not safe to set
689+    These fields are inherited separately by subtypes.
690+    (That is, if the field is set to zero, :c:func: `PyType_Ready ` will copy
691+    the value from the base type, indicating that the instances do not
692+    need additional storage.)
693+ 
694+    If the base type has a non-zero :c:member: `~PyTypeObject.tp_itemsize `, it is generally not safe to set
653695   :c:member: `~PyTypeObject.tp_itemsize ` to a different non-zero value in a subtype (though this
654696   depends on the implementation of the base type).
655697
0 commit comments