summaryrefslogtreecommitdiffstats
path: root/Objects/longobject.c
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2006-04-10 20:28:17 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2006-04-10 20:28:17 (GMT)
commit0bc2ab9a20745e3cc7a2ca4cc01a3708e273e2dc (patch)
tree8c4064913b744ff0a8bcd5fbdcac81c5e0bc0dc1 /Objects/longobject.c
parenta19dc0beb1d2e499b86f56a992e78e7e3d767ee3 (diff)
downloadcpython-0bc2ab9a20745e3cc7a2ca4cc01a3708e273e2dc.zip
cpython-0bc2ab9a20745e3cc7a2ca4cc01a3708e273e2dc.tar.gz
cpython-0bc2ab9a20745e3cc7a2ca4cc01a3708e273e2dc.tar.bz2
Patch #837242: id() for large ptr should return a long.
Diffstat (limited to 'Objects/longobject.c')
-rw-r--r--Objects/longobject.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/Objects/longobject.c b/Objects/longobject.c
index 26f78c2..49f5c3b 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -771,6 +771,8 @@ PyObject *
PyLong_FromVoidPtr(void *p)
{
#if SIZEOF_VOID_P <= SIZEOF_LONG
+ if ((long)p < 0)
+ return PyLong_FromUnsignedLong((unsigned long)p);
return PyInt_FromLong((long)p);
#else
@@ -783,7 +785,7 @@ PyLong_FromVoidPtr(void *p)
/* optimize null pointers */
if (p == NULL)
return PyInt_FromLong(0);
- return PyLong_FromLongLong((PY_LONG_LONG)p);
+ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)p);
#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
}
@@ -802,8 +804,10 @@ PyLong_AsVoidPtr(PyObject *vv)
if (PyInt_Check(vv))
x = PyInt_AS_LONG(vv);
- else
+ else if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
x = PyLong_AsLong(vv);
+ else
+ x = PyLong_AsUnsignedLong(vv);
#else
#ifndef HAVE_LONG_LONG
@@ -816,8 +820,10 @@ PyLong_AsVoidPtr(PyObject *vv)
if (PyInt_Check(vv))
x = PyInt_AS_LONG(vv);
- else
+ else if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
x = PyLong_AsLongLong(vv);
+ else
+ x = PyLong_AsUnsignedLongLong(vv);
#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */