diff --git a/Objects/intobject.c b/Objects/intobject.c index 4f43b111e50..728f798a5b6 100644 --- a/Objects/intobject.c +++ b/Objects/intobject.c @@ -659,7 +659,7 @@ int_invert(PyIntObject *v) static PyObject * int_lshift(PyIntObject *v, PyIntObject *w) { - register long a, b; + long a, b, c; CONVERT_TO_LONG(v, a); CONVERT_TO_LONG(w, b); if (b < 0) { @@ -669,10 +669,20 @@ int_lshift(PyIntObject *v, PyIntObject *w) if (a == 0 || b == 0) return int_pos(v); if (b >= LONG_BIT) { + if (PyErr_Warn(PyExc_DeprecationWarning, + "x<> b) != a || (c < 0 && a > 0)) { + if (PyErr_Warn(PyExc_DeprecationWarning, + "x< ob_ival; + if (x < 0) { + if (PyErr_Warn(PyExc_DeprecationWarning, + "hex()/oct() of negative int will return " + "a signed string in Python 2.4 and up") < 0) + return NULL; + } if (x == 0) strcpy(buf, "0"); else @@ -773,6 +789,12 @@ int_hex(PyIntObject *v) { char buf[100]; long x = v -> ob_ival; + if (x < 0) { + if (PyErr_Warn(PyExc_DeprecationWarning, + "hex()/oct() of negative int will return " + "a signed string in Python 2.4 and up") < 0) + return NULL; + } PyOS_snprintf(buf, sizeof(buf), "0x%lx", x); return PyString_FromString(buf); } diff --git a/Objects/stringobject.c b/Objects/stringobject.c index 1d5277c0c78..1bbd201047f 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -3311,6 +3311,12 @@ formatint(char *buf, size_t buflen, int flags, PyErr_SetString(PyExc_TypeError, "int argument required"); return -1; } + if (x < 0 && type != 'd' && type != 'i') { + if (PyErr_Warn(PyExc_DeprecationWarning, + "%u/%o/%x/%X of negative int will return " + "a signed string in Python 2.4 and up") < 0) + return -1; + } if (prec < 0) prec = 1; diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index d6fd62af804..145186e0dff 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -5219,6 +5219,10 @@ int usprintf(register Py_UNICODE *buffer, char *format, ...) return len; } +/* XXX To save some code duplication, formatfloat/long/int could have been + shared with stringobject.c, converting from 8-bit to Unicode after the + formatting is done. */ + static int formatfloat(Py_UNICODE *buf, size_t buflen, @@ -5294,6 +5298,12 @@ formatint(Py_UNICODE *buf, x = PyInt_AsLong(v); if (x == -1 && PyErr_Occurred()) return -1; + if (x < 0 && type != 'd' && type != 'i') { + if (PyErr_Warn(PyExc_DeprecationWarning, + "%u/%o/%x/%X of negative int will return " + "a signed string in Python 2.4 and up") < 0) + return -1; + } if (prec < 0) prec = 1; diff --git a/Python/compile.c b/Python/compile.c index 79756eab0ec..e547e03b260 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1154,8 +1154,16 @@ parsenumber(struct compiling *co, char *s) #endif if (*end == 'l' || *end == 'L') return PyLong_FromString(s, (char **)0, 0); - if (s[0] == '0') + if (s[0] == '0') { x = (long) PyOS_strtoul(s, &end, 0); + if (x < 0 && errno == 0) { + if (PyErr_Warn(PyExc_DeprecationWarning, + "hex/oct constants > sys.maxint " + "will return positive values " + "in Python 2.4 and up") < 0) + return NULL; + } + } else x = PyOS_strtol(s, &end, 0); if (*end == '\0') {