[PyQt] sip: Accessing members results in incorrect/missing data
Phil Thompson
phil at riverbankcomputing.com
Tue Jan 21 17:50:26 GMT 2020
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.
Phil
More information about the PyQt
mailing list