[Python-checkins] CVS: python/dist/src/Objects floatobject.c,2.75,2.76

Neil Schemenauer python-dev@python.org
Wed, 03 Jan 2001 17:44:37 -0800


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv22446/Objects

Modified Files:
	floatobject.c 
Log Message:
Make float a new style number type.


Index: floatobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/floatobject.c,v
retrieving revision 2.75
retrieving revision 2.76
diff -C2 -r2.75 -r2.76
*** floatobject.c	2000/10/24 19:57:45	2.75
--- floatobject.c	2001/01/04 01:44:34	2.76
***************
*** 257,260 ****
--- 257,292 ----
  }
  
+ /* Macro and helper that convert PyObject obj to a C double and store
+    the value in dbl; this replaces the functionality of the coercion
+    slot function */
+ 
+ #define CONVERT_TO_DOUBLE(obj, dbl)			\
+ 	if (PyFloat_Check(obj))				\
+ 		dbl = PyFloat_AS_DOUBLE(obj);		\
+ 	else if (convert_to_double(&(obj), &(dbl)) < 0)	\
+ 		return obj;
+ 
+ static int
+ convert_to_double(PyObject **v,
+ 		  double *dbl)
+ {
+ 	register PyObject *obj = *v;
+ 	
+ 	if (PyInt_Check(obj)) {
+ 		*dbl = (double)PyInt_AS_LONG(obj);
+ 	}
+ 	else if (PyLong_Check(obj)) {
+ 		PyFPE_START_PROTECT("convert_to_double", {*v=NULL;return -1;})
+ 		*dbl = PyLong_AsDouble(obj);
+ 		PyFPE_END_PROTECT(result)
+ 	}
+ 	else {
+ 		Py_INCREF(Py_NotImplemented);
+ 		*v = Py_NotImplemented;
+ 		return -1;
+ 	}
+ 	return 0;
+ }
+ 
  /* Precisions used by repr() and str(), respectively.
  
***************
*** 315,318 ****
--- 347,359 ----
  }
  
+ /* Needed for the new style number compare slots */
+ static PyObject *
+ float_cmp(PyObject *v, PyObject *w)
+ {
+ 	double a,b;
+ 	CONVERT_TO_DOUBLE(v, a);
+ 	CONVERT_TO_DOUBLE(w, b);
+ 	return PyInt_FromLong((a < b) ? -1 : (a > b) ? 1 : 0);
+ }
  
  static long
***************
*** 323,376 ****
  
  static PyObject *
! float_add(PyFloatObject *v, PyFloatObject *w)
  {
! 	double result;
  	PyFPE_START_PROTECT("add", return 0)
! 	result = v->ob_fval + w->ob_fval;
! 	PyFPE_END_PROTECT(result)
! 	return PyFloat_FromDouble(result);
  }
  
  static PyObject *
! float_sub(PyFloatObject *v, PyFloatObject *w)
  {
! 	double result;
  	PyFPE_START_PROTECT("subtract", return 0)
! 	result = v->ob_fval - w->ob_fval;
! 	PyFPE_END_PROTECT(result)
! 	return PyFloat_FromDouble(result);
  }
  
  static PyObject *
! float_mul(PyFloatObject *v, PyFloatObject *w)
  {
! 	double result;
! 
  	PyFPE_START_PROTECT("multiply", return 0)
! 	result = v->ob_fval * w->ob_fval;
! 	PyFPE_END_PROTECT(result)
! 	return PyFloat_FromDouble(result);
  }
  
  static PyObject *
! float_div(PyFloatObject *v, PyFloatObject *w)
  {
! 	double result;
! 	if (w->ob_fval == 0) {
  		PyErr_SetString(PyExc_ZeroDivisionError, "float division");
  		return NULL;
  	}
  	PyFPE_START_PROTECT("divide", return 0)
! 	result = v->ob_fval / w->ob_fval;
! 	PyFPE_END_PROTECT(result)
! 	return PyFloat_FromDouble(result);
  }
  
  static PyObject *
