A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from http://mail.python.org/pipermail/python-checkins/2001-January/014740.html below:

[Python-checkins] CVS: python/dist/src/Objects longobject.c,1.69,1.70

[Python-checkins] CVS: python/dist/src/Objects longobject.c,1.69,1.70Neil Schemenauer python-dev@python.org
Wed, 03 Jan 2001 17:46:05 -0800
Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv22592/Objects

Modified Files:
	longobject.c 
Log Message:
Make long a new style number type.  Sequence repeat is now done here
now as well.


Index: longobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/longobject.c,v
retrieving revision 1.69
retrieving revision 1.70
diff -C2 -r1.69 -r1.70
*** longobject.c	2000/10/24 19:57:45	1.69
--- longobject.c	2001/01/04 01:46:03	1.70
***************
*** 458,461 ****
--- 458,495 ----
  #endif /* HAVE_LONG_LONG */
  
+ 
+ static int
+ convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
+ 	if (PyLong_Check(v)) { 
+ 		*a = (PyLongObject *) v;
+ 		Py_INCREF(v);
+ 	}
+ 	else if (PyInt_Check(v)) {
+ 		*a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
+ 	}
+ 	else {
+ 		return 0;
+ 	}
+ 	if (PyLong_Check(w)) { 
+ 		*b = (PyLongObject *) w;
+ 		Py_INCREF(w);
+ 	}
+ 	else if (PyInt_Check(w)) {
+ 		*b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
+ 	}
+ 	else {
+ 		Py_DECREF(*a);
+ 		return 0;
+ 	}
+ 	return 1;
+ }
+ 
+ #define CONVERT_BINOP(v, w, a, b) \
+ 	if (!convert_binop(v, w, a, b)) { \
+ 		Py_INCREF(Py_NotImplemented); \
+ 		return Py_NotImplemented; \
+ 	}
+ 
+ 
  /* Multiply by a single digit, ignoring the sign. */
  
***************
*** 933,936 ****
--- 967,983 ----
  }
  
+ /* Needed for the new style number compare slots */
+ static PyObject *
+ long_cmp(PyObject *v, PyObject *w)
+ {
+ 	PyLongObject *a, *b;
+ 	int c;
+ 	CONVERT_BINOP(v, w, &a, &b);
+ 	c = long_compare(a, b);
+ 	Py_DECREF(a);
+ 	Py_DECREF(b);
+ 	return PyInt_FromLong(c);
+ }
+ 
  static long
  long_hash(PyLongObject *v)
***************
*** 1051,1058 ****
  
  static PyObject *
