Use ImagingCore.ptr instead of ImagingCore.id#8341
Use ImagingCore.ptr instead of ImagingCore.id#8341hugovk merged 39 commits intopython-pillow:mainfrom
Conversation
1fddcce to
9bd6434
Compare
PytestUnraisableExceptionWarning: Exception ignored in: <function PhotoImage.__del__> AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'
830a245 to
491e637
Compare
|
@python-pillow/pillow-team I need help here) Could anyone debug pypy3.10 on windows? I can't get what's wrong, since as I can see, the capsule object is correctly restored from the pointer and the capsule object itself is alive. |
10db853 to
bc83e33
Compare
|
Get it! In pypy |
|
So is the motivation here just to simplify the code? Also, we don't necessarily need the deprecations - #4532 (comment)
|
Added description to PR.
While |
I'm not aware of TK API, but it seems it converts any arguments to strings, at least |
Co-authored-by: Andrew Murray <[email protected]>
In CPython, sure, but from your comments, not in PyPy. It seems simpler to note that CPython converts the capsule to a string, Depends on whether your thinking was already aligned with how Tk works, I guess. I've created uploadcare#148, but feel free to say you prefer the current version. |
That isn't in my comments. In both implementations, the Capsule is converted to a string. In the case of CPython, it's a string like |
Oh, I see, I very much misunderstood this comment. |
Interestingly, I guess this is what is preventing you from checking the capsule name against the magic with
|
|
This check is the best we can do here. It’s not as secure as PyCapsule_IsValid(), since it only verifies that the passed string is a correctly formatted string representation of the Capsule object. It’s still possible to craft a well-formatted string with the wrong pointer, which could result in a segmentation fault when calling a Tk operation. However, it’s still a significant improvement over the previous implementation, which simply obtained some number and assumed it was a pointer. |
|
For the sake of interest,
I looked, and this would be mirroring https://www.tcl.tk/man/tcl8.6/TclLib/CrtCommand.htm |
Co-authored-by: Andrew Murray <[email protected]>
Co-authored-by: Hugo van Kemenade <[email protected]>
Partially suppress #8340
The non-primary extensions in Pillow don't have direct access to Python's
_imagingtypes, such asImaging_TypeandImagingObject. However, they often still need to interact with objects passed from Python code. Currently, the raw memory pointer to anImagingobject (ImageCore.id) is passed as an integer and then cast to a memory pointer:It's not safe and can lead to segmentation faults. Python has Capsule objects, which provide a safer way to pass pointers to C code. These are exposed through
ImageCore.ptr.This PR deprecates the raw pointer properties
ImageCore.idandImageCore.unsafe_ptrs, and migrates non-primary extensions to interact with Capsule objects.