[Zope] Can't locate PyObject_SetItem

Tim Peters tim.peters at gmail.com
Tue Sep 21 19:03:32 EDT 2004


[Jonathan Hobbs]
...
> I have a better grasp on the situation now, but confusion still reigns... I
> don't understand how PyObject_SetItem (a python/C API) can increase the size
> of an IIBucket (which usually uses 'Bucket_grow' from BucketTemplate.c), but
> I will take it on faith that it magically works somehow, so that I can
> continue my search for the performance problem with ZCTextIndex!

Sounds normal.  PyObject_SetItem(obj, key, val) is the C way to spell
the Python obj.__setitem__(key, val), which is in turn a low-level way
to spell the Python "obj[key] = val".

Then, in BucketTemplate.c, the BucketType struct's tp_mapping slot is
set to the address of Bucket_as_mapping, and Bucket_as_mapping's
mp_ass_subscript slot is in turn set to the function bucket_setitem. 
That means PyObject_Setitem resolves to calling bucket_setitem when
called with a bucket obj.  bucket_setitem in turn calls _bucket_set,
which *may* call Bucket_grow.

An excruciating twist at the C level is that setitem functions are
used both for setting a key in a mapping, and for deleting a key; the
latter occurs if the associated "value" is C's NULL.


More information about the Zope mailing list