]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Call coerce() in arithmetic operations, to support mixed mode arithmetic
authorGuido van Rossum <guido@python.org>
Mon, 1 Jul 1991 18:43:13 +0000 (18:43 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 1 Jul 1991 18:43:13 +0000 (18:43 +0000)
Python/ceval.c

index 975b78881bd0aab8d05335fb55599a61e9d59b29..4f81bff7844741fcc2d30747c6cda6c957cb7e64 100644 (file)
@@ -1000,23 +1000,36 @@ static object *
 add(v, w)
        object *v, *w;
 {
-       if (v->ob_type->tp_as_number != NULL)
-               v = (*v->ob_type->tp_as_number->nb_add)(v, w);
+       if (v->ob_type->tp_as_number != NULL) {
+               object *x;
+               if (coerce(&v, &w) != 0)
+                       return NULL;
+               x = (*v->ob_type->tp_as_number->nb_add)(v, w);
+               DECREF(v);
+               DECREF(w);
+               return x;
+       }
        else if (v->ob_type->tp_as_sequence != NULL)
-               v = (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
+               return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
        else {
                err_setstr(TypeError, "+ not supported by operands");
                return NULL;
        }
-       return v;
 }
 
 static object *
 sub(v, w)
        object *v, *w;
 {
-       if (v->ob_type->tp_as_number != NULL)
-               return (*v->ob_type->tp_as_number->nb_subtract)(v, w);
+       if (v->ob_type->tp_as_number != NULL) {
+               object *x;
+               if (coerce(&v, &w) != 0)
+                       return NULL;
+               x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
+               DECREF(v);
+               DECREF(w);
+               return x;
+       }
        err_setstr(TypeError, "bad operand type(s) for -");
        return NULL;
 }
@@ -1033,8 +1046,15 @@ mul(v, w)
                w = tmp;
        }
        tp = v->ob_type;
-       if (tp->tp_as_number != NULL)
-               return (*tp->tp_as_number->nb_multiply)(v, w);
+       if (tp->tp_as_number != NULL) {
+               object *x;
+               if (coerce(&v, &w) != 0)
+                       return NULL;
+               x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
+               DECREF(v);
+               DECREF(w);
+               return x;
+       }
        if (tp->tp_as_sequence != NULL) {
                if (!is_intobject(w)) {
                        err_setstr(TypeError,
@@ -1052,8 +1072,15 @@ static object *
 divide(v, w)
        object *v, *w;
 {
-       if (v->ob_type->tp_as_number != NULL)
-               return (*v->ob_type->tp_as_number->nb_divide)(v, w);
+       if (v->ob_type->tp_as_number != NULL) {
+               object *x;
+               if (coerce(&v, &w) != 0)
+                       return NULL;
+               x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
+               DECREF(v);
+               DECREF(w);
+               return x;
+       }
        err_setstr(TypeError, "bad operand type(s) for /");
        return NULL;
 }
@@ -1062,8 +1089,15 @@ static object *
 rem(v, w)
        object *v, *w;
 {
-       if (v->ob_type->tp_as_number != NULL)
-               return (*v->ob_type->tp_as_number->nb_remainder)(v, w);
+       if (v->ob_type->tp_as_number != NULL) {
+               object *x;
+               if (coerce(&v, &w) != 0)
+                       return NULL;
+               x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
+               DECREF(v);
+               DECREF(w);
+               return x;
+       }
        err_setstr(TypeError, "bad operand type(s) for %");
        return NULL;
 }