]> granicus.if.org Git - python/commitdiff
Patch #837242: id() for large ptr should return a long.
authorMartin v. Löwis <martin@v.loewis.de>
Mon, 10 Apr 2006 20:28:17 +0000 (20:28 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Mon, 10 Apr 2006 20:28:17 +0000 (20:28 +0000)
Doc/api/concrete.tex
Misc/NEWS
Objects/longobject.c

index 98e0e039ab594a34967eb6c121de3a64b8862fa2..1982bae67fcecbc2e8308d5bb2d51a513a809266 100644 (file)
@@ -333,7 +333,9 @@ booleans.  The following macros are available, however.
   The pointer value can be retrieved from the resulting value using
   \cfunction{PyLong_AsVoidPtr()}.
   \versionadded{1.5.2}
-\end{cfuncdesc}
+  \versionchanged[If the integer is larger than LONG_MAX,
+  a positive long integer is returned]{2.5}
+ \end{cfuncdesc}
 
 \begin{cfuncdesc}{long}{PyLong_AsLong}{PyObject *pylong}
   Return a C \ctype{long} representation of the contents of
@@ -394,6 +396,8 @@ booleans.  The following macros are available, however.
   produce a usable \ctype{void} pointer for values created with
   \cfunction{PyLong_FromVoidPtr()}.
   \versionadded{1.5.2}
+  \versionchanged[For values outside 0..LONG_MAX, both signed and
+  unsigned integers are acccepted]{2.5}
 \end{cfuncdesc}
 
 
index bac423801dccbaf07ceec789bc3b8850ab07589d..fcd17381574162fd90f27079700aaac6d2c80dbf 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,10 @@ What's New in Python 2.5 alpha 2?
 Core and builtins
 -----------------
 
+- Patch #837242: id() of any Python object always gives a positive
+  number, which might be a long integer. PyLong_FromVoidPtr and
+  PyLong_AsVoidPtr have been changed accordingly.
+
 - Python on OS X 10.3 and above now uses dlopen() (via dynload_shlib.c) 
   to load extension modules and now provides the dl module. As a result,
   sys.setdlopenflags() now works correctly on these systems. (SF patch 
index 26f78c22e87baed9f6416fc74b1618e739ab0685..49f5c3b62583b11edec27cc89e2f634b32dbfea5 100644 (file)
@@ -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 */