diff options
author | Tim Peters <tim.peters@gmail.com> | 2006-02-16 23:46:01 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2006-02-16 23:46:01 (GMT) |
commit | e564e7f939b88a88057261733ed3c3a17c01b3b7 (patch) | |
tree | 2babf04edaaf73ce701732f2c92b6bf7aba81bdf /Modules/mmapmodule.c | |
parent | dde176593df80c7398a3992da8abffd03dd3f908 (diff) | |
download | cpython-e564e7f939b88a88057261733ed3c3a17c01b3b7.zip cpython-e564e7f939b88a88057261733ed3c3a17c01b3b7.tar.gz cpython-e564e7f939b88a88057261733ed3c3a17c01b3b7.tar.bz2 |
new_mmap_object(), Windows flavor.
On a box where sizeof(size_t) == 4, C doesn't define
what happens when a size_t value is shifted right by
32 bits, and this caused test_mmap to fail on Windows
in a debug build. So use different code to break
the size apart depending on how large size_t actually
is.
This looks like an illusion, since lots of code in this
module still appears to assume sizes can't be more
than 32 bits (e.g., the internal _GetMapSize() still
returns an int), but at least test_mmap passes again.
Diffstat (limited to 'Modules/mmapmodule.c')
-rw-r--r-- | Modules/mmapmodule.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index bdbda22..dbb958d 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -980,6 +980,8 @@ new_mmap_object(PyObject *self, PyObject *args, PyObject *kwdict) mmap_object *m_obj; PyObject *map_size_obj = NULL; int map_size; + DWORD size_hi; /* upper 32 bits of m_obj->size */ + DWORD size_lo; /* lower 32 bits of m_obj->size */ char *tagname = ""; DWORD dwErr = 0; int fileno; @@ -1089,11 +1091,23 @@ new_mmap_object(PyObject *self, PyObject *args, PyObject *kwdict) m_obj->tagname = NULL; m_obj->access = (access_mode)access; + /* DWORD is a 4-byte int. If we're on a box where size_t consumes + * more then 4 bytes, we need to break it apart. Else (size_t + * consumes 4 bytes), C doesn't define what happens if we shift + * right by 32, so we need different code. + */ +#if SIZEOF_SIZE_T > 4 + size_hi = (DWORD)(m_obj->size >> 32); + size_lo = (DWORD)(m_obj->size & 0xFFFFFFFF); +#else + size_hi = 0; + size_lo = (DWORD)m_obj->size; +#endif m_obj->map_handle = CreateFileMapping (m_obj->file_handle, NULL, flProtect, - (DWORD)(m_obj->size >> 32), - (DWORD)(m_obj->size & 0xFFFFFFFF), + size_hi, + size_lo, m_obj->tagname); if (m_obj->map_handle != NULL) { m_obj->data = (char *) MapViewOfFile (m_obj->map_handle, |