diff options
author | Guido van Rossum <guido@python.org> | 2003-02-12 20:48:22 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2003-02-12 20:48:22 (GMT) |
commit | 47710656e53717b8369b72efcc486287f61bd69e (patch) | |
tree | 865a2fa565460d12a191b62daab1531f4403923e | |
parent | 3288f592cba8476faaa9412548be575df3f4d573 (diff) | |
download | cpython-47710656e53717b8369b72efcc486287f61bd69e.zip cpython-47710656e53717b8369b72efcc486287f61bd69e.tar.gz cpython-47710656e53717b8369b72efcc486287f61bd69e.tar.bz2 |
Issue a warning when int('0...', 0) returns an int with the sign
folded; this will change in Python 2.4. On a 32-bit machine, this
happens for 0x80000000 through 0xffffffff, and for octal constants in
the same value range. No warning is issued if an explicit base is
given, *or* if the string contains a sign (since in those cases no
sign folding ever happens).
-rw-r--r-- | Misc/NEWS | 9 | ||||
-rw-r--r-- | Objects/intobject.c | 14 |
2 files changed, 20 insertions, 3 deletions
@@ -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); |