[PyQt] Re: New bug in SIP
Giovanni Bajo
rasky at develer.com
Fri May 30 14:39:21 BST 2008
On 5/30/2008 3:30 PM, Phil Thompson wrote:
> 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.
IMHO sip is getting to a complexity point where a testsuite might help
in sorting out these bugs while you are developing new code and/or
refactoring. If you are interested in having one, I can help
contributing the infrastructure for it.
--
Giovanni Bajo
Develer S.r.l.
http://www.develer.com
More information about the PyQt
mailing list