! float_rem(PyFloatObject *v, PyFloatObject *w)
  {
  	double vx, wx;
  	double mod;
! 	wx = w->ob_fval;
  	if (wx == 0.0) {
  		PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
--- 364,425 ----
  
  static PyObject *
! float_add(PyObject *v, PyObject *w)
  {
! 	double a,b;
! 	CONVERT_TO_DOUBLE(v, a);
! 	CONVERT_TO_DOUBLE(w, b);
  	PyFPE_START_PROTECT("add", return 0)
! 	a = a + b;
! 	PyFPE_END_PROTECT(a)
! 	return PyFloat_FromDouble(a);
  }
  
  static PyObject *
! float_sub(PyObject *v, PyObject *w)
  {
! 	double a,b;
! 	CONVERT_TO_DOUBLE(v, a);
! 	CONVERT_TO_DOUBLE(w, b);
  	PyFPE_START_PROTECT("subtract", return 0)
! 	a = a - b;
! 	PyFPE_END_PROTECT(a)
! 	return PyFloat_FromDouble(a);
  }
  
  static PyObject *
! float_mul(PyObject *v, PyObject *w)
  {
! 	double a,b;
! 	CONVERT_TO_DOUBLE(v, a);
! 	CONVERT_TO_DOUBLE(w, b);
  	PyFPE_START_PROTECT("multiply", return 0)
! 	a = a * b;
! 	PyFPE_END_PROTECT(a)
! 	return PyFloat_FromDouble(a);
  }
  
  static PyObject *
! float_div(PyObject *v, PyObject *w)
  {
! 	double a,b;
! 	CONVERT_TO_DOUBLE(v, a);
! 	CONVERT_TO_DOUBLE(w, b);
! 	if (b == 0.0) {
  		PyErr_SetString(PyExc_ZeroDivisionError, "float division");
  		return NULL;
  	}
  	PyFPE_START_PROTECT("divide", return 0)
! 	a = a / b;
! 	PyFPE_END_PROTECT(a)
! 	return PyFloat_FromDouble(a);
  }
  
  static PyObject *
! float_rem(PyObject *v, PyObject *w)
  {
  	double vx, wx;
  	double mod;
!  	CONVERT_TO_DOUBLE(v, vx);
!  	CONVERT_TO_DOUBLE(w, wx);
  	if (wx == 0.0) {
  		PyErr_SetString(PyExc_ZeroDivisionError, "float modulo");
***************
*** 378,382 ****
  	}
  	PyFPE_START_PROTECT("modulo", return 0)
- 	vx = v->ob_fval;
  	mod = fmod(vx, wx);
  	/* note: checking mod*wx < 0 is incorrect -- underflows to
--- 427,430 ----
***************
*** 390,398 ****
  
  static PyObject *
! float_divmod(PyFloatObject *v, PyFloatObject *w)
  {
  	double vx, wx;
  	double div, mod, floordiv;
! 	wx = w->ob_fval;
  	if (wx == 0.0) {
  		PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
--- 438,447 ----
  
  static PyObject *
! float_divmod(PyObject *v, PyObject *w)
  {
  	double vx, wx;
  	double div, mod, floordiv;
!  	CONVERT_TO_DOUBLE(v, vx);
!  	CONVERT_TO_DOUBLE(w, wx);
  	if (wx == 0.0) {
  		PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
***************
*** 400,404 ****
  	}
  	PyFPE_START_PROTECT("divmod", return 0)
- 	vx = v->ob_fval;
  	mod = fmod(vx, wx);
  	/* fmod is typically exact, so vx-mod is *mathematically* an
--- 449,452 ----
***************
*** 438,442 ****
  
  static PyObject *
! float_pow(PyFloatObject *v, PyObject *w, PyFloatObject *z)
  {
  	double iv, iw, ix;
--- 486,490 ----
  
  static PyObject *
! float_pow(PyObject *v, PyObject *w, PyObject *z)
  {
  	double iv, iw, ix;
***************
*** 447,452 ****
    * [AMK]
    */
! 	iv = v->ob_fval;
! 	iw = ((PyFloatObject *)w)->ob_fval;
  	intw = (long)iw;
  
--- 495,500 ----
    * [AMK]
    */
! 	CONVERT_TO_DOUBLE(v, iv);
! 	CONVERT_TO_DOUBLE(w, iw);
  	intw = (long)iw;
  
***************
*** 455,461 ****
  		PyFPE_START_PROTECT("pow", return NULL)
  		if ((PyObject *)z != Py_None) {
! 			ix = fmod(1.0, z->ob_fval);
! 			if (ix != 0 && z->ob_fval < 0)
! 				ix += z->ob_fval;
  		}
  		else
--- 503,510 ----
  		PyFPE_START_PROTECT("pow", return NULL)
  		if ((PyObject *)z != Py_None) {
! 			double iz;
! 			CONVERT_TO_DOUBLE(w, iz);
! 			ix=fmod(1.0, iz);
! 			if (ix!=0 && iz<0) ix+=iz;
  		}
  		else
***************
*** 502,514 ****
  	}
  	if ((PyObject *)z != Py_None) {
! 		PyFPE_START_PROTECT("pow", return NULL)
! 		ix = fmod(ix, z->ob_fval);	/* XXX To Be Rewritten */
! 		if (ix != 0 &&
! 		    ((iv < 0 && z->ob_fval > 0) ||
! 		     (iv > 0 && z->ob_fval < 0)
! 		    )) {
! 		     ix += z->ob_fval;
  		}
! 		PyFPE_END_PROTECT(ix)
  	}
  	return PyFloat_FromDouble(ix);
--- 551,562 ----
  	}
  	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);
***************
*** 612,615 ****
--- 660,677 ----
  	0,		/*nb_oct*/
  	0,		/*nb_hex*/
+ 	0,		/*nb_inplace_add*/
+ 	0,		/*nb_inplace_subtract*/
+ 	0,		/*nb_inplace_multiply*/
+ 	0,		/*nb_inplace_divide*/
+ 	0,		/*nb_inplace_remainder*/
+ 	0, 		/*nb_inplace_power*/
+ 	0,		/*nb_inplace_lshift*/
+ 	0,		/*nb_inplace_rshift*/
+ 	0,		/*nb_inplace_and*/
+ 	0,		/*nb_inplace_xor*/
+ 	0,		/*nb_inplace_or*/
+ 
+ 	/* New style slots: */
+ 	(binaryfunc)float_cmp, /*nb_cmp*/
  };
  
***************
*** 632,635 ****
--- 694,701 ----
          0,			/*tp_call*/
          (reprfunc)float_str,	/*tp_str*/
+ 	0,			/*tp_getattro*/
+ 	0,			/*tp_setattro*/
+ 	0,			/*tp_as_buffer*/
+ 	Py_TPFLAGS_NEWSTYLENUMBER /*tp_flags*/
  };