[Python-Dev] Define metatype and a type that uses it

Amaury Forgeot d'Arc amauryfa at gmail.com
Mon Jul 13 13:35:22 CEST 2009


Hi,

2009/7/13 Erik Groeneveld <erik at cq2.nl>:
> Amaury,
>
> Thank you very much for your detailed explanation.  It helps to
> understand it better, and it mostly works now.  There is one thing
> however:
>
> On Wed, Jul 8, 2009 at 17:35, Amaury Forgeot d'Arc<amauryfa at gmail.com> wrote:
>> - Don't define a JObjectMeta struct, use JObjectType directly instead.
>> An instance of the metatype is the type itself!
>> - Don't set JObjectMetaType.tp_basicsize, let it inherit from the base
>> type (the correct value would be sizeof(PyHeapTypeObject), this is
>> important in order to create derived classes in python)
>
> I'd like to add a C pointer field to the metatype instance (the type).
> So, contrary to your advice, I have defined:
>
> typedef struct {
>    PyHeapTypeObject x;
>    void* p;
> } JObjectMeta;
>
> This seems the way to do it for objects, but for types, it doesn't
> seem right, as the p member turns out to be overwritten unexpectedly
> at runtime.
>
> Reading Python's object.h file it turns out that PyHeapTypeObject
> 'extends' PyTypeObject, which in turn has a PyObject_VAR_HEAD init
> macro.  So mustn't:
>
> PyTypeObject JObjectMetaType = {
>    PyObject_HEAD_INIT(NULL)
> };
>
> actually be:
>
> PyTypeObject JObjectMetaType = {
>    PyVarObject_HEAD_INIT(NULL, 1)
> };
>
> with:
>
> JObjectMetaType.tp_basic_size = sizeof(JObjectMeta);
> JObjectMetaType.tp_itemsize = sizeof(void*);
>
> I tried this, but it doesn't keep my app from dumping core on an
> overwritten 'p'.
>
> My question basically is: how can I define a pointer for each type
> created with this metatype, such as is intended by the JObjectMeta
> struct?

The best is probably to store it in the class dictionary:
    PyObject_SetAttrString(self, "_javatype_", PyLong_FromVoidPtr(p));

-- 
Amaury Forgeot d'Arc


More information about the Python-Dev mailing list