]> granicus.if.org Git - python/commitdiff
Stop producing or using OverflowWarning. PEP 237 thought this would
authorTim Peters <tim.peters@gmail.com>
Wed, 25 Aug 2004 02:14:08 +0000 (02:14 +0000)
committerTim Peters <tim.peters@gmail.com>
Wed, 25 Aug 2004 02:14:08 +0000 (02:14 +0000)
happen in 2.3, but nobody noticed it still was getting generated (the
warning was disabled by default).  OverflowWarning and
PyExc_OverflowWarning should be removed for 2.5, and left notes all over
saying so.

Doc/lib/libexcs.tex
Include/pyerrors.h
Lib/test/test_exceptions.py
Lib/test/test_warnings.py
Lib/warnings.py
Misc/NEWS
Objects/intobject.c
Python/exceptions.c

index 0dccafc442b88257033dee8769492bb8005a401d..6a17c765098565e5c042063718c5b09c7b0e8526 100644 (file)
@@ -460,7 +460,7 @@ The class hierarchy for built-in exceptions is:
          +-- DeprecationWarning
          +-- PendingDeprecationWarning
          +-- SyntaxWarning
-         +-- OverflowWarning
+         +-- OverflowWarning (not generated in 2.4; won't exist in 2.5)
          +-- RuntimeWarning
          +-- FutureWarning
 \end{verbatim}
index 1715e9758c3f333d2bc378fd1c27d5a980aeb1c5..f433cc0d1d683958725e85c4e2b7d950bdd299c8 100644 (file)
@@ -74,6 +74,7 @@ PyAPI_DATA(PyObject *) PyExc_UserWarning;
 PyAPI_DATA(PyObject *) PyExc_DeprecationWarning;
 PyAPI_DATA(PyObject *) PyExc_PendingDeprecationWarning;
 PyAPI_DATA(PyObject *) PyExc_SyntaxWarning;
+/* PyExc_OverflowWarning will go away for Python 2.5 */
 PyAPI_DATA(PyObject *) PyExc_OverflowWarning;
 PyAPI_DATA(PyObject *) PyExc_RuntimeWarning;
 PyAPI_DATA(PyObject *) PyExc_FutureWarning;
index 83e680f81a81ee70bad21aa1d47fbcb9c86909c3..c157122b5b0c668f5d685ccbf836f2de9fd81ea9 100644 (file)
@@ -85,15 +85,16 @@ except NameError: pass
 
 r(OverflowError)
 # XXX
-# Obscure:  this test relies on int+int raising OverflowError if the
-# ints are big enough.  But ints no longer do that by default.  This
-# test will have to go away someday.  For now, we can convert the
-# transitional OverflowWarning into an error.
+# Obscure:  in 2.2 and 2.3, this test relied on changing OverflowWarning
+# into an error, in order to trigger OverflowError.  In 2.4, OverflowWarning
+# should no longer be generated, so the focus of the test shifts to showing
+# that OverflowError *isn't* generated.  OverflowWarning should be gone
+# in Python 2.5, and then the filterwarnings() call, and this comment,
+# should go away.
 warnings.filterwarnings("error", "", OverflowWarning, __name__)
 x = 1
-try:
-    while 1: x = x+x
-except OverflowError: pass
+for dummy in range(128):
+    x += x  # this simply shouldn't blow up
 
 r(RuntimeError)
 print '(not used any more?)'
index 4bfae320bd88fe74e4032f76e0764c592eeaa24d..c861a2ebc82b242d5aaf84bc373f58cffa5f2ae3 100644 (file)
@@ -44,6 +44,7 @@ class TestModule(unittest.TestCase):
 
     def test_warn_specific_category(self):
         text = 'None'
+        # XXX OverflowWarning should go away for Python 2.5.
         for category in [DeprecationWarning, FutureWarning, OverflowWarning,
                     PendingDeprecationWarning, RuntimeWarning,
                     SyntaxWarning, UserWarning, Warning]:
index 849ccedce2aea9003937b38f378de0e56ac60c74..fd944edf53a6dd398e65b5e30ba5ee23ddc05f7f 100644 (file)
@@ -250,5 +250,6 @@ def _getcategory(category):
 
 # Module initialization
 _processoptions(sys.warnoptions)
+# XXX OverflowWarning should go away for Python 2.5.
 simplefilter("ignore", category=OverflowWarning, append=1)
 simplefilter("ignore", category=PendingDeprecationWarning, append=1)
index bc77b7d17278c875a62977db8dc48b3e1fe17af5..56c687fbc25dcea4b4ed3aa3ac1ee6be728352b8 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,12 @@ What's New in Python 2.4 alpha 3?
 Core and builtins
 -----------------
 
+- OverflowWarning is no longer generated.  PEP 237 scheduled this to
+  occur in Python 2.3, but since OverflowWarning was disabled by default,
+  nobody realized it was still being generated.  On the chance that user
+  code is still using them, the Python builtin OverflowWarning, and
+  corresponding C API PyExc_OverflowWarning, will exist until Python 2.5.
+
 - Py_InitializeEx has been added.
 
 - Fix the order of application of decorators.  The proper order is bottom-up;
index f52ef07e22452b970d15ef8208a18ad9a956375b..763ed53d4b9cd308df5e5389af530da9c0d05ebc 100644 (file)
@@ -10,19 +10,6 @@ PyInt_GetMax(void)
        return LONG_MAX;        /* To initialize sys.maxint */
 }
 
