summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS9
-rw-r--r--Objects/intobject.c14
2 files changed, 20 insertions, 3 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index 8a6e902..f1b3a8b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,7 +10,7 @@ What's New in Python 2.3 alpha 2?
*Release date: XX-XXX-2003*
Core and builtins
------------------
+----------------
- Through a bytecode optimizer bug (and I bet you didn't even know
Python *had* a bytecode optimizer :-), "unsigned" hex/oct constants
@@ -24,6 +24,13 @@ Core and builtins
value, but according to PEP 237 it really needs to be 1 now. This
will be backported to Python 2.2.3 a well. (SF #660455)
+- int(s, base) sometimes sign-folds hex and oct constants; it only
+ does this when base is 0 and s.strip() starts with a '0'. When the
+ sign is actually folded, as in int("0xffffffff", 0) on a 32-bit
+ machine, which returns -1, a FutureWarning is now issued; in Python
+ 2.4, this will return 4294967295L, as do int("+0xffffffff", 0) and
+ int("0xffffffff", 16) right now. (PEP 347)
+
- super(X, x): x may now be a proxy for an X instance, i.e.
issubclass(x.__class__, X) but not issubclass(type(x), X).
diff --git a/Objects/intobject.c b/Objects/intobject.c
index 544e663..fee7e4e 100644
--- a/Objects/intobject.c
+++ b/Objects/intobject.c
@@ -187,17 +187,22 @@ PyInt_FromString(char *s, char **pend, int base)
char *end;
long x;
char buffer[256]; /* For errors */
+ int warn = 0;
if ((base != 0 && base < 2) || base > 36) {
- PyErr_SetString(PyExc_ValueError, "int() base must be >= 2 and <= 36");
+ PyErr_SetString(PyExc_ValueError,
+ "int() base must be >= 2 and <= 36");
return NULL;
}
while (*s && isspace(Py_CHARMASK(*s)))
s++;
errno = 0;
- if (base == 0 && s[0] == '0')
+ if (base == 0 && s[0] == '0') {
x = (long) PyOS_strtoul(s, &end, base);
+ if (x < 0)
+ warn = 1;
+ }
else
x = PyOS_strtol(s, &end, base);
if (end == s || !isalnum(Py_CHARMASK(end[-1])))
@@ -216,6 +221,11 @@ PyInt_FromString(char *s, char **pend, int base)
return NULL;
return PyLong_FromString(s, pend, base);
}
+ if (warn) {
+ if (PyErr_Warn(PyExc_FutureWarning,
+ "int('0...', 0): sign will change in Python 2.4") < 0)
+ return NULL;
+ }
if (pend)
*pend = end;
return PyInt_FromLong(x);