[Python-Dev] [Python-checkins] cpython: Issue #14779: Do not use get_config_var('SIZEOF_VOID_P') on OS X 64-/32-bit (original) (raw)
Stefan Krah stefan at bytereef.org
Sun May 13 11:48:48 CEST 2012
- Previous message: [Python-Dev] [Python-checkins] cpython: Issue #14779: Do not use get_config_var('SIZEOF_VOID_P') on OS X 64-/32-bit
- Next message: [Python-Dev] void* <-> size_t
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
"Martin v. L?wis" <martin at v.loewis.de> wrote: [http://bugs.python.org/issue14779]
- self.sizeofvoidp = getconfigvar('SIZEOFVOIDP') _+ self.sizeofvoidp = getconfigvar('SIZEOFVOIDP') _ + if sys.platform != 'darwin' else None if not self.sizeofvoidp: - self.sizeofvoidp = 8 if architecture()[0] == '64bit' else 4 + self.sizeofvoidp = 8 if sys.maxsize> 2**32 else 4
Why not unconditionally use sys.maxsize?
Because the tests need sizeof(void *). In an array with suboffsets void pointers are embedded at the start of the array.
The C standard doesn't guarantee sizeof(void *) == sizeof(size_t). In fact, there are machines where sizeof(void *) > sizeof(size_t):
http://comments.gmane.org/gmane.comp.programming.garbage-collection.boehmgc/651 http://www-01.ibm.com/support/docview.wss?uid=swg27019425
If you change pyconfig.h to 128 bit pointers while leaving sizeof(size_t) and sizeof(ssize_t) at 8, pyport.h by itself doesn't catch the mismatch.
/* The size of uintptr_t', as computed by sizeof. */ #define SIZEOF_UINTPTR_T 16 /* The size of
void *', as computed by sizeof. */
#define SIZEOF_VOID_P 16
However, now that I tried to compile Python with that pyconfig.h, longobject.c does catch it:
Objects/longobject.c:943:5: error: #error "PyLong_FromVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)" Objects/longobject.c:970:5: error: #error "PyLong_AsVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
If sizeof(void *) == sizeof(size_t) is the general assumption for compiling Python, I think the test should happen prominently in either pyport.h or Python.h.
I'd also hard-code that sys.maxsize ought to be either 231-1 or 263-1.
I would have done exactly that, but the example in the docs that was quoted to me in the issue uses > 2**32:
http://docs.python.org/dev/library/platform.html
Stefan Krah
- Previous message: [Python-Dev] [Python-checkins] cpython: Issue #14779: Do not use get_config_var('SIZEOF_VOID_P') on OS X 64-/32-bit
- Next message: [Python-Dev] void* <-> size_t
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]