|  | 
| 2 | 2 | 
 | 
| 3 | 3 | .. _type-structs: | 
| 4 | 4 | 
 | 
| 5 |  | -Type Objects | 
| 6 |  | -============ | 
|  | 5 | +Type Object Structures | 
|  | 6 | +====================== | 
| 7 | 7 | 
 | 
| 8 | 8 | Perhaps one of the most important structures of the Python object system is the | 
| 9 | 9 | structure that defines a new type: the :c:type:`PyTypeObject` structure.  Type | 
| @@ -559,6 +559,9 @@ PyVarObject Slots | 
| 559 | 559 |    initialized to zero. For :ref:`dynamically allocated type objects | 
| 560 | 560 |    <heap-types>`, this field has a special internal meaning. | 
| 561 | 561 | 
 | 
|  | 562 | +   This field should be accessed using the :c:func:`Py_SIZE()` and | 
|  | 563 | +   :c:func:`Py_SET_SIZE()` macros. | 
|  | 564 | + | 
| 562 | 565 |    **Inheritance:** | 
| 563 | 566 | 
 | 
| 564 | 567 |    This field is not inherited by subtypes. | 
| @@ -609,47 +612,86 @@ and :c:data:`PyType_Type` effectively act as defaults.) | 
| 609 | 612 | 
 | 
| 610 | 613 | 
 | 
| 611 | 614 | .. c:member:: Py_ssize_t PyTypeObject.tp_basicsize | 
| 612 |  | -             Py_ssize_t PyTypeObject.tp_itemsize | 
|  | 615 | +              Py_ssize_t PyTypeObject.tp_itemsize | 
| 613 | 616 | 
 | 
| 614 | 617 |    These fields allow calculating the size in bytes of instances of the type. | 
| 615 | 618 | 
 | 
| 616 | 619 |    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`.) | 
| 620 | 625 | 
 | 
| 621 | 626 |    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:: | 
| 639 | 640 | 
 | 
| 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. | 
| 646 | 643 | 
 | 
| 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)``. | 
| 648 | 686 | 
 | 
| 649 | 687 |    **Inheritance:** | 
| 650 | 688 | 
 | 
| 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 | 
| 653 | 695 |    :c:member:`~PyTypeObject.tp_itemsize` to a different non-zero value in a subtype (though this | 
| 654 | 696 |    depends on the implementation of the base type). | 
| 655 | 697 | 
 | 
|  | 
0 commit comments