diff Python/ceval.c @ 302:d19a665904df legacy-trunk

Call coerce() in arithmetic operations, to support mixed mode arithmetic
author Guido van Rossum <guido@python.org>
date Mon, 01 Jul 1991 18:43:13 +0000
parents 6ac402023cac
children ae89411f6fc0
line wrap: on
line diff
--- a/Python/ceval.c	Mon Jul 01 18:42:41 1991 +0000
+++ b/Python/ceval.c	Mon Jul 01 18:43:13 1991 +0000
@@ -1000,23 +1000,36 @@
 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 @@
 		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 @@
 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 @@
 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;
 }