@@ -587,47 +587,81 @@ and :c:data:`PyType_Type` effectively act as defaults.)
587587
588588
589589.. c :member :: Py_ssize_t PyTypeObject.tp_basicsize 
590-              Py_ssize_t PyTypeObject.tp_itemsize 
590+                Py_ssize_t PyTypeObject.tp_itemsize 
591591
592592
593593
594594   There are two kinds of types: types with fixed-length instances have a zero
595-    :c:member: `~PyTypeObject.tp_itemsize ` field, types with variable-length instances have a non-zero
596-    :c:member: `~PyTypeObject.tp_itemsize ` field.  For a type with fixed-length instances, all
597-    instances have the same size, given in :c:member: `~PyTypeObject.tp_basicsize `.
595+    :c:member: `!tp_itemsize ` field, types with variable-length instances have a non-zero
596+    :c:member: `!tp_itemsize ` field.  For a type with fixed-length instances, all
597+    instances have the same size, given in :c:member: `!tp_basicsize `.
598+    (Exceptions to this rule can be made using
599+    :c:func: `PyUnstable_Object_GC_NewWithExtraData `.)
598600
599601   For a type with variable-length instances, the instances must have an
600-    :c:member: `~PyVarObject.ob_size ` field, and the instance size is :c:member: `~PyTypeObject.tp_basicsize ` plus N
601-    times :c:member: `~PyTypeObject.tp_itemsize `, where N is the "length" of the object.  The value of
602-    N is typically stored in the instance's :c:member: `~PyVarObject.ob_size ` field.  There are
603-    exceptions:  for example, ints use a negative :c:member: `~PyVarObject.ob_size ` to indicate a
604-    negative number, and N is ``abs(ob_size) `` there.  Also, the presence of an
605-    :c:member: `~PyVarObject.ob_size ` field in the instance layout doesn't mean that the instance
606-    structure is variable-length (for example, the structure for the list type has
607-    fixed-length instances, yet those instances have a meaningful :c:member: `~PyVarObject.ob_size `
608-    field).
609- 
610-    The basic size includes the fields in the instance declared by the macro
611-    :c:macro: `PyObject_HEAD ` or :c:macro: `PyObject_VAR_HEAD ` (whichever is used to
612-    declare the instance struct) and this in turn includes the  :c:member: `~PyObject._ob_prev ` and
613-    :c:member: `~PyObject._ob_next ` fields if they are present.  This means that the only correct
614-    way to get an initializer for the :c:member: `~PyTypeObject.tp_basicsize ` is to use the
602+    :c:member: `~PyVarObject.ob_size ` field, and the instance size is
603+    :c:member: `!tp_basicsize ` plus N times :c:member: `!tp_itemsize `,
604+    where N is the "length" of the object.
605+ 
606+    Functions like :c:func: `PyObject_NewVar ` will take the value of N as an
607+    argument, and store in the instance's :c:member: `~PyVarObject.ob_size ` field.
608+    Note that the :c:member: `~PyVarObject.ob_size ` field may later be used for
609+    other purposes. For example, :py:type: `int ` instances use the bits of
610+    :c:member: `~PyVarObject.ob_size ` in an implementation-defined
611+    way; the underlying storage and its size should be acessed using
612+    :c:func: `PyLong_Export `.
613+ 
614+    Also, the presence of an :c:member: `~PyVarObject.ob_size ` field in the
615+    instance layout doesn't mean that the instance structure is variable-length.
616+    For example, the :py:type: `list ` type has fixed-length instances, yet those
617+    instances have a :c:member: `~PyVarObject.ob_size ` field.
618+    (As with :py:type: `int `, avoid reading lists' :c:member: `!ob_size ` directly.
619+    Call :c:func: `PyList_Size ` instead.)
620+ 
621+    The :c:member: `!tp_basicsize ` includes size needed for data of the type's
622+    :c:member: `~PyTypeObject.tp_base `, plus any extra data needed
623+    by each instance.
624+ 
625+    The  correct way to set :c:member: `!tp_basicsize ` is to use the
615626   ``sizeof `` operator on the struct used to declare the instance layout.
616-    The basic size does not include the GC header size.
617- 
618-    A note about alignment: if the variable items require a particular alignment,
619-    this should be taken care of by the value of :c:member: `~PyTypeObject.tp_basicsize `.  Example:
620-    suppose a type implements an array of ``double ``. :c:member: `~PyTypeObject.tp_itemsize ` is
621-    ``sizeof(double) ``. It is the programmer's responsibility that
622-    :c:member: `~PyTypeObject.tp_basicsize ` is a multiple of ``sizeof(double) `` (assuming this is the
623-    alignment requirement for ``double ``).
624- 
625-    For any type with variable-length instances, this field must not be ``NULL ``.
627+    This struct must include the struct used to declare the base type.
628+    In other words, :c:member: `!tp_basicsize ` must be greater than or equal
629+    to the base's :c:member: `!tp_basicsize `.
630+ 
631+    Since every type is a subtype of :py:type: `object `, this struct must
632+    include :c:type: `PyObject ` or :c:type: `PyVarObject ` (depending on
633+    whether :c:member: `~PyVarObject.ob_size ` should be included). These are
634+    usually defined by the macro :c:macro: `PyObject_HEAD ` or
635+    :c:macro: `PyObject_VAR_HEAD `, respectively.
636+ 
637+    The basic size does not include the GC header size, as that header is not
638+    part of :c:macro: `PyObject_HEAD `.
639+ 
640+    For cases where struct used to declare the base type is unknown,
641+    see :c:member: `PyType_Spec.basicsize ` and :c:func: `PyType_FromMetaclass `.
642+ 
643+    Notes about alignment:
644+ 
645+    - :c:member: `!tp_basicsize ` must be a multiple of ``_Alignof(PyObject) ``.
646+      When using ``sizeof `` on a ``struct `` that includes
647+      :c:macro: `PyObject_HEAD `, as recommended, the compiler ensures this.
648+      When not using a C ``struct ``, or when using compiler
649+      extensions like ``__attribute__((packed)) ``, it is up to you.
650+    - If the variable items require a particular alignment,
651+      :c:member: `!tp_basicsize ` and :c:member: `!tp_itemsize ` must each be a
652+      multiple of that alignment.
653+      For example, if a type's variable part stores a ``double ``, it is
654+      your responsibility that both fields are a multiple of
655+      ``_Alignof(double) ``.
626656
627657   **Inheritance: **
628658
629-    These fields are inherited separately by subtypes.  If the base type has a
630-    non-zero :c:member: `~PyTypeObject.tp_itemsize `, it is generally not safe to set
659+    These fields are inherited separately by subtypes.
660+    (That is, if the field is set to zero, :c:func: `PyType_Ready ` will copy
661+    the value from the base type, indicating that the instances do not
662+    need additional storage.)
663+ 
664+    If the base type has a non-zero :c:member: `~PyTypeObject.tp_itemsize `, it is generally not safe to set
631665   :c:member: `~PyTypeObject.tp_itemsize ` to a different non-zero value in a subtype (though this
632666   depends on the implementation of the base type).
633667
0 commit comments