On Windows x64, sizeof(size_t) > sizeof(long), so the existing 
PyLong_FromSsize_t and PyLong_FromSize_t implementations in longobject.c are 
just plain wrong.  I've patched it as follows, but as I'm not well versed in 
the many intricacies of longobject.c, I'd appreciate input from others.

As far as I can tell, we can use FromLong or FromLongLong (and their unsigned 
counterparts) exclusively; I don't see why we'd need to rely on 
_PyLong_FromByteArray as our incoming ival is never going to be larger than an 
ssize_t|size_t.  (The _PyLong_FromByteArray is intended for incoming numbers 
that we don't know the size of up front, right?)

Index: longobject.c
===================================================================
--- longobject.c        (revision 62292)
+++ longobject.c        (working copy)
@@ -1099,13 +1099,13 @@
 PyObject *
 PyLong_FromSsize_t(Py_ssize_t ival)
 {
-       Py_ssize_t bytes = ival;
-       int one = 1;
-       if (ival < PyLong_BASE)
-               return PyLong_FromLong(ival);
-       return _PyLong_FromByteArray(
-                       (unsigned char *)&bytes,
-                       SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 1);
+#if SIZEOF_SIZE_T == SIZEOF_LONG_LONG
+       return PyLong_FromLongLong(ival);
+#elif SIZEOF_SIZE_T == SIZEOF_LONG
+       return PyLong_FromLong(ival);
+#else
+#error "Expected SIZEOF_SIZE_T to equal SIZEOF_LONG_LONG or SIZEOF_LONG"
+#endif
 }

 /* Create a new long int object from a C size_t. */
@@ -1113,13 +1113,13 @@
 PyObject *
 PyLong_FromSize_t(size_t ival)
 {
-       size_t bytes = ival;
-       int one = 1;
-       if (ival < PyLong_BASE)
-               return PyLong_FromLong(ival);
-       return _PyLong_FromByteArray(
-                       (unsigned char *)&bytes,
-                       SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 0);
+#if SIZEOF_SIZE_T == SIZEOF_LONG_LONG
+       return PyLong_FromUnsignedLongLong(ival);
+#elif SIZEOF_SIZE_T == SIZEOF_LONG
+       return PyLong_FromUnsignedLong(ival);
+#else
+#error "Expected SIZEOF_SIZE_T to equal SIZEOF_LONG_LONG or SIZEOF_LONG"
+#endif
 }

 /* Get a C PY_LONG_LONG int from a long int object.
_______________________________________________
Python-3000 mailing list
Python-3000@python.org
http://mail.python.org/mailman/listinfo/python-3000
Unsubscribe: 
http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com

Reply via email to