[PyQt] sip: Accessing members results in incorrect/missing data

Phil Thompson phil at riverbankcomputing.com
Wed Jan 22 12:23:15 GMT 2020


On 21/01/2020 17:50, Phil Thompson wrote:
> On 16/01/2020 20:52, MatthijsBurgh wrote:
>> I have done some more investigating.
>> 
>> As mentioned 
>> https://github.com/orocos/orocos_kinematics_dynamics/issues/41,
>> problems where occuring in with SIP 4.13.2.
>> 
>> Which is explainable as you fixed this issue in the commit:
>> https://www.riverbankcomputing.com/hg/sip/rev/0dd3cb4eff0e. This makes 
>> sure
>> the member variable contains a reference to the containing class. This
>> prevents the class from being garbage collected while there are still
>> references to the member variable.
>> 
>> You apply a fix to this in commit
>> https://www.riverbankcomputing.com/hg/sip/rev/fbb9cdbad791.
>> 
>> The commit, 
>> https://www.riverbankcomputing.com/hg/sip/rev/11a92ebd4840,
>> which I also mentioned in my first message, is the important one.
>> 
>> In this commit you introduce a kind of caching for member variables. 
>> The
>> python wrapper of the members of a class are stored in a dict in the 
>> python
>> wrapper of the class. To add the member to the cache, you use
>> "sipKeepReference(sipPySelf, %d, sipPy)". So the class contains a 
>> reference
>> to the member variable.
>> 
>> While previously "sipKeepReference(sipPy, -1, sipPySelf)", was used to 
>> store
>> the reference to the class in the dict of the member variable. Focus 
>> here on
>> the switch of "sipPy" and "sipPySelf". So by the last commit, 
>> 11a92ebd4840,
>> you added a new feature, but you broke another one.
>> 
>> I suggest to restore the feature which stores the reference to the 
>> class in
>> the member variable dict.
>> 
>> I did some testing in 4.19.20. I didn't experience a significant 
>> performance
>> increase with the caching with my Frame object and its member p, a 
>> vector
>> with 3 variables. (I tweaked the code,
>> https://www.riverbankcomputing.com/hg/sip/file/7c54145e55b6/sipgen/gencode.c#l4904,
>> to always get the caching.)
>> Also I added manually the "sipKeepReference(sipPy, -1, sipPySelf)" to 
>> the
>> generated cpp for the class reference. When both features were used at 
>> the
>> same time, the "release" function of the class was not called. (I 
>> added a
>> "printf" to it, which didn't show in that situation, but did if just 
>> of the
>> two was used.)
> 
> Thanks for the analysis, that was very helpful.
> 
> This changeset is also a problem...
> 
> https://www.riverbankcomputing.com/hg/sip/rev/6ec87337d5e2
> 
> Can you try the latest version of the 4.19-maint branch, ie. including
> this changeset...
> 
> https://www.riverbankcomputing.com/hg/sip/rev/137b9be794a1
> 
> ...and let me know how you get on.

There is now a newer changeset...

https://www.riverbankcomputing.com/hg/sip/rev/6a057b2d8537

Phil


More information about the PyQt mailing list