why PyObject_VAR_HEAD?

Eric Wong wsysdu at gmail.com
Tue Jul 7 02:06:13 EDT 2009


kio wrote:

> Hi,
> 
> I'm studying the CPython source code. I don’t quite understand why
> they’re using PyObject_VAR_HEAD to define struct like PyListObject. 
To
> define such kind of struct, could I use _PyObject_HEAD_EXTRA as a
> header and add "items" pointer and "allocated" count explicity? Is
> there any difference?
> 
> Thanks.
> 
> Eric

first, _PyObject_HEAD_EXTRA is only useful for debug and defined as:
#ifdef Py_TRACE_REFS
   #define _PyObject_HEAD_EXTRA 	\
      struct _object *_ob_next;   \
      struct _object *_ob_prev;
   #define _PyObject_EXTRA_INIT 0, 0,
#else 
   #define _PyObject_HEAD_EXTRA
   #define _PyObject_EXTRA_INIT
#endif

and PyObject_HEAD is defined as
#define PyObject_HEAD    \
   _PyObject_HEAD_EXTRA  \
   int ob_refcnt;        \
   struct _typeobject *ob_type;

PyObject_VAR_HEAD defined as
#define PyObject_VAR_HEAD   \
   PyObject_HEAD            \
   int ob_size;

so you can see the differences between them here.
PyListObject is defined as
typedef struct{
    PyObject_VAR_HEAD
    PyObject **ob_item;
    int allocated;
}PyListObject;

After unfolding these macros we can get
typedef struct{
    _PyObject_HEAD_EXTRA
    int ob_refcnt;
    struct _typeobject *ob_type;
    int ob_size;
    PyObject **ob_item;
    int allocated;
}PyListObject;

So, if we don't use macros, we have to specify not only the "item" and 
"allocated", but also the ref count and type information of the object 
and the size info for a variable object. These information is not only 
used by PyListObject, but also PyStringObject and PyDictObject, so 
macros make it convenient and consize. 





More information about the Python-list mailing list