[Python-checkins] CVS: python/dist/src/Objects abstract.c,2.45,2.46

Thomas Wouters python-dev@python.org
Wed, 23 Aug 2000 16:16:13 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory slayer.i.sourceforge.net:/tmp/cvs-serv31334/Objects

Modified Files:
	abstract.c 
Log Message:

Add extra check on whether 'tp_as_number' is still non-NULL after coercion,
in the PyNumber_* functions. Also, remove unnecessary tests from
PyNumber_Multiply: after BINOP(), neither argument can be an instance.



Index: abstract.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/abstract.c,v
retrieving revision 2.45
retrieving revision 2.46
diff -C2 -r2.45 -r2.46
*** abstract.c	2000/08/17 22:37:32	2.45
--- abstract.c	2000/08/23 23:16:10	2.46
***************
*** 295,299 ****
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
--- 295,300 ----
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if (v->ob_type->tp_as_number != NULL &&
! 		    (f = v->ob_type->tp_as_number->nb_or) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
***************
*** 314,318 ****
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
--- 315,320 ----
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if (v->ob_type->tp_as_number != NULL &&
! 		    (f = v->ob_type->tp_as_number->nb_xor) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
***************
*** 333,337 ****
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
--- 335,340 ----
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if (v->ob_type->tp_as_number != NULL &&
! 		    (f = v->ob_type->tp_as_number->nb_and) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
***************
*** 352,356 ****
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
--- 355,360 ----
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if (v->ob_type->tp_as_number != NULL &&
! 		    (f = v->ob_type->tp_as_number->nb_lshift) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
***************
*** 371,375 ****
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
--- 375,380 ----
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if (v->ob_type->tp_as_number != NULL &&
! 		    (f = v->ob_type->tp_as_number->nb_rshift) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
***************
*** 395,399 ****
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if ((f = v->ob_type->tp_as_number->nb_add) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
--- 400,405 ----
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if (v->ob_type->tp_as_number != NULL &&
! 		    (f = v->ob_type->tp_as_number->nb_add) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
***************
*** 414,418 ****
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if ((f = v->ob_type->tp_as_number->nb_subtract) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
--- 420,425 ----
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if (v->ob_type->tp_as_number != NULL &&
! 		    (f = v->ob_type->tp_as_number->nb_subtract) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
***************
*** 432,437 ****
  	BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
  	if (tp->tp_as_number != NULL &&
! 	    w->ob_type->tp_as_sequence != NULL &&
! 	    !PyInstance_Check(v)) {
  		/* number*sequence -- swap v and w */
  		PyObject *tmp = v;
--- 439,443 ----
  	BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
  	if (tp->tp_as_number != NULL &&
! 	    w->ob_type->tp_as_sequence != NULL) {
  		/* number*sequence -- swap v and w */
  		PyObject *tmp = v;
***************
*** 443,457 ****
  		PyObject *x = NULL;
  		PyObject * (*f)(PyObject *, PyObject *);
! 		if (PyInstance_Check(v)) {
! 			/* Instances of user-defined classes get their
! 			   other argument uncoerced, so they may
! 			   implement sequence*number as well as
! 			   number*number. */
! 			Py_INCREF(v);
! 			Py_INCREF(w);
! 		}
! 		else if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if ((f = v->ob_type->tp_as_number->nb_multiply) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
--- 449,456 ----
  		PyObject *x = NULL;
  		PyObject * (*f)(PyObject *, PyObject *);
! 		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if (v->ob_type->tp_as_number != NULL &&
! 		    (f = v->ob_type->tp_as_number->nb_multiply) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
***************
*** 490,494 ****
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if ((f = v->ob_type->tp_as_number->nb_divide) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
--- 489,494 ----
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if (v->ob_type->tp_as_number != NULL &&
! 		    (f = v->ob_type->tp_as_number->nb_divide) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
***************
*** 513,517 ****
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
--- 513,518 ----
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if (v->ob_type->tp_as_number != NULL &&
! 		    (f = v->ob_type->tp_as_number->nb_remainder) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
***************
*** 532,536 ****
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if ((f = v->ob_type->tp_as_number->nb_divmod) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
--- 533,538 ----
  		if (PyNumber_Coerce(&v, &w) != 0)
  			return NULL;
! 		if (v->ob_type->tp_as_number != NULL &&
! 		    (f = v->ob_type->tp_as_number->nb_divmod) != NULL)
  			x = (*f)(v, w);
  		Py_DECREF(v);
***************
*** 558,562 ****
  	if (PyNumber_Coerce(&v, &w) != 0)
  		return NULL;
! 	if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
  		res = (*f)(v, w, Py_None);
  	else
--- 560,565 ----
  	if (PyNumber_Coerce(&v, &w) != 0)
  		return NULL;
! 	if (v->ob_type->tp_as_number != NULL &&
! 	    (f = v->ob_type->tp_as_number->nb_power) != NULL)
  		res = (*f)(v, w, Py_None);
  	else
***************
*** 595,599 ****
   	if (PyNumber_Coerce(&w2, &z2) != 0)
  		goto error1;
! 	if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
  		res = (*f)(v1, w2, z2);
  	else
--- 598,603 ----
   	if (PyNumber_Coerce(&w2, &z2) != 0)
  		goto error1;
! 	if (v->ob_type->tp_as_number != NULL &&
! 	    (f = v1->ob_type->tp_as_number->nb_power) != NULL)
  		res = (*f)(v1, w2, z2);
  	else