[Python-checkins] CVS: python/dist/src/Objects floatobject.c,2.90,2.91 intobject.c,2.68,2.69 longobject.c,1.95,1.96

Tim Peters tim_one@users.sourceforge.net
2001年9月03日 01:35:43 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv12739/python/Objects
Modified Files:
	floatobject.c intobject.c longobject.c 
Log Message:
New restriction on pow(x, y, z): If z is not None, x and y must be of
integer types, and y must be >= 0. See discussion at
http://sf.net/tracker/index.php?func=detail&aid=457066&group_id=5470&atid=105470
Index: floatobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/floatobject.c,v
retrieving revision 2.90
retrieving revision 2.91
diff -C2 -d -r2.90 -r2.91
*** floatobject.c	2001年08月31日 17:40:15	2.90
--- floatobject.c	2001年09月03日 08:35:41	2.91
***************
*** 493,501 ****
 {
 	double iv, iw, ix;
! /* XXX Doesn't handle overflows if z!=None yet; it may never do so :(
! * The z parameter is really only going to be useful for integers and
! * long integers. Maybe something clever with logarithms could be done.
! * [AMK]
! */
 	CONVERT_TO_DOUBLE(v, iv);
 	CONVERT_TO_DOUBLE(w, iw);
--- 493,503 ----
 {
 	double iv, iw, ix;
! 
! 	if ((PyObject *)z != Py_None) {
! 		PyErr_SetString(PyExc_TypeError,
! 			"3rd argument to floating pow() must be None");
! 		return NULL;
! 	}
! 
 	CONVERT_TO_DOUBLE(v, iv);
 	CONVERT_TO_DOUBLE(w, iw);
***************
*** 538,551 ****
 		PyErr_SetFromErrno(PyExc_OverflowError);
 		return NULL;
- 	}
- 	if ((PyObject *)z != Py_None) {
- 		double iz;
- 		CONVERT_TO_DOUBLE(z, iz);
- 		PyFPE_START_PROTECT("pow", return 0)
- 	 	ix = fmod(ix, iz);	/* XXX To Be Rewritten */
- 	 	if (ix != 0 && ((iv < 0 && iz > 0) || (iv > 0 && iz < 0) )) {
- 		 ix += iz;
- 		}
- 		PyFPE_END_PROTECT(ix)
 	}
 	return PyFloat_FromDouble(ix);
--- 540,543 ----
Index: intobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/intobject.c,v
retrieving revision 2.68
retrieving revision 2.69
diff -C2 -d -r2.68 -r2.69
*** intobject.c	2001年08月31日 17:40:15	2.68
--- intobject.c	2001年09月03日 08:35:41	2.69
***************
*** 576,579 ****
--- 576,584 ----
 	CONVERT_TO_LONG(w, iw);
 	if (iw < 0) {
+ 		if ((PyObject *)z != Py_None) {
+ 			PyErr_SetString(PyExc_TypeError, "integer pow() arg "
+ 			 "3 must not be specified when arg 2 is < 0");
+ 			return NULL;
+ 		}
 		/* Return a float. This works because we know that
 		 this calls float_pow() which converts its
Index: longobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/longobject.c,v
retrieving revision 1.95
retrieving revision 1.96
diff -C2 -d -r1.95 -r1.96
*** longobject.c	2001年08月31日 17:40:15	1.95
--- longobject.c	2001年09月03日 08:35:41	1.96
***************
*** 1599,1608 ****
 	size_b = b->ob_size;
 	if (size_b < 0) {
- 		/* Return a float. This works because we know that
- 		 this calls float_pow() which converts its
- 		 arguments to double. */
 		Py_DECREF(a);
 		Py_DECREF(b);
 		Py_DECREF(c);
 		return PyFloat_Type.tp_as_number->nb_power(v, w, x);
 	}
--- 1599,1613 ----
 	size_b = b->ob_size;
 	if (size_b < 0) {
 		Py_DECREF(a);
 		Py_DECREF(b);
 		Py_DECREF(c);
+ 		if (x != Py_None) {
+ 			PyErr_SetString(PyExc_TypeError, "integer pow() arg "
+ 			 "3 must not be specified when arg 2 is < 0");
+ 			return NULL;
+ 		}
+ 		/* Return a float. This works because we know that
+ 		 this calls float_pow() which converts its
+ 		 arguments to double. */
 		return PyFloat_Type.tp_as_number->nb_power(v, w, x);
 	}

AltStyle によって変換されたページ (->オリジナル) /