! long_add(PyLongObject *a, PyLongObject *b)
  {
! 	PyLongObject *z;
  	
  	if (a->ob_size < 0) {
  		if (b->ob_size < 0) {
--- 1098,1107 ----
  
  static PyObject *
! long_add(PyLongObject *v, PyLongObject *w)
  {
! 	PyLongObject *a, *b, *z;
  	
+ 	CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
+ 
  	if (a->ob_size < 0) {
  		if (b->ob_size < 0) {
***************
*** 1070,1081 ****
  			z = x_add(a, b);
  	}
  	return (PyObject *)z;
  }
  
  static PyObject *
! long_sub(PyLongObject *a, PyLongObject *b)
  {
! 	PyLongObject *z;
  	
  	if (a->ob_size < 0) {
  		if (b->ob_size < 0)
--- 1119,1134 ----
  			z = x_add(a, b);
  	}
+ 	Py_DECREF(a);
+ 	Py_DECREF(b);
  	return (PyObject *)z;
  }
  
  static PyObject *
! long_sub(PyLongObject *v, PyLongObject *w)
  {
! 	PyLongObject *a, *b, *z;
  	
+ 	CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
+ 
  	if (a->ob_size < 0) {
  		if (b->ob_size < 0)
***************
*** 1092,1106 ****
  			z = x_sub(a, b);
  	}
  	return (PyObject *)z;
  }
  
  static PyObject *
! long_mul(PyLongObject *a, PyLongObject *b)
  {
  	int size_a;
  	int size_b;
- 	PyLongObject *z;
  	int i;
  	
  	size_a = ABS(a->ob_size);
  	size_b = ABS(b->ob_size);
--- 1145,1183 ----
  			z = x_sub(a, b);
  	}
+ 	Py_DECREF(a);
+ 	Py_DECREF(b);
  	return (PyObject *)z;
  }
  
  static PyObject *
! long_repeat(PyObject *v, PyLongObject *w)
  {
+ 	/* sequence * long */
+ 	long n = PyLong_AsLong((PyObject *) w);
+ 	if (n == -1 && PyErr_Occurred())
+ 		return NULL;
+ 	else
+ 		return (*v->ob_type->tp_as_sequence->sq_repeat)(v, n);
+ }
+ 
+ static PyObject *
+ long_mul(PyLongObject *v, PyLongObject *w)
+ {
+ 	PyLongObject *a, *b, *z;
  	int size_a;
  	int size_b;
  	int i;
  	
+ 	if (v->ob_type->tp_as_sequence &&
+ 			v->ob_type->tp_as_sequence->sq_repeat) {
+ 		return long_repeat((PyObject *)v, w);
+ 	}
+ 	else if (w->ob_type->tp_as_sequence &&
+ 			w->ob_type->tp_as_sequence->sq_repeat) {
+ 		return long_repeat((PyObject *)w, v);
+ 	}
+ 
+ 	CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
+ 
  	size_a = ABS(a->ob_size);
  	size_b = ABS(b->ob_size);
***************
*** 1115,1120 ****
  	}
  	z = _PyLong_New(size_a + size_b);
! 	if (z == NULL)
  		return NULL;
  	for (i = 0; i < z->ob_size; ++i)
  		z->ob_digit[i] = 0;
--- 1192,1200 ----
  	}
  	z = _PyLong_New(size_a + size_b);
! 	if (z == NULL) {
! 		Py_DECREF(a);
! 		Py_DECREF(b);
  		return NULL;
+ 	}
  	for (i = 0; i < z->ob_size; ++i)
  		z->ob_digit[i] = 0;
***************
*** 1125,1128 ****
--- 1205,1210 ----
  		
  		SIGCHECK({
+ 			Py_DECREF(a);
+ 			Py_DECREF(b);
  			Py_DECREF(z);
  			return NULL;
***************
*** 1144,1147 ****
--- 1226,1231 ----
  	if (b->ob_size < 0)
  		z->ob_size = -(z->ob_size);
+ 	Py_DECREF(a);
+ 	Py_DECREF(b);
  	return (PyObject *) long_normalize(z);
  }
***************
*** 1199,1207 ****
  
  static PyObject *
! long_div(PyLongObject *v, PyLongObject *w)
  {
! 	PyLongObject *div, *mod;
! 	if (l_divmod(v, w, &div, &mod) < 0)
  		return NULL;
  	Py_DECREF(mod);
  	return (PyObject *)div;
--- 1283,1299 ----
  
  static PyObject *
! long_div(PyObject *v, PyObject *w)
  {
! 	PyLongObject *a, *b, *div, *mod;
! 
! 	CONVERT_BINOP(v, w, &a, &b);
! 
! 	if (l_divmod(a, b, &div, &mod) < 0) {
! 		Py_DECREF(a);
! 		Py_DECREF(b);
  		return NULL;
+ 	}
+ 	Py_DECREF(a);
+ 	Py_DECREF(b);
  	Py_DECREF(mod);
  	return (PyObject *)div;
***************
*** 1209,1217 ****
  
  static PyObject *
! long_mod(PyLongObject *v, PyLongObject *w)
  {
! 	PyLongObject *div, *mod;
! 	if (l_divmod(v, w, &div, &mod) < 0)
  		return NULL;
  	Py_DECREF(div);
  	return (PyObject *)mod;
--- 1301,1317 ----
  
  static PyObject *
! long_mod(PyObject *v, PyObject *w)
  {
! 	PyLongObject *a, *b, *div, *mod;
! 
! 	CONVERT_BINOP(v, w, &a, &b);
! 
! 	if (l_divmod(a, b, &div, &mod) < 0) {
! 		Py_DECREF(a);
! 		Py_DECREF(b);
  		return NULL;
+ 	}
+ 	Py_DECREF(a);
+ 	Py_DECREF(b);
  	Py_DECREF(div);
  	return (PyObject *)mod;
***************
*** 1219,1228 ****
  
  static PyObject *
! long_divmod(PyLongObject *v, PyLongObject *w)
  {
  	PyObject *z;
! 	PyLongObject *div, *mod;
! 	if (l_divmod(v, w, &div, &mod) < 0)
  		return NULL;
  	z = PyTuple_New(2);
  	if (z != NULL) {
--- 1319,1334 ----
  
  static PyObject *
! long_divmod(PyObject *v, PyObject *w)
  {
+ 	PyLongObject *a, *b, *div, *mod;
  	PyObject *z;
! 
! 	CONVERT_BINOP(v, w, &a, &b);
! 
! 	if (l_divmod(a, b, &div, &mod) < 0) {
! 		Py_DECREF(a);
! 		Py_DECREF(b);
  		return NULL;
+ 	}
  	z = PyTuple_New(2);
  	if (z != NULL) {
***************
*** 1234,1245 ****
  		Py_DECREF(mod);
  	}
  	return z;
  }
  
  static PyObject *
! long_pow(PyLongObject *a, PyLongObject *b, PyLongObject *c)
  {
  	PyLongObject *z, *div, *mod;
  	int size_b, i;
  	
  	size_b = b->ob_size;
--- 1340,1370 ----
  		Py_DECREF(mod);
  	}
+ 	Py_DECREF(a);
+ 	Py_DECREF(b);
  	return z;
  }
  
  static PyObject *
! long_pow(PyObject *v, PyObject *w, PyObject *x)
  {
+ 	PyLongObject *a, *b;
+ 	PyObject *c;
  	PyLongObject *z, *div, *mod;
  	int size_b, i;
+ 
+ 	CONVERT_BINOP(v, w, &a, &b);
+ 	if (PyLong_Check(x) || Py_None == x) { 
+ 		c = x;
+ 		Py_INCREF(x);
+ 	}
+ 	else if (PyInt_Check(x)) {
+ 		c = PyLong_FromLong(PyInt_AS_LONG(x));
+ 	}
+ 	else {
+ 		Py_DECREF(a);
+ 		Py_DECREF(b);
+ 		Py_INCREF(Py_NotImplemented);
+ 		return Py_NotImplemented;
+ 	}
  	
  	size_b = b->ob_size;
***************
*** 1251,1258 ****
  			PyErr_SetString(PyExc_ZeroDivisionError,
  					"zero to a negative power");
! 		return NULL;
  	}
  	z = (PyLongObject *)PyLong_FromLong(1L);
- 	Py_INCREF(a);
  	for (i = 0; i < size_b; ++i) {
  		digit bi = b->ob_digit[i];
--- 1376,1383 ----
  			PyErr_SetString(PyExc_ZeroDivisionError,
  					"zero to a negative power");
! 		z = NULL;
! 		goto error;
  	}
  	z = (PyLongObject *)PyLong_FromLong(1L);
  	for (i = 0; i < size_b; ++i) {
  		digit bi = b->ob_digit[i];
***************
*** 1265,1270 ****
  				temp = (PyLongObject *)long_mul(z, a);
  				Py_DECREF(z);
! 			 	if ((PyObject*)c!=Py_None && temp!=NULL) {
! 			 		if (l_divmod(temp,c,&div,&mod) < 0) {
  						Py_DECREF(temp);
  						z = NULL;
--- 1390,1396 ----
  				temp = (PyLongObject *)long_mul(z, a);
  				Py_DECREF(z);
! 			 	if (c!=Py_None && temp!=NULL) {
! 			 		if (l_divmod(temp,(PyLongObject *)c,
! 							&div,&mod) < 0) {
  						Py_DECREF(temp);
  						z = NULL;
***************
*** 1284,1289 ****
  			temp = (PyLongObject *)long_mul(a, a);
  			Py_DECREF(a);
! 		 	if ((PyObject*)c!=Py_None && temp!=NULL) {
! 			 	if (l_divmod(temp, c, &div, &mod) < 0) {
  					Py_DECREF(temp);
  					z = NULL;
--- 1410,1416 ----
  			temp = (PyLongObject *)long_mul(a, a);
  			Py_DECREF(a);
! 		 	if (c!=Py_None && temp!=NULL) {
! 			 	if (l_divmod(temp, (PyLongObject *)c, &div,
! 							&mod) < 0) {
  					Py_DECREF(temp);
  					z = NULL;
***************
*** 1304,1310 ****
  			break;
  	}
! 	Py_XDECREF(a);
! 	if ((PyObject*)c!=Py_None && z!=NULL) {
! 		if (l_divmod(z, c, &div, &mod) < 0) {
  			Py_DECREF(z);
  			z = NULL;
--- 1431,1436 ----
  			break;
  	}
! 	if (c!=Py_None && z!=NULL) {
! 		if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
  			Py_DECREF(z);
  			z = NULL;
***************
*** 1317,1320 ****
--- 1443,1449 ----
  	}
    error:
+ 	Py_XDECREF(a);
+ 	Py_DECREF(b);
+ 	Py_DECREF(c);
  	return (PyObject *)z;
  }
***************
*** 1383,1457 ****
  
  static PyObject *
! long_rshift(PyLongObject *a, PyLongObject *b)
  {
! 	PyLongObject *z;
  	long shiftby;
  	int newsize, wordshift, loshift, hishift, i, j;
  	digit lomask, himask;
  	
  	if (a->ob_size < 0) {
  		/* Right shifting negative numbers is harder */
! 		PyLongObject *a1, *a2, *a3;
  		a1 = (PyLongObject *) long_invert(a);
! 		if (a1 == NULL) return NULL;
  		a2 = (PyLongObject *) long_rshift(a1, b);
  		Py_DECREF(a1);
! 		if (a2 == NULL) return NULL;
! 		a3 = (PyLongObject *) long_invert(a2);
  		Py_DECREF(a2);
- 		return (PyObject *) a3;
- 	}
- 	
- 	shiftby = PyLong_AsLong((PyObject *)b);
- 	if (shiftby == -1L && PyErr_Occurred())
- 		return NULL;
- 	if (shiftby < 0) {
- 		PyErr_SetString(PyExc_ValueError, "negative shift count");
- 		return NULL;
  	}
! 	wordshift = shiftby / SHIFT;
! 	newsize = ABS(a->ob_size) - wordshift;
! 	if (newsize <= 0) {
! 		z = _PyLong_New(0);
! 		return (PyObject *)z;
! 	}
! 	loshift = shiftby % SHIFT;
! 	hishift = SHIFT - loshift;
! 	lomask = ((digit)1 << hishift) - 1;
! 	himask = MASK ^ lomask;
! 	z = _PyLong_New(newsize);
! 	if (z == NULL)
! 		return NULL;
! 	if (a->ob_size < 0)
! 		z->ob_size = -(z->ob_size);
! 	for (i = 0, j = wordshift; i < newsize; i++, j++) {
! 		z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
! 		if (i+1 < newsize)
! 			z->ob_digit[i] |=
! 			  (a->ob_digit[j+1] << hishift) & himask;
  	}
! 	return (PyObject *) long_normalize(z);
  }
  
  static PyObject *
! long_lshift(PyLongObject *a, PyLongObject *b)
  {
  	/* This version due to Tim Peters */
! 	PyLongObject *z;
  	long shiftby;
  	int oldsize, newsize, wordshift, remshift, i, j;
  	twodigits accum;
  	
  	shiftby = PyLong_AsLong((PyObject *)b);
  	if (shiftby == -1L && PyErr_Occurred())
! 		return NULL;
  	if (shiftby < 0) {
  		PyErr_SetString(PyExc_ValueError, "negative shift count");
! 		return NULL;
  	}
  	if ((long)(int)shiftby != shiftby) {
  		PyErr_SetString(PyExc_ValueError,
  				"outrageous left shift count");
! 		return NULL;
  	}
  	/* wordshift, remshift = divmod(shiftby, SHIFT) */
--- 1512,1603 ----
  
  static PyObject *
! long_rshift(PyLongObject *v, PyLongObject *w)
  {
! 	PyLongObject *a, *b;
! 	PyLongObject *z = NULL;
  	long shiftby;
  	int newsize, wordshift, loshift, hishift, i, j;
  	digit lomask, himask;
  	
+ 	CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
+ 
  	if (a->ob_size < 0) {
  		/* Right shifting negative numbers is harder */
! 		PyLongObject *a1, *a2;
  		a1 = (PyLongObject *) long_invert(a);
! 		if (a1 == NULL)
! 			goto rshift_error;
  		a2 = (PyLongObject *) long_rshift(a1, b);
  		Py_DECREF(a1);
! 		if (a2 == NULL)
! 			goto rshift_error;
! 		z = (PyLongObject *) long_invert(a2);
  		Py_DECREF(a2);
  	}
! 	else {
! 		
! 		shiftby = PyLong_AsLong((PyObject *)b);
! 		if (shiftby == -1L && PyErr_Occurred())
! 			goto rshift_error;
! 		if (shiftby < 0) {
! 			PyErr_SetString(PyExc_ValueError,
! 					"negative shift count");
! 			goto rshift_error;
! 		}
! 		wordshift = shiftby / SHIFT;
! 		newsize = ABS(a->ob_size) - wordshift;
! 		if (newsize <= 0) {
! 			z = _PyLong_New(0);
! 			Py_DECREF(a);
! 			Py_DECREF(b);
! 			return (PyObject *)z;
! 		}
! 		loshift = shiftby % SHIFT;
! 		hishift = SHIFT - loshift;
! 		lomask = ((digit)1 << hishift) - 1;
! 		himask = MASK ^ lomask;
! 		z = _PyLong_New(newsize);
! 		if (z == NULL)
! 			goto rshift_error;
! 		if (a->ob_size < 0)
! 			z->ob_size = -(z->ob_size);
! 		for (i = 0, j = wordshift; i < newsize; i++, j++) {
! 			z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
! 			if (i+1 < newsize)
! 				z->ob_digit[i] |=
! 				  (a->ob_digit[j+1] << hishift) & himask;
! 		}
! 		z = long_normalize(z);
  	}
! rshift_error:
! 	Py_DECREF(a);
! 	Py_DECREF(b);
! 	return (PyObject *) z;
! 
  }
  
  static PyObject *
! long_lshift(PyObject *v, PyObject *w)
  {
  	/* This version due to Tim Peters */
! 	PyLongObject *a, *b;
! 	PyLongObject *z = NULL;
  	long shiftby;
  	int oldsize, newsize, wordshift, remshift, i, j;
  	twodigits accum;
  	
+ 	CONVERT_BINOP(v, w, &a, &b);
+ 
  	shiftby = PyLong_AsLong((PyObject *)b);
  	if (shiftby == -1L && PyErr_Occurred())
! 		goto lshift_error;
  	if (shiftby < 0) {
  		PyErr_SetString(PyExc_ValueError, "negative shift count");
! 		goto lshift_error;
  	}
  	if ((long)(int)shiftby != shiftby) {
  		PyErr_SetString(PyExc_ValueError,
  				"outrageous left shift count");
! 		goto lshift_error;
  	}
  	/* wordshift, remshift = divmod(shiftby, SHIFT) */
***************
*** 1465,1469 ****
  	z = _PyLong_New(newsize);
  	if (z == NULL)
! 		return NULL;
  	if (a->ob_size < 0)
  		z->ob_size = -(z->ob_size);
--- 1611,1615 ----
  	z = _PyLong_New(newsize);
  	if (z == NULL)
! 		goto lshift_error;
  	if (a->ob_size < 0)
  		z->ob_size = -(z->ob_size);
***************
*** 1480,1484 ****
  	else	
  		assert(!accum);
! 	return (PyObject *) long_normalize(z);
  }
  
--- 1626,1634 ----
  	else	
  		assert(!accum);
! 	z = long_normalize(z);
! lshift_error:
! 	Py_DECREF(a);
! 	Py_DECREF(b);
! 	return (PyObject *) z;
  }
  
***************
*** 1591,1609 ****
  
  static PyObject *
! long_and(PyLongObject *a, PyLongObject *b)
  {
! 	return long_bitwise(a, '&', b);
  }
  
  static PyObject *
! long_xor(PyLongObject *a, PyLongObject *b)
  {
! 	return long_bitwise(a, '^', b);
  }
  
  static PyObject *
! long_or(PyLongObject *a, PyLongObject *b)
  {
! 	return long_bitwise(a, '|', b);
  }
  
--- 1741,1777 ----
  
  static PyObject *
! long_and(PyObject *v, PyObject *w)
  {
! 	PyLongObject *a, *b;
! 	PyObject *c;
! 	CONVERT_BINOP(v, w, &a, &b);
! 	c = long_bitwise(a, '&', b);
! 	Py_DECREF(a);
! 	Py_DECREF(b);
! 	return c;
  }
  
  static PyObject *
! long_xor(PyObject *v, PyObject *w)
  {
! 	PyLongObject *a, *b;
! 	PyObject *c;
! 	CONVERT_BINOP(v, w, &a, &b);
! 	c = long_bitwise(a, '^', b);
! 	Py_DECREF(a);
! 	Py_DECREF(b);
! 	return c;
  }
  
  static PyObject *
! long_or(PyObject *v, PyObject *w)
  {
! 	PyLongObject *a, *b;
! 	PyObject *c;
! 	CONVERT_BINOP(v, w, &a, &b);
! 	c = long_bitwise(a, '|', b);
! 	Py_DECREF(a);
! 	Py_DECREF(b);
! 	return c;
  }
  
***************
*** 1612,1616 ****
  {
  	if (PyInt_Check(*pw)) {
! 		*pw = PyLong_FromLong(PyInt_AsLong(*pw));
  		Py_INCREF(*pv);
  		return 0;
--- 1780,1784 ----
  {
  	if (PyInt_Check(*pw)) {
! 		*pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
  		Py_INCREF(*pv);
  		return 0;
***************
*** 1682,1685 ****
--- 1850,1867 ----
  	(unaryfunc)	long_oct,	/*nb_oct*/
  	(unaryfunc)	long_hex,	/*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)	long_cmp,	/*nb_cmp*/
  };
  
***************
*** 1702,1704 ****
--- 1884,1890 ----
          0,              		/*tp_call*/
          (reprfunc)long_str,		/*tp_str*/
+ 	0,				/*tp_getattro*/
+ 	0,				/*tp_setattro*/
+ 	0,				/*tp_as_buffer*/
+ 	Py_TPFLAGS_NEWSTYLENUMBER 	/*tp_flags*/
  };




RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4