Phil, earlier we thought that the arguments to PyType_IsSubType() were switched for subclass converters; I emailed you directly, and you went ahead and made the change in the SIP tree (post 4.0rc3).
I think we made another mistake in understanding what SIP was doing.
In pseudocode form, the original code in rc3 looks like:
convertSubClass(obj_type, obj) is ## obj_type is possibly a superclass of obj -- we want to find out ## the real type of obj
foreach module in loaded_modules do
if module has subclass_converters then
foreach converter in subclass_converters do
## attempt conversion
if PyType_IsSubType(obj_type, converter.type) then
converter.convert(obj)
if conversion was successful then returnWe thought that converter.convert() (scc->scc_converter() in the actual code) could only convert to converter.type (scc->scc_basetype->super.type) and would reject attempts to do otherwise. By this reasoning, the arguments are reversed -- the check should be seeing if converter.type is a subtype of obj_type for a potential conversion.
But that's not the case! What converter.convert() really does is convert obj to the _most derived type_ of converter.type -- the IsSubType() check is just making sure the converter is applicable.
Now, the real bug is if class A defines a subclass converter, no other class derived from A can also define a subclass converter (and expect it to be called consistently). A's subclass converter has to be aware of the entire hierarchy.
Unfortunately, fixing this is very non-trivial (IMHO). Fortunately, for the QCanvasItem problem we can work around it by editing the source.
Again, my apologies for my earlier misleading analysis.
Dave
_______________________________________________ PyKDE mailing list [EMAIL PROTECTED] http://mats.imk.fraunhofer.de/mailman/listinfo/pykde
