]> granicus.if.org Git - python/commitdiff
When an inlined operation on two small ints causes overflow, don't
authorGuido van Rossum <guido@python.org>
Thu, 23 Aug 2001 02:58:07 +0000 (02:58 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 23 Aug 2001 02:58:07 +0000 (02:58 +0000)
raise the exception here -- call the generic function (which may
convert the arguments to long and try again).

Python/ceval.c

index f052e9726aff7ee1f9ceda960c7639e0cf873085..c9c9bf146ec7ff04f2bb190dddf6a24b1df17522 100644 (file)
@@ -915,16 +915,14 @@ eval_frame(PyFrameObject *f)
                                a = PyInt_AS_LONG(v);
                                b = PyInt_AS_LONG(w);
                                i = a + b;
-                               if ((i^a) < 0 && (i^b) < 0) {
-                                       PyErr_SetString(PyExc_OverflowError,
-                                                       "integer addition");
-                                       x = NULL;
-                               }
-                               else
-                                       x = PyInt_FromLong(i);
+                               if ((i^a) < 0 && (i^b) < 0)
+                                       goto slow_add;
+                               x = PyInt_FromLong(i);
                        }
-                       else
+                       else {
+                         slow_add:
                                x = PyNumber_Add(v, w);
+                       }
                        Py_DECREF(v);
                        Py_DECREF(w);
                        PUSH(x);
@@ -940,16 +938,14 @@ eval_frame(PyFrameObject *f)
                                a = PyInt_AS_LONG(v);
                                b = PyInt_AS_LONG(w);
                                i = a - b;
-                               if ((i^a) < 0 && (i^~b) < 0) {
-                                       PyErr_SetString(PyExc_OverflowError,
-                                                       "integer subtraction");
-                                       x = NULL;
-                               }
-                               else
-                                       x = PyInt_FromLong(i);
+                               if ((i^a) < 0 && (i^~b) < 0)
+                                       goto slow_sub;
+                               x = PyInt_FromLong(i);
                        }
-                       else
+                       else {
+                         slow_sub:
                                x = PyNumber_Subtract(v, w);
+                       }
                        Py_DECREF(v);
                        Py_DECREF(w);
                        PUSH(x);
@@ -1102,16 +1098,14 @@ eval_frame(PyFrameObject *f)
                                a = PyInt_AS_LONG(v);
                                b = PyInt_AS_LONG(w);
                                i = a + b;
-                               if ((i^a) < 0 && (i^b) < 0) {
-                                       PyErr_SetString(PyExc_OverflowError,
-                                                       "integer addition");
-                                       x = NULL;
-                               }
-                               else
-                                       x = PyInt_FromLong(i);
+                               if ((i^a) < 0 && (i^b) < 0)
+                                       goto slow_iadd;
+                               x = PyInt_FromLong(i);
                        }
-                       else
+                       else {
+                         slow_iadd:
                                x = PyNumber_InPlaceAdd(v, w);
+                       }
                        Py_DECREF(v);
                        Py_DECREF(w);
                        PUSH(x);
@@ -1127,16 +1121,14 @@ eval_frame(PyFrameObject *f)
                                a = PyInt_AS_LONG(v);
                                b = PyInt_AS_LONG(w);
                                i = a - b;
-                               if ((i^a) < 0 && (i^~b) < 0) {
-                                       PyErr_SetString(PyExc_OverflowError,
-                                                       "integer subtraction");
-                                       x = NULL;
-                               }
-                               else
-                                       x = PyInt_FromLong(i);
+                               if ((i^a) < 0 && (i^~b) < 0)
+                                       goto slow_isub;
+                               x = PyInt_FromLong(i);
                        }
-                       else
+                       else {
+                         slow_isub:
                                x = PyNumber_InPlaceSubtract(v, w);
+                       }
                        Py_DECREF(v);
                        Py_DECREF(w);
                        PUSH(x);