[PyQt] Re: New bug in SIP

Phil Thompson phil at riverbankcomputing.co.uk
Fri May 30 14:30:59 BST 2008


On Friday 30 May 2008 1:05:11 pm Giovanni Bajo wrote:
> On 5/30/2008 12:32 PM, Phil Thompson wrote:
> > On Wednesday 28 May 2008 3:39:11 pm Giovanni Bajo wrote:
> >> Hi Phil,
> >>
> >> I found a new bug in SIP (it used to work with a SIP from September
> >> 2007).
> >>
> >> If you declare a class with a single constructor, you write %MethodCode
> >> for that constructor, and you make it raise an exception (PyErr_Format)
> >> and set sipIsErr=1, the exception is not propagated to Python: it gets
> >> "swallowed" and changed into an AttributeError which says "... is a
> >> private method".
> >>
> >> Basically, this code in sipWrapper_init, line 7173:
> >>
> >>              	/*
> >>              	 * If the arguments were parsed without error then assume
> >> an * exception has already been raised for why the instance * wasn't
> >> created.
> >>              	 */
> >>                  if (pstate == PARSE_OK)
> >>                      argsparsed = PARSE_RAISED;
> >>
> >>
> >> is not executed, because pstate was already mutated a few lines above:
> >>
> >>
> >>              /*
> >>               * If the parse was successful but no C/C++ object was
> >> created then
> >>               * we assume that handwritten code decided after the parse
> >> that * it didn't want to handle the signature.
> >>               */
> >>              if (pstate == PARSE_OK)
> >>                  pstate = PARSE_TYPE;
> >>
> >>
> >> I was wondering if it should check "argsparsed == PARSE_OK" (at line
> >> 7173) instead of "pstate == PARSE_OK".
> >>
> >> Thanks!
> >
> > I think the bug is that the earlier code should be...
> >
> >     if (pstate == PARSE_OK)
> >         pstate = argsparsed = PARSE_TYPE;
>
> This changes the exception into a TypeError (eg: "argument 1 has an
> invalid type"), but it still mask the original exception that was raised
> in the %MethodCode.

Hmm - I need to think about this a bit more. It's all related to the QVariant 
support for Python objects.

Phil


More information about the PyQt mailing list