[Python-checkins] CVS: python/dist/src/Modules mpzmodule.c,2.42,2.43

Neal Norwitz nnorwitz@users.sourceforge.net
Sun, 31 Mar 2002 17:37:16 -0800


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

Modified Files:
	mpzmodule.c 
Log Message:
Get rid of all METH_OLDARGS & PyArg_Parse.
Fix floating point exception if mpz.powm(10, 1, 0) (modulus == 0).
Add a test.


Index: mpzmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/mpzmodule.c,v
retrieving revision 2.42
retrieving revision 2.43
diff -C2 -d -r2.42 -r2.43
*** mpzmodule.c	31 Mar 2002 22:02:37 -0000	2.42
--- mpzmodule.c	1 Apr 2002 01:37:14 -0000	2.43
***************
*** 836,840 ****
  {
  	mpzobject *mpzp;
- 	PyObject *objp;
  
  
--- 836,839 ----
***************
*** 843,858 ****
  #endif /* def MPZ_DEBUG */
  
- 	if (!PyArg_Parse(args, "O", &objp))
- 		return NULL;
- 
  	/* at least we know it's some object */
! 	/* note DON't Py_DECREF args NEITHER objp */
! 
! 	if (PyInt_Check(objp)) {
! 		long lval;
! 
! 		if (!PyArg_Parse(objp, "l", &lval))
! 			return NULL;
  
  		if (lval == (long)0) {
  			Py_INCREF(mpz_value_zero);
--- 842,850 ----
  #endif /* def MPZ_DEBUG */
  
  	/* at least we know it's some object */
! 	/* note DON't Py_DECREF args */
  
+ 	if (PyInt_Check(args)) {
+ 		long lval = PyInt_AS_LONG(args);
  		if (lval == (long)0) {
  			Py_INCREF(mpz_value_zero);
***************
*** 867,871 ****
  		else mpz_set_si(&mpzp->mpz, lval);
  	}
! 	else if (PyLong_Check(objp)) {
  		MP_INT mplongdigit;
  		int i;
--- 859,863 ----
  		else mpz_set_si(&mpzp->mpz, lval);
  	}
! 	else if (PyLong_Check(args)) {
  		MP_INT mplongdigit;
  		int i;
***************
*** 881,885 ****
  		/* how we're gonna handle this? */
  		if ((isnegative =
! 		     ((i = ((PyLongObject *)objp)->ob_size) < 0) ))
  			i = -i;
  
--- 873,877 ----
  		/* how we're gonna handle this? */
  		if ((isnegative =
! 		     ((i = ((PyLongObject *)args)->ob_size) < 0) ))
  			i = -i;
  
***************
*** 887,891 ****
  			mpz_set_ui(&mplongdigit,
  				   (unsigned long)
! 				   ((PyLongObject *)objp)->ob_digit[i]);
  			mpz_mul_2exp(&mplongdigit,&mplongdigit,
  				     (unsigned long int)i * SHIFT);
--- 879,883 ----
  			mpz_set_ui(&mplongdigit,
  				   (unsigned long)
! 				   ((PyLongObject *)args)->ob_digit[i]);
  			mpz_mul_2exp(&mplongdigit,&mplongdigit,
  				     (unsigned long int)i * SHIFT);
***************
*** 899,905 ****
  		mpz_clear(&mplongdigit);
  	}
! 	else if (PyString_Check(objp)) {
! 		unsigned char *cp = (unsigned char *)PyString_AS_STRING(objp);
! 		int len = PyString_GET_SIZE(objp);
  		MP_INT mplongdigit;
  
--- 891,897 ----
  		mpz_clear(&mplongdigit);
  	}
! 	else if (PyString_Check(args)) {
! 		unsigned char *cp = (unsigned char *)PyString_AS_STRING(args);
! 		int len = PyString_GET_SIZE(args);
  		MP_INT mplongdigit;
  
***************
*** 924,930 ****
  		mpz_clear(&mplongdigit);
  	}
! 	else if (is_mpzobject(objp)) {
! 		Py_INCREF(objp);
! 		mpzp = (mpzobject *)objp;
  	}
  	else {
--- 916,922 ----
  		mpz_clear(&mplongdigit);
  	}
! 	else if (is_mpzobject(args)) {
! 		Py_INCREF(args);
! 		mpzp = (mpzobject *)args;
  	}
  	else {
***************
*** 974,978 ****
  
  
! 	if (!PyArg_Parse(args, "(OOO)", &base, &exp, &mod))
  		return NULL;
  
--- 966,970 ----
  
  
! 	if (!PyArg_ParseTuple(args, "OOO", &base, &exp, &mod))
  		return NULL;
  
***************
*** 992,995 ****
--- 984,995 ----
  	}
  
+ 	if (mpz_cmp_ui(&mpzmod->mpz, 0) == 0) {
+ 		Py_DECREF(mpzbase);
+ 		Py_DECREF(mpzexp);
+ 		Py_DECREF(mpzmod);
+ 		PyErr_SetString(PyExc_ValueError, "modulus cannot be 0");
+ 		return NULL;
+ 	}
+ 
  	if (tstres < 0) {
  		MP_INT absexp;
***************
*** 1024,1028 ****
  
  
! 	if (!PyArg_Parse(args, "(OO)", &op1, &op2))
  		return NULL;
  
--- 1024,1028 ----
  
  
! 	if (!PyArg_ParseTuple(args, "OO", &op1, &op2))
  		return NULL;
  
***************
*** 1053,1057 ****
  
  
! 	if (!PyArg_Parse(args, "(OO)", &op1, &op2))
  		return NULL;
  
--- 1053,1057 ----
  
  
! 	if (!PyArg_ParseTuple(args, "OO", &op1, &op2))
  		return NULL;
  
***************
*** 1087,1099 ****
  MPZ_sqrt(PyObject *self, PyObject *args)
  {
- 	PyObject *op;
  	mpzobject *mpzop = NULL;
  	mpzobject *z;
  
  
! 	if (!PyArg_Parse(args, "O", &op))
! 		return NULL;
! 
! 	if ((mpzop = mpz_mpzcoerce(op)) == NULL
  	    || (z = newmpzobject()) == NULL) {
  		Py_XDECREF(mpzop);
--- 1087,1095 ----
  MPZ_sqrt(PyObject *self, PyObject *args)
  {
  	mpzobject *mpzop = NULL;
  	mpzobject *z;
  
  
! 	if ((mpzop = mpz_mpzcoerce(args)) == NULL
  	    || (z = newmpzobject()) == NULL) {
  		Py_XDECREF(mpzop);
***************
*** 1112,1124 ****
  MPZ_sqrtrem(PyObject *self, PyObject *args)
  {
! 	PyObject *op, *z = NULL;
  	mpzobject *mpzop = NULL;
  	mpzobject *root = NULL, *rem = NULL;
  
! 
! 	if (!PyArg_Parse(args, "O", &op))
! 		return NULL;
! 
! 	if ((mpzop = mpz_mpzcoerce(op)) == NULL
  	    || (z = PyTuple_New(2)) == NULL
  	    || (root = newmpzobject()) == NULL
--- 1108,1116 ----
  MPZ_sqrtrem(PyObject *self, PyObject *args)
  {
! 	PyObject *z = NULL;
  	mpzobject *mpzop = NULL;
  	mpzobject *root = NULL, *rem = NULL;
  
! 	if ((mpzop = mpz_mpzcoerce(args)) == NULL
  	    || (z = PyTuple_New(2)) == NULL
  	    || (root = newmpzobject()) == NULL
***************
*** 1213,1217 ****
  
  
! 	if (!PyArg_Parse(args, "(OOO)", &num, &den, &mod))
  		return NULL;
  
--- 1205,1209 ----
  
  
! 	if (!PyArg_ParseTuple(args, "OOO", &num, &den, &mod))
  		return NULL;
  
***************
*** 1551,1565 ****
  static PyMethodDef mpz_functions[] = {
  #if 0
! 	{initialiser_name,	MPZ_mpz, METH_OLDARGS},
  #else /* 0 */
  	/* until guido ``fixes'' struct PyMethodDef */
! 	{(char *)initialiser_name,	MPZ_mpz, METH_OLDARGS},
  #endif /* 0 else */	
! 	{"powm",		MPZ_powm, METH_OLDARGS},
! 	{"gcd",			MPZ_gcd, METH_OLDARGS},
! 	{"gcdext",		MPZ_gcdext, METH_OLDARGS},
! 	{"sqrt",		MPZ_sqrt, METH_OLDARGS},
! 	{"sqrtrem",		MPZ_sqrtrem, METH_OLDARGS},
! 	{"divm",		MPZ_divm, METH_OLDARGS},
  	{NULL,			NULL}		 /* Sentinel */
  };
--- 1543,1557 ----
  static PyMethodDef mpz_functions[] = {
  #if 0
! 	{initialiser_name,	MPZ_mpz,	METH_O},
  #else /* 0 */
  	/* until guido ``fixes'' struct PyMethodDef */
! 	{(char *)initialiser_name, MPZ_mpz,	METH_O},
  #endif /* 0 else */	
! 	{"powm",		MPZ_powm,	METH_VARARGS},
! 	{"gcd",			MPZ_gcd,	METH_VARARGS},
! 	{"gcdext",		MPZ_gcdext,	METH_VARARGS},
! 	{"sqrt",		MPZ_sqrt,	METH_O},
! 	{"sqrtrem",		MPZ_sqrtrem,	METH_O},
! 	{"divm",		MPZ_divm,	METH_VARARGS},
  	{NULL,			NULL}		 /* Sentinel */
  };