Message196982
2013/9/5 Christoph Gohlke <report@bugs.python.org>:
> I am aware of two 3rd party C extensions that use the value of interpaddr():
>
> https://github.com/python-imaging/Pillow/blob/master/_imagingtk.c#L40
> https://github.com/matplotlib/matplotlib/blob/master/src/_tkagg.cpp#L233
>
> Both parse the PyObject returned by interpaddr() into a Py_ssize_t variable using `PyArg_ParseTuple(PyObject*, "n", &Py_ssize_t)` and then cast the Py_ssize_t variable to a (TkappObject*).
Ok, the code looks correct. Py_ssize_t is supposed to have the same
size than a void*.
> Can a PyLong with a value > 3**31 be parsed into a Py_ssize_t on 32 bit platforms? Could this become a problem on systems where 32 bit processes can address more than 2 GB?
No, values >= 2^31 will raise an error.
On Linux, addresses with the 32th bit set (range
0x80000000-0xffffffff) are reserved for the Linux kernel. So
interpaddr() should be in the range 0x00000000-0x7fffffff.
If the code worked before my patch, there is not reason for not
working with the patch. My patch only has an impact on one specific
platform: Windows 64 bit, the only platform where sizeof(long) <
sizeof(void*) (on all other platforms supported by Python,
sizeof(void*) == sizeof(long)). |
|
Date |
User |
Action |
Args |
2013-09-05 07:12:35 | vstinner | set | recipients:
+ vstinner, cgohlke, python-dev, serhiy.storchaka |
2013-09-05 07:12:35 | vstinner | link | issue18909 messages |
2013-09-05 07:12:35 | vstinner | create | |
|