summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Objects/longobject.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/Objects/longobject.c b/Objects/longobject.c
index be9430a..048b8e5 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -508,18 +508,22 @@ PyLong_AsDouble(PyObject *vv)
PyObject *
PyLong_FromVoidPtr(void *p)
{
-#if SIZEOF_VOID_P == SIZEOF_LONG
+#if SIZEOF_VOID_P <= SIZEOF_LONG
return PyInt_FromLong((long)p);
#else
+
+#ifndef HAVE_LONG_LONG
+# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
+#endif
+#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
+# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
+#endif
/* optimize null pointers */
- if ( p == NULL )
+ if (p == NULL)
return PyInt_FromLong(0);
-
- /* we can assume that HAVE_LONG_LONG is true. if not, then the
- configuration process should have bailed (having big pointers
- without long longs seems non-sensical) */
return PyLong_FromLongLong((LONG_LONG)p);
-#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
+
+#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
}
/* Get a C pointer from a long object (or an int object in some cases) */
@@ -531,25 +535,29 @@ PyLong_AsVoidPtr(PyObject *vv)
then the PyLong_AsLong*() functions will raise the exception:
PyExc_SystemError, "bad argument to internal function"
*/
-
-#if SIZEOF_VOID_P == SIZEOF_LONG
+#if SIZEOF_VOID_P <= SIZEOF_LONG
long x;
- if ( PyInt_Check(vv) )
+ if (PyInt_Check(vv))
x = PyInt_AS_LONG(vv);
else
x = PyLong_AsLong(vv);
#else
- /* we can assume that HAVE_LONG_LONG is true. if not, then the
- configuration process should have bailed (having big pointers
- without long longs seems non-sensical) */
+
+#ifndef HAVE_LONG_LONG
+# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
+#endif
+#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
+# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
+#endif
LONG_LONG x;
- if ( PyInt_Check(vv) )
+ if (PyInt_Check(vv))
x = PyInt_AS_LONG(vv);
else
x = PyLong_AsLongLong(vv);
-#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
+
+#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
if (x == -1 && PyErr_Occurred())
return NULL;