-/* Return 1 if exception raised, 0 if caller should retry using longs */
-static int
-err_ovf(char *msg)
-{
-       if (PyErr_Warn(PyExc_OverflowWarning, msg) < 0) {
-               if (PyErr_ExceptionMatches(PyExc_OverflowWarning))
-                       PyErr_SetString(PyExc_OverflowError, msg);
-               return 1;
-       }
-       else
-               return 0;
-}
-
 /* Integers are quite normal objects, to make object handling uniform.
    (Using odd pointers to represent integers would save much space
    but require extra checks for this special case throughout the code.)
@@ -306,11 +293,8 @@ PyInt_FromString(char *s, char **pend, int base)
                PyErr_SetString(PyExc_ValueError, buffer);
                return NULL;
        }
-       else if (errno != 0) {
-               if (err_ovf("string/unicode conversion"))
-                       return NULL;
+       else if (errno != 0)
                return PyLong_FromString(s, pend, base);
-       }
        if (pend)
                *pend = end;
        return PyInt_FromLong(x);
@@ -396,8 +380,6 @@ int_add(PyIntObject *v, PyIntObject *w)
        x = a + b;
        if ((x^a) >= 0 || (x^b) >= 0)
                return PyInt_FromLong(x);
-       if (err_ovf("integer addition"))
-               return NULL;
        return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w);
 }
 
@@ -410,8 +392,6 @@ int_sub(PyIntObject *v, PyIntObject *w)
        x = a - b;
        if ((x^a) >= 0 || (x^~b) >= 0)
                return PyInt_FromLong(x);
-       if (err_ovf("integer subtraction"))
-               return NULL;
        return PyLong_Type.tp_as_number->nb_subtract((PyObject *)v,
                                                     (PyObject *)w);
 }
@@ -475,8 +455,6 @@ int_mul(PyObject *v, PyObject *w)
                   32 * absdiff <= absprod -- 5 good bits is "close enough" */
                if (32.0 * absdiff <= absprod)
                        return PyInt_FromLong(longprod);
-               else if (err_ovf("integer multiplication"))
-                       return NULL;
                else
                        return PyLong_Type.tp_as_number->nb_multiply(v, w);
        }
@@ -501,11 +479,8 @@ i_divmod(register long x, register long y,
                return DIVMOD_ERROR;
        }
        /* (-sys.maxint-1)/-1 is the only overflow case. */
-       if (y == -1 && x < 0 && x == -x) {
-               if (err_ovf("integer division"))
-                       return DIVMOD_ERROR;
+       if (y == -1 && x < 0 && x == -x)
                return DIVMOD_OVERFLOW;
-       }
        xdivy = x / y;
        xmody = x - xdivy * y;
        /* If the signs of x and y differ, and the remainder is non-0,
@@ -654,8 +629,6 @@ int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
                        if (temp == 0)
                                break; /* Avoid ix / 0 */
                        if (ix / temp != prev) {
-                               if (err_ovf("integer exponentiation"))
-                                       return NULL;
                                return PyLong_Type.tp_as_number->nb_power(
                                        (PyObject *)v,
                                        (PyObject *)w,
@@ -666,9 +639,7 @@ int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
                if (iw==0) break;
                prev = temp;
                temp *= temp;   /* Square the value of temp */
-               if (prev!=0 && temp/prev!=prev) {
-                       if (err_ovf("integer exponentiation"))
-                               return NULL;
+               if (prev != 0 && temp / prev != prev) {
                        return PyLong_Type.tp_as_number->nb_power(
                                (PyObject *)v, (PyObject *)w, (PyObject *)z);
                }
@@ -701,10 +672,7 @@ int_neg(PyIntObject *v)
        a = v->ob_ival;
        x = -a;
        if (a < 0 && x < 0) {
-               PyObject *o;
-               if (err_ovf("integer negation"))
-                       return NULL;
-               o = PyLong_FromLong(a);
+               PyObject *o = PyLong_FromLong(a);
                if (o != NULL) {
                        PyObject *result = PyNumber_Negative(o);
                        Py_DECREF(o);
index 464204612540505e4fcae9c46c186e926a254186..2fd74bc76d33a46266c6949d7b876c493ddcbdef 100644 (file)
@@ -1560,7 +1560,7 @@ PyDoc_STRVAR(SyntaxWarning__doc__,
 "Base class for warnings about dubious syntax.");
 
 PyDoc_STRVAR(OverflowWarning__doc__,
-"Base class for warnings about numeric overflow.");
+"Base class for warnings about numeric overflow.  Won't exist in Python 2.5.");
 
 PyDoc_STRVAR(RuntimeWarning__doc__,
 "Base class for warnings about dubious runtime behavior.");
@@ -1635,6 +1635,7 @@ PyObject *PyExc_UserWarning;
 PyObject *PyExc_DeprecationWarning;
 PyObject *PyExc_PendingDeprecationWarning;
 PyObject *PyExc_SyntaxWarning;
+/* PyExc_OverflowWarning should be removed for Python 2.5 */
 PyObject *PyExc_OverflowWarning;
 PyObject *PyExc_RuntimeWarning;
 PyObject *PyExc_FutureWarning;
@@ -1726,6 +1727,7 @@ static struct {
  {"PendingDeprecationWarning", &PyExc_PendingDeprecationWarning, &PyExc_Warning,
   PendingDeprecationWarning__doc__},
  {"SyntaxWarning", &PyExc_SyntaxWarning, &PyExc_Warning, SyntaxWarning__doc__},
+ /* OverflowWarning should be removed for Python 2.5 */
  {"OverflowWarning", &PyExc_OverflowWarning, &PyExc_Warning,
   OverflowWarning__doc__},
  {"RuntimeWarning", &PyExc_RuntimeWarning, &PyExc_Warning,