]> granicus.if.org Git - python/commitdiff
Consolidate the int and long sequence repeat code. Before the change,
authorNeil Schemenauer <nascheme@enme.ucalgary.ca>
Mon, 30 Dec 2002 20:19:02 +0000 (20:19 +0000)
committerNeil Schemenauer <nascheme@enme.ucalgary.ca>
Mon, 30 Dec 2002 20:19:02 +0000 (20:19 +0000)
integers checked for integer overflow but longs did not.

Objects/intobject.c
Objects/longobject.c

index 7242dd017061c8fecada3d41259c320a2d6bc37d..19d18d30793a7f14cf88c81cf64f6a8f3646bd35 100644 (file)
@@ -354,14 +354,6 @@ one that can lose catastrophic amounts of information, it's the native long
 product that must have overflowed.
 */
 
-/* Return true if the sq_repeat method should be used */
-#define USE_SQ_REPEAT(o) (!PyInt_Check(o) && \
-                         o->ob_type->tp_as_sequence && \
-                         o->ob_type->tp_as_sequence->sq_repeat && \
-                         !(o->ob_type->tp_as_number && \
-                            o->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES && \
-                           o->ob_type->tp_as_number->nb_multiply))
-
 static PyObject *
 int_mul(PyObject *v, PyObject *w)
 {
@@ -370,44 +362,6 @@ int_mul(PyObject *v, PyObject *w)
        double doubled_longprod;        /* (double)longprod */
        double doubleprod;              /* (double)a * (double)b */
 
-       if (USE_SQ_REPEAT(v)) {
-         repeat:
-               /* sequence * int */
-               a = PyInt_AsLong(w);
-#if LONG_MAX != INT_MAX
-               if (a > INT_MAX) {
-                       PyErr_SetString(PyExc_ValueError,
-                                       "sequence repeat count too large");
-                       return NULL;
-               }
-               else if (a < INT_MIN)
-                       a = INT_MIN;
-               /* XXX Why don't I either
-
-                  - set a to -1 whenever it's negative (after all,
-                    sequence repeat usually treats negative numbers
-                    as zero(); or
-
-                  - raise an exception when it's less than INT_MIN?
-
-                  I'm thinking about a hypothetical use case where some
-                  sequence type might use a negative value as a flag of
-                  some kind.  In those cases I don't want to break the
-                  code by mapping all negative values to -1.  But I also
-                  don't want to break e.g. []*(-sys.maxint), which is
-                  perfectly safe, returning [].  As a compromise, I do
-                  map out-of-range negative values.
-               */
-#endif
-               return (*v->ob_type->tp_as_sequence->sq_repeat)(v, a);
-       }
-       if (USE_SQ_REPEAT(w)) {
-               PyObject *tmp = v;
-               v = w;
-               w = tmp;
-               goto repeat;
-       }
-
        CONVERT_TO_LONG(v, a);
        CONVERT_TO_LONG(w, b);
        longprod = a * b;
index 5038823334b65b448fc7fa2a2e81dce06e8b0e45..cb27e79b249e8a67503d1b74c7791047e1b5ba18 100644 (file)
@@ -1508,17 +1508,6 @@ long_sub(PyLongObject *v, PyLongObject *w)
        return (PyObject *)z;
 }
 
-static PyObject *
-long_repeat(PyObject *v, PyLongObject *w)
-{
-       /* sequence * long */
-       long n = PyLong_AsLong((PyObject *) w);
-       if (n == -1 && PyErr_Occurred())
-               return NULL;
-       else
-               return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
-}
-
 /* Grade school multiplication, ignoring the signs.
  * Returns the absolute value of the product, or NULL if error.
  */
@@ -1868,14 +1857,6 @@ long_mul(PyLongObject *v, PyLongObject *w)
        PyLongObject *a, *b, *z;
 
        if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
-               if (!PyLong_Check(v) &&
-                   v->ob_type->tp_as_sequence &&
-                   v->ob_type->tp_as_sequence->sq_repeat)
-                       return long_repeat((PyObject *)v, w);
-               if (!PyLong_Check(w) &&
-                   w->ob_type->tp_as_sequence &&
-                   w->ob_type->tp_as_sequence->sq_repeat)
-                       return long_repeat((PyObject *)w, v);
                Py_INCREF(Py_NotImplemented);
                return Py_NotImplemented;
        }