[Stackless] PySide problem, take #2: typeobject clash

Kristján Valur Jónsson kristjan at ccpgames.com
Mon Dec 10 12:39:34 CET 2012


Yes. 
But, stackless tries to detect if a type has the proper stackless extensions, by a flag in the type's 'flag' entry:
Py_TPFLAGS_HAVE_STACKLESS_EXTENSION
Therefore, there shouldn't be confusion:

1) if Stackless sees a type defined by Shiboken, even with the shiboken extension, it shouldn't have this flag, and stackless should ignore it.
2) If Shiboken sees a type object from stackless, it won't do anything with it because it only adds the sbk extensions to its own types.
The issue is, imho, likely to be a problem with 1), a yet unidentified case in stackless where we assume all internal types to have the extension, i.e. fail to check for the presence of the flag.

K

> -----Original Message-----
> From: Christian Tismer [mailto:tismer at stackless.com]
> Sent: 8. desember 2012 21:45
> To: stackless at stackless.com; Kristján Valur Jónsson; Richard Tew; lars van
> Gemerden
> Subject: PySide problem, take #2: typeobject clash
> 
> Hi again,
> 
> after some more investigation, I think I found it.
> See thread [PySide violates Python API - PyQt does not!] The first message
> was not correct, but the second one very likely is.
> 
> As said there, the PyHeapTypeObject is extended like so:
> 
> > /// PyTypeObject extended with C++ multiple inheritance information.
> > struct LIBSHIBOKEN_API SbkObjectType
> > {
> >     PyHeapTypeObject super;
> >     SbkObjectTypePrivate* d;
> > };
> 
> This additional pointer gets aliased to the first 4 bytes (win 32 bit) of
> 
> typedef struct _slp_methodflags {
>      signed char tp_itemsize;
>      signed char tp_weaklistoffset;
>      signed char tp_dictoffset;
>      signed char nb_add;
>      signed char nb_subtract;
>      signed char nb_multiply;
>      signed char nb_divide;
>      signed char nb_remainder;
> ...
> 
> 
> The first three seem irrelevant. But the nb_add might influence the way how
> __add__ is interpreted. Due to the pointer value, stackless tries to call
> __add__ using the soft-switching protocol, which then fails miserably.
> 
> The macro that tries this is:
> 
> #define STACKLESS_PROMOTE_METHOD(obj, meth) \
>      (obj->ob_type->tp_flags & Py_TPFLAGS_HAVE_STACKLESS_EXTENSION ?
> \
>      slp_try_stackless = stackless & obj->ob_type->slpflags.meth : 0)
> 
> and it is used by
> 
> #define STACKLESS_PROPOSE_METHOD(obj, meth)                         \
> {                                                               \
>      int stackless = STACKLESS_POSSIBLE();                       \
>      STACKLESS_PROMOTE_METHOD(obj, meth);                        \
>      }
> 
> Unfortunately, I could not find out if there is a way for Stackless to fall into
> this trap. But a good thing would be a little test:
> 
> Lars, Richard:
> Can you please try your crashing examples, by putting
> > import stackless
> > stackless.enable_softswitch(False)
> 
> right after the program start?
> 
> That makes sure that stackless support of the interpreter is completely
> disabled, so the misinterpreted frags are of no influence.
> 
> If that leads to significantly less crashes, then there is a quick fix for PySide:
> Insert a dummy void* into object.h before slpflags:
> 
> >     PyObject *ht_name, *ht_slots;
> >     slp_methodflags slpflags;
> > #endif
> > } PyTypeObject;
> 
> Hope this helps, but I'm not confident -- Chris
> 
> --
> Christian Tismer             :^)   <mailto:tismer at stackless.com>
> Software Consulting          :     Have a break! Take a ride on Python's
> Karl-Liebknecht-Str. 121     :    *Starship* http://starship.python.net/
> 14482 Potsdam                :     PGP key -> http://pgp.uni-mainz.de
> phone +49 173 24 18 776  fax +49 (30) 700143-0023
> PGP 0x57F3BF04       9064 F4E1 D754 C2FF 1619  305B C09C 5A3B 57F3 BF04
>        whom do you want to sponsor today?   http://www.stackless.com/
> 





More information about the Stackless mailing list