| 
									
										
										
										
											1991-02-19 12:39:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | /* Integer object implementation */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | #include "Python.h"
 | 
					
						
							| 
									
										
										
										
											1999-10-12 19:54:53 +00:00
										 |  |  | #include <ctype.h>
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-12-24 10:22:45 +00:00
										 |  |  | long | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | PyInt_GetMax(void) | 
					
						
							| 
									
										
										
										
											1993-12-24 10:22:45 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	return LONG_MAX;	/* To initialize sys.maxint */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | /* Integers are quite normal objects, to make object handling uniform.
 | 
					
						
							|  |  |  |    (Using odd pointers to represent integers would save much space | 
					
						
							|  |  |  |    but require extra checks for this special case throughout the code.) | 
					
						
							| 
									
										
										
										
											2002-04-28 16:57:34 +00:00
										 |  |  |    Since a typical Python program spends much of its time allocating | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  |    and deallocating integers, these operations should be very fast. | 
					
						
							|  |  |  |    Therefore we use a dedicated allocation scheme with a much lower | 
					
						
							|  |  |  |    overhead (in space and time) than straight malloc(): a simple | 
					
						
							|  |  |  |    dedicated free list, filled when necessary with memory from malloc(). | 
					
						
							| 
									
										
										
										
											2002-04-28 16:57:34 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    block_list is a singly-linked list of all PyIntBlocks ever allocated, | 
					
						
							|  |  |  |    linked via their next members.  PyIntBlocks are never returned to the | 
					
						
							|  |  |  |    system before shutdown (PyInt_Fini). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    free_list is a singly-linked list of available PyIntObjects, linked | 
					
						
							|  |  |  |    via abuse of their ob_type members. | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define BLOCK_SIZE	1000	/* 1K less typical malloc overhead */
 | 
					
						
							| 
									
										
										
										
											1999-03-12 19:43:17 +00:00
										 |  |  | #define BHEAD_SIZE	8	/* Enough for a 64-bit pointer */
 | 
					
						
							|  |  |  | #define N_INTOBJECTS	((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyIntObject))
 | 
					
						
							| 
									
										
										
										
											1999-03-10 22:55:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-03-12 19:43:17 +00:00
										 |  |  | struct _intblock { | 
					
						
							|  |  |  | 	struct _intblock *next; | 
					
						
							|  |  |  | 	PyIntObject objects[N_INTOBJECTS]; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct _intblock PyIntBlock; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyIntBlock *block_list = NULL; | 
					
						
							|  |  |  | static PyIntObject *free_list = NULL; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyIntObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | fill_free_list(void) | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	PyIntObject *p, *q; | 
					
						
							| 
									
										
										
										
											2002-04-28 16:57:34 +00:00
										 |  |  | 	/* Python's object allocator isn't appropriate for large blocks. */ | 
					
						
							| 
									
										
										
										
											2000-05-03 23:44:39 +00:00
										 |  |  | 	p = (PyIntObject *) PyMem_MALLOC(sizeof(PyIntBlock)); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	if (p == NULL) | 
					
						
							| 
									
										
										
										
											2000-05-03 23:44:39 +00:00
										 |  |  | 		return (PyIntObject *) PyErr_NoMemory(); | 
					
						
							| 
									
										
										
										
											1999-03-12 19:43:17 +00:00
										 |  |  | 	((PyIntBlock *)p)->next = block_list; | 
					
						
							|  |  |  | 	block_list = (PyIntBlock *)p; | 
					
						
							| 
									
										
										
										
											2002-04-28 16:57:34 +00:00
										 |  |  | 	/* Link the int objects together, from rear to front, then return
 | 
					
						
							|  |  |  | 	   the address of the last int object in the block. */ | 
					
						
							| 
									
										
										
										
											1999-03-12 19:43:17 +00:00
										 |  |  | 	p = &((PyIntBlock *)p)->objects[0]; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	q = p + N_INTOBJECTS; | 
					
						
							|  |  |  | 	while (--q > p) | 
					
						
							| 
									
										
										
										
											1999-03-10 22:55:24 +00:00
										 |  |  | 		q->ob_type = (struct _typeobject *)(q-1); | 
					
						
							|  |  |  | 	q->ob_type = NULL; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	return p + N_INTOBJECTS - 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-10-15 16:18:48 +00:00
										 |  |  | #ifndef NSMALLPOSINTS
 | 
					
						
							| 
									
										
										
										
											2006-02-22 11:30:06 +00:00
										 |  |  | #define NSMALLPOSINTS		257
 | 
					
						
							| 
									
										
										
										
											1993-10-15 16:18:48 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #ifndef NSMALLNEGINTS
 | 
					
						
							| 
									
										
										
										
											2002-12-30 22:29:22 +00:00
										 |  |  | #define NSMALLNEGINTS		5
 | 
					
						
							| 
									
										
										
										
											1993-10-15 16:18:48 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #if NSMALLNEGINTS + NSMALLPOSINTS > 0
 | 
					
						
							|  |  |  | /* References to small integers are saved in this array so that they
 | 
					
						
							|  |  |  |    can be shared. | 
					
						
							|  |  |  |    The integers that are saved are those in the range | 
					
						
							|  |  |  |    -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive). | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS]; | 
					
						
							| 
									
										
										
										
											1993-10-15 16:18:48 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #ifdef COUNT_ALLOCS
 | 
					
						
							|  |  |  | int quick_int_allocs, quick_neg_int_allocs; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | PyInt_FromLong(long ival) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	register PyIntObject *v; | 
					
						
							| 
									
										
										
										
											1993-10-15 16:18:48 +00:00
										 |  |  | #if NSMALLNEGINTS + NSMALLPOSINTS > 0
 | 
					
						
							| 
									
										
										
										
											2002-12-30 22:29:22 +00:00
										 |  |  | 	if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { | 
					
						
							|  |  |  | 		v = small_ints[ival + NSMALLNEGINTS]; | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 		Py_INCREF(v); | 
					
						
							| 
									
										
										
										
											1993-10-15 16:18:48 +00:00
										 |  |  | #ifdef COUNT_ALLOCS
 | 
					
						
							|  |  |  | 		if (ival >= 0) | 
					
						
							|  |  |  | 			quick_int_allocs++; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			quick_neg_int_allocs++; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 		return (PyObject *) v; | 
					
						
							| 
									
										
										
										
											1993-10-15 16:18:48 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	if (free_list == NULL) { | 
					
						
							|  |  |  | 		if ((free_list = fill_free_list()) == NULL) | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2002-08-19 19:26:42 +00:00
										 |  |  | 	/* Inline PyObject_New */ | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	v = free_list; | 
					
						
							| 
									
										
										
										
											1999-03-10 22:55:24 +00:00
										 |  |  | 	free_list = (PyIntObject *)v->ob_type; | 
					
						
							| 
									
										
										
										
											2000-05-03 23:44:39 +00:00
										 |  |  | 	PyObject_INIT(v, &PyInt_Type); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 	v->ob_ival = ival; | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	return (PyObject *) v; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-15 17:27:45 +00:00
										 |  |  | PyObject * | 
					
						
							|  |  |  | PyInt_FromSize_t(size_t ival) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (ival <= LONG_MAX) | 
					
						
							|  |  |  | 		return PyInt_FromLong((long)ival); | 
					
						
							|  |  |  | 	return _PyLong_FromSize_t(ival); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyObject * | 
					
						
							|  |  |  | PyInt_FromSsize_t(Py_ssize_t ival) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (ival >= LONG_MIN && ival <= LONG_MAX) | 
					
						
							|  |  |  | 		return PyInt_FromLong((long)ival); | 
					
						
							|  |  |  | 	return _PyLong_FromSsize_t(ival); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | static void | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_dealloc(PyIntObject *v) | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2001-09-11 16:13:52 +00:00
										 |  |  | 	if (PyInt_CheckExact(v)) { | 
					
						
							| 
									
										
										
										
											2001-08-29 15:47:46 +00:00
										 |  |  | 		v->ob_type = (struct _typeobject *)free_list; | 
					
						
							|  |  |  | 		free_list = v; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		v->ob_type->tp_free((PyObject *)v); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-04-26 00:53:34 +00:00
										 |  |  | static void | 
					
						
							|  |  |  | int_free(PyIntObject *v) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	v->ob_type = (struct _typeobject *)free_list; | 
					
						
							|  |  |  | 	free_list = v; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | long | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | PyInt_AsLong(register PyObject *op) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	PyNumberMethods *nb; | 
					
						
							|  |  |  | 	PyIntObject *io; | 
					
						
							| 
									
										
										
										
											1994-08-29 12:48:32 +00:00
										 |  |  | 	long val; | 
					
						
							| 
									
										
										
										
											2001-12-04 23:05:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	if (op && PyInt_Check(op)) | 
					
						
							|  |  |  | 		return PyInt_AS_LONG((PyIntObject*) op); | 
					
						
							| 
									
										
										
										
											2001-12-04 23:05:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-29 12:48:32 +00:00
										 |  |  | 	if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL || | 
					
						
							|  |  |  | 	    nb->nb_int == NULL) { | 
					
						
							| 
									
										
										
										
											2000-05-09 14:27:48 +00:00
										 |  |  | 		PyErr_SetString(PyExc_TypeError, "an integer is required"); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2001-12-04 23:05:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	io = (PyIntObject*) (*nb->nb_int) (op); | 
					
						
							| 
									
										
										
										
											1994-08-29 12:48:32 +00:00
										 |  |  | 	if (io == NULL) | 
					
						
							|  |  |  | 		return -1; | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	if (!PyInt_Check(io)) { | 
					
						
							| 
									
										
										
										
											2002-11-19 20:49:15 +00:00
										 |  |  | 		if (PyLong_Check(io)) { | 
					
						
							|  |  |  | 			/* got a long? => retry int conversion */ | 
					
						
							|  |  |  | 			val = PyLong_AsLong((PyObject *)io); | 
					
						
							| 
									
										
										
										
											2003-02-20 20:32:11 +00:00
										 |  |  | 			Py_DECREF(io); | 
					
						
							|  |  |  | 			if ((val == -1) && PyErr_Occurred()) | 
					
						
							| 
									
										
										
										
											2002-11-19 20:49:15 +00:00
										 |  |  | 				return -1; | 
					
						
							| 
									
										
										
										
											2003-02-20 20:32:11 +00:00
										 |  |  | 			return val; | 
					
						
							| 
									
										
										
										
											2002-11-19 20:49:15 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2003-04-17 18:55:45 +00:00
										 |  |  | 			Py_DECREF(io); | 
					
						
							|  |  |  | 			PyErr_SetString(PyExc_TypeError, | 
					
						
							|  |  |  | 					"nb_int should return int object"); | 
					
						
							|  |  |  | 			return -1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	val = PyInt_AS_LONG(io); | 
					
						
							|  |  |  | 	Py_DECREF(io); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return val; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-15 17:27:45 +00:00
										 |  |  | Py_ssize_t | 
					
						
							|  |  |  | PyInt_AsSsize_t(register PyObject *op) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-02-15 23:08:56 +00:00
										 |  |  | #if SIZEOF_SIZE_T != SIZEOF_LONG
 | 
					
						
							| 
									
										
										
										
											2006-02-15 17:27:45 +00:00
										 |  |  | 	PyNumberMethods *nb; | 
					
						
							|  |  |  | 	PyIntObject *io; | 
					
						
							|  |  |  | 	Py_ssize_t val; | 
					
						
							| 
									
										
										
										
											2006-02-15 23:08:56 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2006-02-15 17:27:45 +00:00
										 |  |  | 	if (op && !PyInt_CheckExact(op) && PyLong_Check(op)) | 
					
						
							|  |  |  | 		return _PyLong_AsSsize_t(op); | 
					
						
							| 
									
										
										
										
											2006-02-15 23:08:56 +00:00
										 |  |  | #if SIZEOF_SIZE_T == SIZEOF_LONG
 | 
					
						
							| 
									
										
										
										
											2006-02-15 17:27:45 +00:00
										 |  |  | 	return PyInt_AsLong(op); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (op && PyInt_Check(op)) | 
					
						
							|  |  |  | 		return PyInt_AS_LONG((PyIntObject*) op); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL || | 
					
						
							|  |  |  | 	    (nb->nb_int == NULL && nb->nb_long == 0)) { | 
					
						
							|  |  |  | 		PyErr_SetString(PyExc_TypeError, "an integer is required"); | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (nb->nb_long != 0) { | 
					
						
							|  |  |  | 		io = (PyIntObject*) (*nb->nb_long) (op); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		io = (PyIntObject*) (*nb->nb_int) (op); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (io == NULL) | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	if (!PyInt_Check(io)) { | 
					
						
							|  |  |  | 		if (PyLong_Check(io)) { | 
					
						
							|  |  |  | 			/* got a long? => retry int conversion */ | 
					
						
							|  |  |  | 			val = _PyLong_AsSsize_t((PyObject *)io); | 
					
						
							|  |  |  | 			Py_DECREF(io); | 
					
						
							|  |  |  | 			if ((val == -1) && PyErr_Occurred()) | 
					
						
							|  |  |  | 				return -1; | 
					
						
							|  |  |  | 			return val; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			Py_DECREF(io); | 
					
						
							|  |  |  | 			PyErr_SetString(PyExc_TypeError, | 
					
						
							|  |  |  | 					"nb_int should return int object"); | 
					
						
							|  |  |  | 			return -1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	val = PyInt_AS_LONG(io); | 
					
						
							|  |  |  | 	Py_DECREF(io); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return val; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-17 18:55:45 +00:00
										 |  |  | unsigned long | 
					
						
							|  |  |  | PyInt_AsUnsignedLongMask(register PyObject *op) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	PyNumberMethods *nb; | 
					
						
							|  |  |  | 	PyIntObject *io; | 
					
						
							|  |  |  | 	unsigned long val; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (op && PyInt_Check(op)) | 
					
						
							|  |  |  | 		return PyInt_AS_LONG((PyIntObject*) op); | 
					
						
							|  |  |  | 	if (op && PyLong_Check(op)) | 
					
						
							|  |  |  | 		return PyLong_AsUnsignedLongMask(op); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL || | 
					
						
							|  |  |  | 	    nb->nb_int == NULL) { | 
					
						
							|  |  |  | 		PyErr_SetString(PyExc_TypeError, "an integer is required"); | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	io = (PyIntObject*) (*nb->nb_int) (op); | 
					
						
							|  |  |  | 	if (io == NULL) | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	if (!PyInt_Check(io)) { | 
					
						
							|  |  |  | 		if (PyLong_Check(io)) { | 
					
						
							|  |  |  | 			val = PyLong_AsUnsignedLongMask((PyObject *)io); | 
					
						
							|  |  |  | 			Py_DECREF(io); | 
					
						
							|  |  |  | 			if (PyErr_Occurred()) | 
					
						
							|  |  |  | 				return -1; | 
					
						
							|  |  |  | 			return val; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			Py_DECREF(io); | 
					
						
							| 
									
										
										
										
											2002-11-19 20:49:15 +00:00
										 |  |  | 			PyErr_SetString(PyExc_TypeError, | 
					
						
							|  |  |  | 					"nb_int should return int object"); | 
					
						
							|  |  |  | 			return -1; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											1994-08-29 12:48:32 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2001-12-04 23:05:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	val = PyInt_AS_LONG(io); | 
					
						
							|  |  |  | 	Py_DECREF(io); | 
					
						
							| 
									
										
										
										
											2001-12-04 23:05:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-29 12:48:32 +00:00
										 |  |  | 	return val; | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-17 18:55:45 +00:00
										 |  |  | #ifdef HAVE_LONG_LONG
 | 
					
						
							|  |  |  | unsigned PY_LONG_LONG | 
					
						
							|  |  |  | PyInt_AsUnsignedLongLongMask(register PyObject *op) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	PyNumberMethods *nb; | 
					
						
							|  |  |  | 	PyIntObject *io; | 
					
						
							|  |  |  | 	unsigned PY_LONG_LONG val; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (op && PyInt_Check(op)) | 
					
						
							|  |  |  | 		return PyInt_AS_LONG((PyIntObject*) op); | 
					
						
							|  |  |  | 	if (op && PyLong_Check(op)) | 
					
						
							|  |  |  | 		return PyLong_AsUnsignedLongLongMask(op); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL || | 
					
						
							|  |  |  | 	    nb->nb_int == NULL) { | 
					
						
							|  |  |  | 		PyErr_SetString(PyExc_TypeError, "an integer is required"); | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	io = (PyIntObject*) (*nb->nb_int) (op); | 
					
						
							|  |  |  | 	if (io == NULL) | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	if (!PyInt_Check(io)) { | 
					
						
							|  |  |  | 		if (PyLong_Check(io)) { | 
					
						
							|  |  |  | 			val = PyLong_AsUnsignedLongLongMask((PyObject *)io); | 
					
						
							|  |  |  | 			Py_DECREF(io); | 
					
						
							|  |  |  | 			if (PyErr_Occurred()) | 
					
						
							|  |  |  | 				return -1; | 
					
						
							|  |  |  | 			return val; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			Py_DECREF(io); | 
					
						
							|  |  |  | 			PyErr_SetString(PyExc_TypeError, | 
					
						
							|  |  |  | 					"nb_int should return int object"); | 
					
						
							|  |  |  | 			return -1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	val = PyInt_AS_LONG(io); | 
					
						
							|  |  |  | 	Py_DECREF(io); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return val; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-10-12 19:54:53 +00:00
										 |  |  | PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | PyInt_FromString(char *s, char **pend, int base) | 
					
						
							| 
									
										
										
										
											1999-10-12 19:54:53 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	char *end; | 
					
						
							|  |  |  | 	long x; | 
					
						
							|  |  |  | 	char buffer[256]; /* For errors */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if ((base != 0 && base < 2) || base > 36) { | 
					
						
							| 
									
										
										
										
											2003-02-12 20:48:22 +00:00
										 |  |  | 		PyErr_SetString(PyExc_ValueError, | 
					
						
							|  |  |  | 				"int() base must be >= 2 and <= 36"); | 
					
						
							| 
									
										
										
										
											1999-10-12 19:54:53 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	while (*s && isspace(Py_CHARMASK(*s))) | 
					
						
							|  |  |  | 		s++; | 
					
						
							|  |  |  | 	errno = 0; | 
					
						
							| 
									
										
										
										
											2003-02-12 20:48:22 +00:00
										 |  |  | 	if (base == 0 && s[0] == '0') { | 
					
						
							| 
									
										
										
										
											1999-10-12 19:54:53 +00:00
										 |  |  | 		x = (long) PyOS_strtoul(s, &end, base); | 
					
						
							| 
									
										
										
										
											2003-02-12 20:48:22 +00:00
										 |  |  | 		if (x < 0) | 
					
						
							| 
									
										
										
										
											2003-11-29 23:52:13 +00:00
										 |  |  | 			return PyLong_FromString(s, pend, base); | 
					
						
							| 
									
										
										
										
											2003-02-12 20:48:22 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1999-10-12 19:54:53 +00:00
										 |  |  | 	else | 
					
						
							|  |  |  | 		x = PyOS_strtol(s, &end, base); | 
					
						
							| 
									
										
										
										
											2001-03-06 12:12:02 +00:00
										 |  |  | 	if (end == s || !isalnum(Py_CHARMASK(end[-1]))) | 
					
						
							| 
									
										
										
										
											1999-10-12 19:54:53 +00:00
										 |  |  | 		goto bad; | 
					
						
							|  |  |  | 	while (*end && isspace(Py_CHARMASK(*end))) | 
					
						
							|  |  |  | 		end++; | 
					
						
							|  |  |  | 	if (*end != '\0') { | 
					
						
							|  |  |  |   bad: | 
					
						
							| 
									
										
										
										
											2001-11-28 20:55:34 +00:00
										 |  |  | 		PyOS_snprintf(buffer, sizeof(buffer), | 
					
						
							|  |  |  | 			      "invalid literal for int(): %.200s", s); | 
					
						
							| 
									
										
										
										
											1999-10-12 19:54:53 +00:00
										 |  |  | 		PyErr_SetString(PyExc_ValueError, buffer); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2004-08-25 02:14:08 +00:00
										 |  |  | 	else if (errno != 0) | 
					
						
							| 
									
										
										
										
											2002-11-06 16:15:14 +00:00
										 |  |  | 		return PyLong_FromString(s, pend, base); | 
					
						
							| 
									
										
										
										
											1999-10-12 19:54:53 +00:00
										 |  |  | 	if (pend) | 
					
						
							|  |  |  | 		*pend = end; | 
					
						
							|  |  |  | 	return PyInt_FromLong(x); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-17 18:39:25 +00:00
										 |  |  | #ifdef Py_USING_UNICODE
 | 
					
						
							| 
									
										
										
										
											2000-04-05 20:11:21 +00:00
										 |  |  | PyObject * | 
					
						
							| 
									
										
										
										
											2006-02-15 17:27:45 +00:00
										 |  |  | PyInt_FromUnicode(Py_UNICODE *s, Py_ssize_t length, int base) | 
					
						
							| 
									
										
										
										
											2000-04-05 20:11:21 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2002-11-06 16:15:14 +00:00
										 |  |  | 	PyObject *result; | 
					
						
							| 
									
										
										
										
											2006-04-11 06:54:30 +00:00
										 |  |  | 	char *buffer = (char *)PyMem_MALLOC(length+1); | 
					
						
							| 
									
										
										
										
											2001-12-04 23:05:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-06 16:15:14 +00:00
										 |  |  | 	if (buffer == NULL) | 
					
						
							| 
									
										
										
										
											2000-04-05 20:11:21 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2002-11-06 16:15:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (PyUnicode_EncodeDecimal(s, length, buffer, NULL)) { | 
					
						
							|  |  |  | 		PyMem_FREE(buffer); | 
					
						
							| 
									
										
										
										
											2000-04-05 20:11:21 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2002-11-06 16:15:14 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	result = PyInt_FromString(buffer, NULL, base); | 
					
						
							|  |  |  | 	PyMem_FREE(buffer); | 
					
						
							|  |  |  | 	return result; | 
					
						
							| 
									
										
										
										
											2000-04-05 20:11:21 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2001-08-17 18:39:25 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2000-04-05 20:11:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | /* Methods */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | /* Integers are seen as the "smallest" of all numeric types and thus
 | 
					
						
							|  |  |  |    don't have any knowledge about conversion of other types to | 
					
						
							|  |  |  |    integers. */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define CONVERT_TO_LONG(obj, lng)		\
 | 
					
						
							|  |  |  | 	if (PyInt_Check(obj)) {			\ | 
					
						
							|  |  |  | 		lng = PyInt_AS_LONG(obj);	\ | 
					
						
							|  |  |  | 	}					\ | 
					
						
							|  |  |  | 	else {					\ | 
					
						
							|  |  |  | 		Py_INCREF(Py_NotImplemented);	\ | 
					
						
							|  |  |  | 		return Py_NotImplemented;	\ | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-03-27 17:31:02 +00:00
										 |  |  | /* ARGSUSED */ | 
					
						
							| 
									
										
										
										
											1991-06-07 16:10:43 +00:00
										 |  |  | static int | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_print(PyIntObject *v, FILE *fp, int flags) | 
					
						
							|  |  |  |      /* flags -- not used but required by interface */ | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	fprintf(fp, "%ld", v->ob_ival); | 
					
						
							| 
									
										
										
										
											1991-06-07 16:10:43 +00:00
										 |  |  | 	return 0; | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_repr(PyIntObject *v) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2001-12-01 02:52:56 +00:00
										 |  |  | 	char buf[64]; | 
					
						
							| 
									
										
										
										
											2001-11-28 20:55:34 +00:00
										 |  |  | 	PyOS_snprintf(buf, sizeof(buf), "%ld", v->ob_ival); | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	return PyString_FromString(buf); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_compare(PyIntObject *v, PyIntObject *w) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	register long i = v->ob_ival; | 
					
						
							|  |  |  | 	register long j = w->ob_ival; | 
					
						
							|  |  |  | 	return (i < j) ? -1 : (i > j) ? 1 : 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-03-29 10:43:31 +00:00
										 |  |  | static long | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_hash(PyIntObject *v) | 
					
						
							| 
									
										
										
										
											1993-03-29 10:43:31 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1997-01-06 22:53:20 +00:00
										 |  |  | 	/* XXX If this is changed, you also need to change the way
 | 
					
						
							|  |  |  | 	   Python's long, float and complex types are hashed. */ | 
					
						
							| 
									
										
										
										
											1993-03-29 10:43:31 +00:00
										 |  |  | 	long x = v -> ob_ival; | 
					
						
							|  |  |  | 	if (x == -1) | 
					
						
							|  |  |  | 		x = -2; | 
					
						
							|  |  |  | 	return x; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_add(PyIntObject *v, PyIntObject *w) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	register long a, b, x; | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	CONVERT_TO_LONG(v, a); | 
					
						
							|  |  |  | 	CONVERT_TO_LONG(w, b); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	x = a + b; | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 	if ((x^a) >= 0 || (x^b) >= 0) | 
					
						
							|  |  |  | 		return PyInt_FromLong(x); | 
					
						
							|  |  |  | 	return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_sub(PyIntObject *v, PyIntObject *w) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	register long a, b, x; | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	CONVERT_TO_LONG(v, a); | 
					
						
							|  |  |  | 	CONVERT_TO_LONG(w, b); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	x = a - b; | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 	if ((x^a) >= 0 || (x^~b) >= 0) | 
					
						
							|  |  |  | 		return PyInt_FromLong(x); | 
					
						
							|  |  |  | 	return PyLong_Type.tp_as_number->nb_subtract((PyObject *)v, | 
					
						
							|  |  |  | 						     (PyObject *)w); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-29 12:48:32 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2001-12-04 23:05:10 +00:00
										 |  |  | Integer overflow checking for * is painful:  Python tried a couple ways, but | 
					
						
							|  |  |  | they didn't work on all platforms, or failed in endcases (a product of | 
					
						
							|  |  |  | -sys.maxint-1 has been a particular pain). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Here's another way: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The native long product x*y is either exactly right or *way* off, being | 
					
						
							|  |  |  | just the last n bits of the true product, where n is the number of bits | 
					
						
							|  |  |  | in a long (the delivered product is the true product plus i*2**n for | 
					
						
							|  |  |  | some integer i). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The native double product (double)x * (double)y is subject to three | 
					
						
							|  |  |  | rounding errors:  on a sizeof(long)==8 box, each cast to double can lose | 
					
						
							|  |  |  | info, and even on a sizeof(long)==4 box, the multiplication can lose info. | 
					
						
							|  |  |  | But, unlike the native long product, it's not in *range* trouble:  even | 
					
						
							|  |  |  | if sizeof(long)==32 (256-bit longs), the product easily fits in the | 
					
						
							|  |  |  | dynamic range of a double.  So the leading 50 (or so) bits of the double | 
					
						
							|  |  |  | product are correct. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | We check these two ways against each other, and declare victory if they're | 
					
						
							|  |  |  | approximately the same.  Else, because the native long product is the only | 
					
						
							|  |  |  | one that can lose catastrophic amounts of information, it's the native long | 
					
						
							|  |  |  | product that must have overflowed. | 
					
						
							| 
									
										
										
										
											1994-08-29 12:48:32 +00:00
										 |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | int_mul(PyObject *v, PyObject *w) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2001-12-04 23:05:10 +00:00
										 |  |  | 	long a, b; | 
					
						
							|  |  |  | 	long longprod;			/* a*b in native long arithmetic */ | 
					
						
							|  |  |  | 	double doubled_longprod;	/* (double)longprod */ | 
					
						
							|  |  |  | 	double doubleprod;		/* (double)a * (double)b */ | 
					
						
							| 
									
										
										
										
											1994-08-29 12:48:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	CONVERT_TO_LONG(v, a); | 
					
						
							|  |  |  | 	CONVERT_TO_LONG(w, b); | 
					
						
							| 
									
										
										
										
											2001-12-04 23:05:10 +00:00
										 |  |  | 	longprod = a * b; | 
					
						
							|  |  |  | 	doubleprod = (double)a * (double)b; | 
					
						
							|  |  |  | 	doubled_longprod = (double)longprod; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Fast path for normal case:  small multiplicands, and no info
 | 
					
						
							|  |  |  | 	   is lost in either method. */ | 
					
						
							|  |  |  | 	if (doubled_longprod == doubleprod) | 
					
						
							|  |  |  | 		return PyInt_FromLong(longprod); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Somebody somewhere lost info.  Close enough, or way off?  Note
 | 
					
						
							|  |  |  | 	   that a != 0 and b != 0 (else doubled_longprod == doubleprod == 0). | 
					
						
							|  |  |  | 	   The difference either is or isn't significant compared to the | 
					
						
							|  |  |  | 	   true value (of which doubleprod is a good approximation). | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		const double diff = doubled_longprod - doubleprod; | 
					
						
							|  |  |  | 		const double absdiff = diff >= 0.0 ? diff : -diff; | 
					
						
							|  |  |  | 		const double absprod = doubleprod >= 0.0 ? doubleprod : | 
					
						
							|  |  |  | 							  -doubleprod; | 
					
						
							|  |  |  | 		/* absdiff/absprod <= 1/32 iff
 | 
					
						
							|  |  |  | 		   32 * absdiff <= absprod -- 5 good bits is "close enough" */ | 
					
						
							|  |  |  | 		if (32.0 * absdiff <= absprod) | 
					
						
							|  |  |  | 			return PyInt_FromLong(longprod); | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			return PyLong_Type.tp_as_number->nb_multiply(v, w); | 
					
						
							| 
									
										
										
										
											1994-08-29 12:48:32 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | /* Return type of i_divmod */ | 
					
						
							|  |  |  | enum divmod_result { | 
					
						
							|  |  |  | 	DIVMOD_OK,		/* Correct result */ | 
					
						
							|  |  |  | 	DIVMOD_OVERFLOW,	/* Overflow, try again using longs */ | 
					
						
							|  |  |  | 	DIVMOD_ERROR		/* Exception raised */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static enum divmod_result | 
					
						
							| 
									
										
										
										
											2001-06-18 19:21:11 +00:00
										 |  |  | i_divmod(register long x, register long y, | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  |          long *p_xdivy, long *p_xmody) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1992-01-19 16:28:51 +00:00
										 |  |  | 	long xdivy, xmody; | 
					
						
							| 
									
										
										
										
											2001-12-04 23:05:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-06-18 19:21:11 +00:00
										 |  |  | 	if (y == 0) { | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 		PyErr_SetString(PyExc_ZeroDivisionError, | 
					
						
							| 
									
										
										
										
											2000-10-24 19:57:45 +00:00
										 |  |  | 				"integer division or modulo by zero"); | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 		return DIVMOD_ERROR; | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2001-06-18 19:21:11 +00:00
										 |  |  | 	/* (-sys.maxint-1)/-1 is the only overflow case. */ | 
					
						
							| 
									
										
										
										
											2004-08-25 02:14:08 +00:00
										 |  |  | 	if (y == -1 && x < 0 && x == -x) | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 		return DIVMOD_OVERFLOW; | 
					
						
							| 
									
										
										
										
											2001-06-18 19:21:11 +00:00
										 |  |  | 	xdivy = x / y; | 
					
						
							|  |  |  | 	xmody = x - xdivy * y; | 
					
						
							|  |  |  | 	/* If the signs of x and y differ, and the remainder is non-0,
 | 
					
						
							|  |  |  | 	 * C89 doesn't define whether xdivy is now the floor or the | 
					
						
							|  |  |  | 	 * ceiling of the infinitely precise quotient.  We want the floor, | 
					
						
							|  |  |  | 	 * and we have it iff the remainder's sign matches y's. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) { | 
					
						
							|  |  |  | 		xmody += y; | 
					
						
							|  |  |  | 		--xdivy; | 
					
						
							|  |  |  | 		assert(xmody && ((y ^ xmody) >= 0)); | 
					
						
							| 
									
										
										
										
											1992-01-19 16:28:51 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	*p_xdivy = xdivy; | 
					
						
							|  |  |  | 	*p_xmody = xmody; | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 	return DIVMOD_OK; | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_div(PyIntObject *x, PyIntObject *y) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	long xi, yi; | 
					
						
							| 
									
										
										
										
											1992-01-19 16:28:51 +00:00
										 |  |  | 	long d, m; | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	CONVERT_TO_LONG(x, xi); | 
					
						
							|  |  |  | 	CONVERT_TO_LONG(y, yi); | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 	switch (i_divmod(xi, yi, &d, &m)) { | 
					
						
							|  |  |  | 	case DIVMOD_OK: | 
					
						
							|  |  |  | 		return PyInt_FromLong(d); | 
					
						
							|  |  |  | 	case DIVMOD_OVERFLOW: | 
					
						
							|  |  |  | 		return PyLong_Type.tp_as_number->nb_divide((PyObject *)x, | 
					
						
							|  |  |  | 							   (PyObject *)y); | 
					
						
							|  |  |  | 	default: | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1992-01-19 16:28:51 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Add warning mode for classic division, almost exactly as specified in
PEP 238.  Changes:
- add a new flag variable Py_DivisionWarningFlag, declared in
  pydebug.h, defined in object.c, set in main.c, and used in
  {int,long,float,complex}object.c.  When this flag is set, the
  classic division operator issues a DeprecationWarning message.
- add a new API PyRun_SimpleStringFlags() to match
  PyRun_SimpleString().  The main() function calls this so that
  commands run with -c can also benefit from -Dnew.
- While I was at it, I changed the usage message in main() somewhat:
  alphabetized the options, split it in *four* parts to fit in under
  512 bytes (not that I still believe this is necessary -- doc strings
  elsewhere are much longer), and perhaps most visibly, don't display
  the full list of options on each command line error.  Instead, the
  full list is only displayed when -h is used, and otherwise a brief
  reminder of -h is displayed.  When -h is used, write to stdout so
  that you can do `python -h | more'.
Notes:
- I don't want to use the -W option to control whether the classic
  division warning is issued or not, because the machinery to decide
  whether to display the warning or not is very expensive (it involves
  calling into the warnings.py module).  You can use -Werror to turn
  the warnings into exceptions though.
- The -Dnew option doesn't select future division for all of the
  program -- only for the __main__ module.  I don't know if I'll ever
  change this -- it would require changes to the .pyc file magic
  number to do it right, and a more global notion of compiler flags.
- You can usefully combine -Dwarn and -Dnew: this gives the __main__
  module new division, and warns about classic division everywhere
  else.
											
										 
											2001-08-31 17:40:15 +00:00
										 |  |  | static PyObject * | 
					
						
							|  |  |  | int_classic_div(PyIntObject *x, PyIntObject *y) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	long xi, yi; | 
					
						
							|  |  |  | 	long d, m; | 
					
						
							|  |  |  | 	CONVERT_TO_LONG(x, xi); | 
					
						
							|  |  |  | 	CONVERT_TO_LONG(y, yi); | 
					
						
							|  |  |  | 	if (Py_DivisionWarningFlag && | 
					
						
							|  |  |  | 	    PyErr_Warn(PyExc_DeprecationWarning, "classic int division") < 0) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	switch (i_divmod(xi, yi, &d, &m)) { | 
					
						
							|  |  |  | 	case DIVMOD_OK: | 
					
						
							|  |  |  | 		return PyInt_FromLong(d); | 
					
						
							|  |  |  | 	case DIVMOD_OVERFLOW: | 
					
						
							|  |  |  | 		return PyLong_Type.tp_as_number->nb_divide((PyObject *)x, | 
					
						
							|  |  |  | 							   (PyObject *)y); | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-09-04 05:52:47 +00:00
										 |  |  | static PyObject * | 
					
						
							|  |  |  | int_true_divide(PyObject *v, PyObject *w) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2001-09-04 06:17:36 +00:00
										 |  |  | 	/* If they aren't both ints, give someone else a chance.  In
 | 
					
						
							|  |  |  | 	   particular, this lets int/long get handled by longs, which | 
					
						
							|  |  |  | 	   underflows to 0 gracefully if the long is too big to convert | 
					
						
							|  |  |  | 	   to float. */ | 
					
						
							|  |  |  | 	if (PyInt_Check(v) && PyInt_Check(w)) | 
					
						
							|  |  |  | 		return PyFloat_Type.tp_as_number->nb_true_divide(v, w); | 
					
						
							|  |  |  | 	Py_INCREF(Py_NotImplemented); | 
					
						
							|  |  |  | 	return Py_NotImplemented; | 
					
						
							| 
									
										
										
										
											2001-09-04 05:52:47 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_mod(PyIntObject *x, PyIntObject *y) | 
					
						
							| 
									
										
										
										
											1992-01-19 16:28:51 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	long xi, yi; | 
					
						
							| 
									
										
										
										
											1992-01-19 16:28:51 +00:00
										 |  |  | 	long d, m; | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	CONVERT_TO_LONG(x, xi); | 
					
						
							|  |  |  | 	CONVERT_TO_LONG(y, yi); | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 	switch (i_divmod(xi, yi, &d, &m)) { | 
					
						
							|  |  |  | 	case DIVMOD_OK: | 
					
						
							|  |  |  | 		return PyInt_FromLong(m); | 
					
						
							|  |  |  | 	case DIVMOD_OVERFLOW: | 
					
						
							|  |  |  | 		return PyLong_Type.tp_as_number->nb_remainder((PyObject *)x, | 
					
						
							|  |  |  | 							      (PyObject *)y); | 
					
						
							|  |  |  | 	default: | 
					
						
							| 
									
										
										
										
											1992-01-19 16:28:51 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_divmod(PyIntObject *x, PyIntObject *y) | 
					
						
							| 
									
										
										
										
											1991-05-05 20:08:27 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	long xi, yi; | 
					
						
							| 
									
										
										
										
											1992-01-19 16:28:51 +00:00
										 |  |  | 	long d, m; | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	CONVERT_TO_LONG(x, xi); | 
					
						
							|  |  |  | 	CONVERT_TO_LONG(y, yi); | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 	switch (i_divmod(xi, yi, &d, &m)) { | 
					
						
							|  |  |  | 	case DIVMOD_OK: | 
					
						
							|  |  |  | 		return Py_BuildValue("(ll)", d, m); | 
					
						
							|  |  |  | 	case DIVMOD_OVERFLOW: | 
					
						
							|  |  |  | 		return PyLong_Type.tp_as_number->nb_divmod((PyObject *)x, | 
					
						
							|  |  |  | 							   (PyObject *)y); | 
					
						
							|  |  |  | 	default: | 
					
						
							| 
									
										
										
										
											1991-05-05 20:08:27 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1991-05-05 20:08:27 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1996-12-06 20:14:43 +00:00
										 |  |  | 	register long iv, iw, iz=0, ix, temp, prev; | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	CONVERT_TO_LONG(v, iv); | 
					
						
							|  |  |  | 	CONVERT_TO_LONG(w, iw); | 
					
						
							| 
									
										
										
										
											1994-08-29 12:48:32 +00:00
										 |  |  | 	if (iw < 0) { | 
					
						
							| 
									
										
										
										
											2001-09-03 08:35:41 +00:00
										 |  |  | 		if ((PyObject *)z != Py_None) { | 
					
						
							| 
									
										
										
										
											2001-09-05 06:24:58 +00:00
										 |  |  | 			PyErr_SetString(PyExc_TypeError, "pow() 2nd argument " | 
					
						
							|  |  |  | 			     "cannot be negative when 3rd argument specified"); | 
					
						
							| 
									
										
										
										
											2001-09-03 08:35:41 +00:00
										 |  |  | 			return NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2001-07-12 11:19:45 +00:00
										 |  |  | 		/* 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( | 
					
						
							|  |  |  | 			(PyObject *)v, (PyObject *)w, (PyObject *)z); | 
					
						
							| 
									
										
										
										
											1994-08-29 12:48:32 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  |  	if ((PyObject *)z != Py_None) { | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 		CONVERT_TO_LONG(z, iz); | 
					
						
							| 
									
										
										
										
											1996-12-06 20:14:43 +00:00
										 |  |  | 		if (iz == 0) { | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 			PyErr_SetString(PyExc_ValueError, | 
					
						
							| 
									
										
										
										
											2001-09-05 06:24:58 +00:00
										 |  |  | 					"pow() 3rd argument cannot be 0"); | 
					
						
							| 
									
										
										
										
											1996-12-06 20:14:43 +00:00
										 |  |  | 			return NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											1994-08-29 12:48:32 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * XXX: The original exponentiation code stopped looping | 
					
						
							|  |  |  | 	 * when temp hit zero; this code will continue onwards | 
					
						
							|  |  |  | 	 * unnecessarily, but at least it won't cause any errors. | 
					
						
							|  |  |  | 	 * Hopefully the speed improvement from the fast exponentiation | 
					
						
							|  |  |  | 	 * will compensate for the slight inefficiency. | 
					
						
							|  |  |  | 	 * XXX: Better handling of overflows is desperately needed. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  |  	temp = iv; | 
					
						
							|  |  |  | 	ix = 1; | 
					
						
							|  |  |  | 	while (iw > 0) { | 
					
						
							|  |  |  | 	 	prev = ix;	/* Save value for overflow check */ | 
					
						
							| 
									
										
										
										
											2001-12-04 23:05:10 +00:00
										 |  |  | 	 	if (iw & 1) { | 
					
						
							| 
									
										
										
										
											1994-08-29 12:48:32 +00:00
										 |  |  | 		 	ix = ix*temp; | 
					
						
							|  |  |  | 			if (temp == 0) | 
					
						
							|  |  |  | 				break; /* Avoid ix / 0 */ | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 			if (ix / temp != prev) { | 
					
						
							|  |  |  | 				return PyLong_Type.tp_as_number->nb_power( | 
					
						
							|  |  |  | 					(PyObject *)v, | 
					
						
							|  |  |  | 					(PyObject *)w, | 
					
						
							| 
									
										
										
										
											2001-08-23 21:28:33 +00:00
										 |  |  | 					(PyObject *)z); | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											1994-08-29 12:48:32 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	 	iw >>= 1;	/* Shift exponent down by 1 bit */ | 
					
						
							|  |  |  | 	        if (iw==0) break; | 
					
						
							|  |  |  | 	 	prev = temp; | 
					
						
							|  |  |  | 	 	temp *= temp;	/* Square the value of temp */ | 
					
						
							| 
									
										
										
										
											2004-08-25 02:14:08 +00:00
										 |  |  | 	 	if (prev != 0 && temp / prev != prev) { | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 			return PyLong_Type.tp_as_number->nb_power( | 
					
						
							|  |  |  | 				(PyObject *)v, (PyObject *)w, (PyObject *)z); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											1996-12-06 20:14:43 +00:00
										 |  |  | 	 	if (iz) { | 
					
						
							| 
									
										
										
										
											1994-08-29 12:48:32 +00:00
										 |  |  | 			/* If we did a multiplication, perform a modulo */ | 
					
						
							|  |  |  | 		 	ix = ix % iz; | 
					
						
							|  |  |  | 		 	temp = temp % iz; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1996-12-06 20:14:43 +00:00
										 |  |  | 	if (iz) { | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	 	long div, mod; | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 		switch (i_divmod(ix, iz, &div, &mod)) { | 
					
						
							|  |  |  | 		case DIVMOD_OK: | 
					
						
							|  |  |  | 			ix = mod; | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		case DIVMOD_OVERFLOW: | 
					
						
							|  |  |  | 			return PyLong_Type.tp_as_number->nb_power( | 
					
						
							|  |  |  | 				(PyObject *)v, (PyObject *)w, (PyObject *)z); | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	return PyInt_FromLong(ix); | 
					
						
							| 
									
										
										
										
											2001-12-04 23:05:10 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_neg(PyIntObject *v) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	register long a, x; | 
					
						
							|  |  |  | 	a = v->ob_ival; | 
					
						
							|  |  |  | 	x = -a; | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 	if (a < 0 && x < 0) { | 
					
						
							| 
									
										
										
										
											2004-08-25 02:14:08 +00:00
										 |  |  | 		PyObject *o = PyLong_FromLong(a); | 
					
						
							| 
									
										
										
										
											2003-01-19 15:40:09 +00:00
										 |  |  | 		if (o != NULL) { | 
					
						
							|  |  |  | 			PyObject *result = PyNumber_Negative(o); | 
					
						
							|  |  |  | 			Py_DECREF(o); | 
					
						
							|  |  |  | 			return result; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2001-08-23 02:59:04 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	return PyInt_FromLong(x); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_pos(PyIntObject *v) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2001-09-11 21:44:14 +00:00
										 |  |  | 	if (PyInt_CheckExact(v)) { | 
					
						
							|  |  |  | 		Py_INCREF(v); | 
					
						
							|  |  |  | 		return (PyObject *)v; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		return PyInt_FromLong(v->ob_ival); | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_abs(PyIntObject *v) | 
					
						
							| 
									
										
										
										
											1991-05-05 20:08:27 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	if (v->ob_ival >= 0) | 
					
						
							|  |  |  | 		return int_pos(v); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		return int_neg(v); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1991-05-14 12:05:32 +00:00
										 |  |  | static int | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_nonzero(PyIntObject *v) | 
					
						
							| 
									
										
										
										
											1991-05-14 12:05:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	return v->ob_ival != 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_invert(PyIntObject *v) | 
					
						
							| 
									
										
										
										
											1991-10-24 14:59:31 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	return PyInt_FromLong(~v->ob_ival); | 
					
						
							| 
									
										
										
										
											1991-10-24 14:59:31 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_lshift(PyIntObject *v, PyIntObject *w) | 
					
						
							| 
									
										
										
										
											1991-10-24 14:59:31 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2002-08-11 04:24:12 +00:00
										 |  |  | 	long a, b, c; | 
					
						
							| 
									
										
										
										
											2004-06-26 23:22:57 +00:00
										 |  |  | 	PyObject *vv, *ww, *result; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	CONVERT_TO_LONG(v, a); | 
					
						
							|  |  |  | 	CONVERT_TO_LONG(w, b); | 
					
						
							| 
									
										
										
										
											1992-01-14 18:33:22 +00:00
										 |  |  | 	if (b < 0) { | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 		PyErr_SetString(PyExc_ValueError, "negative shift count"); | 
					
						
							| 
									
										
										
										
											1992-01-14 18:33:22 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2001-09-11 21:44:14 +00:00
										 |  |  | 	if (a == 0 || b == 0) | 
					
						
							|  |  |  | 		return int_pos(v); | 
					
						
							| 
									
										
										
										
											1993-10-26 15:21:51 +00:00
										 |  |  | 	if (b >= LONG_BIT) { | 
					
						
							| 
									
										
										
										
											2004-06-26 23:22:57 +00:00
										 |  |  | 		vv = PyLong_FromLong(PyInt_AS_LONG(v)); | 
					
						
							|  |  |  | 		if (vv == NULL) | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							|  |  |  | 		ww = PyLong_FromLong(PyInt_AS_LONG(w)); | 
					
						
							|  |  |  | 		if (ww == NULL) { | 
					
						
							|  |  |  | 			Py_DECREF(vv); | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		result = PyNumber_Lshift(vv, ww); | 
					
						
							|  |  |  | 		Py_DECREF(vv); | 
					
						
							|  |  |  | 		Py_DECREF(ww); | 
					
						
							|  |  |  | 		return result; | 
					
						
							| 
									
										
										
										
											1992-01-14 18:33:22 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2002-08-11 17:54:42 +00:00
										 |  |  | 	c = a << b; | 
					
						
							|  |  |  | 	if (a != Py_ARITHMETIC_RIGHT_SHIFT(long, c, b)) { | 
					
						
							| 
									
										
										
										
											2004-06-26 23:22:57 +00:00
										 |  |  | 		vv = PyLong_FromLong(PyInt_AS_LONG(v)); | 
					
						
							|  |  |  | 		if (vv == NULL) | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							|  |  |  | 		ww = PyLong_FromLong(PyInt_AS_LONG(w)); | 
					
						
							|  |  |  | 		if (ww == NULL) { | 
					
						
							|  |  |  | 			Py_DECREF(vv); | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		result = PyNumber_Lshift(vv, ww); | 
					
						
							|  |  |  | 		Py_DECREF(vv); | 
					
						
							|  |  |  | 		Py_DECREF(ww); | 
					
						
							|  |  |  | 		return result; | 
					
						
							| 
									
										
										
										
											2002-08-11 04:24:12 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return PyInt_FromLong(c); | 
					
						
							| 
									
										
										
										
											1991-10-24 14:59:31 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_rshift(PyIntObject *v, PyIntObject *w) | 
					
						
							| 
									
										
										
										
											1991-10-24 14:59:31 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	register long a, b; | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	CONVERT_TO_LONG(v, a); | 
					
						
							|  |  |  | 	CONVERT_TO_LONG(w, b); | 
					
						
							| 
									
										
										
										
											1992-01-14 18:33:22 +00:00
										 |  |  | 	if (b < 0) { | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 		PyErr_SetString(PyExc_ValueError, "negative shift count"); | 
					
						
							| 
									
										
										
										
											1992-01-14 18:33:22 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2001-09-11 21:44:14 +00:00
										 |  |  | 	if (a == 0 || b == 0) | 
					
						
							|  |  |  | 		return int_pos(v); | 
					
						
							| 
									
										
										
										
											1993-10-26 15:21:51 +00:00
										 |  |  | 	if (b >= LONG_BIT) { | 
					
						
							| 
									
										
										
										
											1992-01-14 18:33:22 +00:00
										 |  |  | 		if (a < 0) | 
					
						
							|  |  |  | 			a = -1; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			a = 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2000-07-08 04:17:21 +00:00
										 |  |  | 		a = Py_ARITHMETIC_RIGHT_SHIFT(long, a, b); | 
					
						
							| 
									
										
										
										
											1992-01-14 18:33:22 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	return PyInt_FromLong(a); | 
					
						
							| 
									
										
										
										
											1991-10-24 14:59:31 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_and(PyIntObject *v, PyIntObject *w) | 
					
						
							| 
									
										
										
										
											1991-10-24 14:59:31 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	register long a, b; | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	CONVERT_TO_LONG(v, a); | 
					
						
							|  |  |  | 	CONVERT_TO_LONG(w, b); | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	return PyInt_FromLong(a & b); | 
					
						
							| 
									
										
										
										
											1991-10-24 14:59:31 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_xor(PyIntObject *v, PyIntObject *w) | 
					
						
							| 
									
										
										
										
											1991-10-24 14:59:31 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	register long a, b; | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	CONVERT_TO_LONG(v, a); | 
					
						
							|  |  |  | 	CONVERT_TO_LONG(w, b); | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	return PyInt_FromLong(a ^ b); | 
					
						
							| 
									
										
										
										
											1991-10-24 14:59:31 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_or(PyIntObject *v, PyIntObject *w) | 
					
						
							| 
									
										
										
										
											1991-10-24 14:59:31 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	register long a, b; | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	CONVERT_TO_LONG(v, a); | 
					
						
							|  |  |  | 	CONVERT_TO_LONG(w, b); | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	return PyInt_FromLong(a | b); | 
					
						
							| 
									
										
										
										
											1991-10-24 14:59:31 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-09-19 01:25:16 +00:00
										 |  |  | static int | 
					
						
							|  |  |  | int_coerce(PyObject **pv, PyObject **pw) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (PyInt_Check(*pw)) { | 
					
						
							|  |  |  | 		Py_INCREF(*pv); | 
					
						
							|  |  |  | 		Py_INCREF(*pw); | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return 1; /* Can't do it */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_int(PyIntObject *v) | 
					
						
							| 
									
										
										
										
											1992-09-12 11:09:23 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2005-04-26 03:45:26 +00:00
										 |  |  | 	if (PyInt_CheckExact(v)) | 
					
						
							|  |  |  | 		Py_INCREF(v); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		v = (PyIntObject *)PyInt_FromLong(v->ob_ival); | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	return (PyObject *)v; | 
					
						
							| 
									
										
										
										
											1992-09-12 11:09:23 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_long(PyIntObject *v) | 
					
						
							| 
									
										
										
										
											1992-09-12 11:09:23 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	return PyLong_FromLong((v -> ob_ival)); | 
					
						
							| 
									
										
										
										
											1992-09-12 11:09:23 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_float(PyIntObject *v) | 
					
						
							| 
									
										
										
										
											1992-09-12 11:09:23 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	return PyFloat_FromDouble((double)(v -> ob_ival)); | 
					
						
							| 
									
										
										
										
											1992-09-12 11:09:23 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_oct(PyIntObject *v) | 
					
						
							| 
									
										
										
										
											1992-09-12 11:09:23 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1997-01-14 15:43:41 +00:00
										 |  |  | 	char buf[100]; | 
					
						
							| 
									
										
										
										
											1993-03-29 10:43:31 +00:00
										 |  |  | 	long x = v -> ob_ival; | 
					
						
							| 
									
										
										
										
											2003-11-29 23:52:13 +00:00
										 |  |  | 	if (x < 0) | 
					
						
							|  |  |  | 		PyOS_snprintf(buf, sizeof(buf), "-0%lo", -x); | 
					
						
							|  |  |  | 	else if (x == 0) | 
					
						
							| 
									
										
										
										
											1992-09-12 11:09:23 +00:00
										 |  |  | 		strcpy(buf, "0"); | 
					
						
							|  |  |  | 	else | 
					
						
							| 
									
										
										
										
											2001-11-28 20:55:34 +00:00
										 |  |  | 		PyOS_snprintf(buf, sizeof(buf), "0%lo", x); | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	return PyString_FromString(buf); | 
					
						
							| 
									
										
										
										
											1992-09-12 11:09:23 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | int_hex(PyIntObject *v) | 
					
						
							| 
									
										
										
										
											1992-09-12 11:09:23 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1997-01-14 15:43:41 +00:00
										 |  |  | 	char buf[100]; | 
					
						
							| 
									
										
										
										
											1993-03-29 10:43:31 +00:00
										 |  |  | 	long x = v -> ob_ival; | 
					
						
							| 
									
										
										
										
											2003-11-29 23:52:13 +00:00
										 |  |  | 	if (x < 0) | 
					
						
							|  |  |  | 		PyOS_snprintf(buf, sizeof(buf), "-0x%lx", -x); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		PyOS_snprintf(buf, sizeof(buf), "0x%lx", x); | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	return PyString_FromString(buf); | 
					
						
							| 
									
										
										
										
											1992-09-12 11:09:23 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-17 16:30:39 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2001-08-29 15:47:46 +00:00
										 |  |  | int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | static PyObject * | 
					
						
							|  |  |  | int_new(PyTypeObject *type, PyObject *args, PyObject *kwds) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	PyObject *x = NULL; | 
					
						
							|  |  |  | 	int base = -909; | 
					
						
							| 
									
										
										
										
											2006-02-27 16:46:16 +00:00
										 |  |  | 	static char *kwlist[] = {"x", "base", 0}; | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-29 15:47:46 +00:00
										 |  |  | 	if (type != &PyInt_Type) | 
					
						
							|  |  |  | 		return int_subtype_new(type, args, kwds); /* Wimp out */ | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | 	if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist, | 
					
						
							|  |  |  | 					 &x, &base)) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	if (x == NULL) | 
					
						
							|  |  |  | 		return PyInt_FromLong(0L); | 
					
						
							|  |  |  | 	if (base == -909) | 
					
						
							|  |  |  | 		return PyNumber_Int(x); | 
					
						
							|  |  |  | 	if (PyString_Check(x)) | 
					
						
							|  |  |  | 		return PyInt_FromString(PyString_AS_STRING(x), NULL, base); | 
					
						
							| 
									
										
										
										
											2001-08-17 18:39:25 +00:00
										 |  |  | #ifdef Py_USING_UNICODE
 | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | 	if (PyUnicode_Check(x)) | 
					
						
							|  |  |  | 		return PyInt_FromUnicode(PyUnicode_AS_UNICODE(x), | 
					
						
							|  |  |  | 					 PyUnicode_GET_SIZE(x), | 
					
						
							|  |  |  | 					 base); | 
					
						
							| 
									
										
										
										
											2001-08-17 18:39:25 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | 	PyErr_SetString(PyExc_TypeError, | 
					
						
							|  |  |  | 			"int() can't convert non-string with explicit base"); | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-29 15:47:46 +00:00
										 |  |  | /* Wimpy, slow approach to tp_new calls for subtypes of int:
 | 
					
						
							|  |  |  |    first create a regular int from whatever arguments we got, | 
					
						
							|  |  |  |    then allocate a subtype instance and initialize its ob_ival | 
					
						
							|  |  |  |    from the regular int.  The regular int is then thrown away. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-04-11 06:54:30 +00:00
										 |  |  | 	PyObject *tmp, *newobj; | 
					
						
							| 
									
										
										
										
											2003-02-10 02:12:43 +00:00
										 |  |  | 	long ival; | 
					
						
							| 
									
										
										
										
											2001-08-29 15:47:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	assert(PyType_IsSubtype(type, &PyInt_Type)); | 
					
						
							|  |  |  | 	tmp = int_new(&PyInt_Type, args, kwds); | 
					
						
							|  |  |  | 	if (tmp == NULL) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2003-02-10 02:12:43 +00:00
										 |  |  | 	if (!PyInt_Check(tmp)) { | 
					
						
							|  |  |  | 		ival = PyLong_AsLong(tmp); | 
					
						
							| 
									
										
										
										
											2003-08-11 17:32:02 +00:00
										 |  |  | 		if (ival == -1 && PyErr_Occurred()) { | 
					
						
							|  |  |  | 			Py_DECREF(tmp); | 
					
						
							| 
									
										
										
										
											2003-02-10 02:12:43 +00:00
										 |  |  | 			return NULL; | 
					
						
							| 
									
										
										
										
											2003-08-11 17:32:02 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2003-02-10 02:12:43 +00:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		ival = ((PyIntObject *)tmp)->ob_ival; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-11 06:54:30 +00:00
										 |  |  | 	newobj = type->tp_alloc(type, 0); | 
					
						
							|  |  |  | 	if (newobj == NULL) { | 
					
						
							| 
									
										
										
										
											2003-06-28 20:04:25 +00:00
										 |  |  | 		Py_DECREF(tmp); | 
					
						
							| 
									
										
										
										
											2001-08-29 15:47:46 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2003-06-28 20:04:25 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2006-04-11 06:54:30 +00:00
										 |  |  | 	((PyIntObject *)newobj)->ob_ival = ival; | 
					
						
							| 
									
										
										
										
											2001-08-29 15:47:46 +00:00
										 |  |  | 	Py_DECREF(tmp); | 
					
						
							| 
									
										
										
										
											2006-04-11 06:54:30 +00:00
										 |  |  | 	return newobj; | 
					
						
							| 
									
										
										
										
											2001-08-29 15:47:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-29 17:58:45 +00:00
										 |  |  | static PyObject * | 
					
						
							|  |  |  | int_getnewargs(PyIntObject *v) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return Py_BuildValue("(l)", v->ob_ival); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyMethodDef int_methods[] = { | 
					
						
							|  |  |  | 	{"__getnewargs__",	(PyCFunction)int_getnewargs,	METH_NOARGS}, | 
					
						
							|  |  |  | 	{NULL,		NULL}		/* sentinel */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-06-13 20:33:02 +00:00
										 |  |  | PyDoc_STRVAR(int_doc, | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | "int(x[, base]) -> integer\n\
 | 
					
						
							|  |  |  | \n\ | 
					
						
							|  |  |  | Convert a string or number to an integer, if possible.  A floating point\n\ | 
					
						
							|  |  |  | argument will be truncated towards zero (this does not include a string\n\ | 
					
						
							|  |  |  | representation of a floating point number!)  When converting a string, use\n\ | 
					
						
							|  |  |  | the optional base.  It is an error to supply a base when converting a\n\ | 
					
						
							| 
									
										
										
										
											2002-11-19 20:49:15 +00:00
										 |  |  | non-string. If the argument is outside the integer range a long object\n\ | 
					
						
							|  |  |  | will be returned instead."); | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | static PyNumberMethods int_as_number = { | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	(binaryfunc)int_add,	/*nb_add*/ | 
					
						
							|  |  |  | 	(binaryfunc)int_sub,	/*nb_subtract*/ | 
					
						
							|  |  |  | 	(binaryfunc)int_mul,	/*nb_multiply*/ | 
					
						
							| 
									
										
											  
											
												Add warning mode for classic division, almost exactly as specified in
PEP 238.  Changes:
- add a new flag variable Py_DivisionWarningFlag, declared in
  pydebug.h, defined in object.c, set in main.c, and used in
  {int,long,float,complex}object.c.  When this flag is set, the
  classic division operator issues a DeprecationWarning message.
- add a new API PyRun_SimpleStringFlags() to match
  PyRun_SimpleString().  The main() function calls this so that
  commands run with -c can also benefit from -Dnew.
- While I was at it, I changed the usage message in main() somewhat:
  alphabetized the options, split it in *four* parts to fit in under
  512 bytes (not that I still believe this is necessary -- doc strings
  elsewhere are much longer), and perhaps most visibly, don't display
  the full list of options on each command line error.  Instead, the
  full list is only displayed when -h is used, and otherwise a brief
  reminder of -h is displayed.  When -h is used, write to stdout so
  that you can do `python -h | more'.
Notes:
- I don't want to use the -W option to control whether the classic
  division warning is issued or not, because the machinery to decide
  whether to display the warning or not is very expensive (it involves
  calling into the warnings.py module).  You can use -Werror to turn
  the warnings into exceptions though.
- The -Dnew option doesn't select future division for all of the
  program -- only for the __main__ module.  I don't know if I'll ever
  change this -- it would require changes to the .pyc file magic
  number to do it right, and a more global notion of compiler flags.
- You can usefully combine -Dwarn and -Dnew: this gives the __main__
  module new division, and warns about classic division everywhere
  else.
											
										 
											2001-08-31 17:40:15 +00:00
										 |  |  | 	(binaryfunc)int_classic_div, /*nb_divide*/ | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	(binaryfunc)int_mod,	/*nb_remainder*/ | 
					
						
							|  |  |  | 	(binaryfunc)int_divmod,	/*nb_divmod*/ | 
					
						
							|  |  |  | 	(ternaryfunc)int_pow,	/*nb_power*/ | 
					
						
							|  |  |  | 	(unaryfunc)int_neg,	/*nb_negative*/ | 
					
						
							|  |  |  | 	(unaryfunc)int_pos,	/*nb_positive*/ | 
					
						
							|  |  |  | 	(unaryfunc)int_abs,	/*nb_absolute*/ | 
					
						
							|  |  |  | 	(inquiry)int_nonzero,	/*nb_nonzero*/ | 
					
						
							|  |  |  | 	(unaryfunc)int_invert,	/*nb_invert*/ | 
					
						
							|  |  |  | 	(binaryfunc)int_lshift,	/*nb_lshift*/ | 
					
						
							|  |  |  | 	(binaryfunc)int_rshift,	/*nb_rshift*/ | 
					
						
							|  |  |  | 	(binaryfunc)int_and,	/*nb_and*/ | 
					
						
							|  |  |  | 	(binaryfunc)int_xor,	/*nb_xor*/ | 
					
						
							|  |  |  | 	(binaryfunc)int_or,	/*nb_or*/ | 
					
						
							| 
									
										
										
										
											2001-09-19 01:25:16 +00:00
										 |  |  | 	int_coerce,		/*nb_coerce*/ | 
					
						
							| 
									
										
										
										
											2001-01-04 01:45:33 +00:00
										 |  |  | 	(unaryfunc)int_int,	/*nb_int*/ | 
					
						
							|  |  |  | 	(unaryfunc)int_long,	/*nb_long*/ | 
					
						
							|  |  |  | 	(unaryfunc)int_float,	/*nb_float*/ | 
					
						
							|  |  |  | 	(unaryfunc)int_oct,	/*nb_oct*/ | 
					
						
							|  |  |  | 	(unaryfunc)int_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*/ | 
					
						
							| 
									
										
										
										
											2001-08-08 05:00:18 +00:00
										 |  |  | 	(binaryfunc)int_div,	/* nb_floor_divide */ | 
					
						
							|  |  |  | 	int_true_divide,	/* nb_true_divide */ | 
					
						
							|  |  |  | 	0,			/* nb_inplace_floor_divide */ | 
					
						
							|  |  |  | 	0,			/* nb_inplace_true_divide */ | 
					
						
							| 
									
										
										
										
											2006-03-30 11:57:00 +00:00
										 |  |  | 	PyInt_AsSsize_t,	/* nb_index */ | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | PyTypeObject PyInt_Type = { | 
					
						
							|  |  |  | 	PyObject_HEAD_INIT(&PyType_Type) | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	0, | 
					
						
							|  |  |  | 	"int", | 
					
						
							| 
									
										
										
										
											1997-05-02 03:12:38 +00:00
										 |  |  | 	sizeof(PyIntObject), | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 	0, | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | 	(destructor)int_dealloc,		/* tp_dealloc */ | 
					
						
							|  |  |  | 	(printfunc)int_print,			/* tp_print */ | 
					
						
							|  |  |  | 	0,					/* tp_getattr */ | 
					
						
							|  |  |  | 	0,					/* tp_setattr */ | 
					
						
							|  |  |  | 	(cmpfunc)int_compare,			/* tp_compare */ | 
					
						
							|  |  |  | 	(reprfunc)int_repr,			/* tp_repr */ | 
					
						
							|  |  |  | 	&int_as_number,				/* tp_as_number */ | 
					
						
							|  |  |  | 	0,					/* tp_as_sequence */ | 
					
						
							|  |  |  | 	0,					/* tp_as_mapping */ | 
					
						
							|  |  |  | 	(hashfunc)int_hash,			/* tp_hash */ | 
					
						
							|  |  |  |         0,					/* tp_call */ | 
					
						
							| 
									
										
										
										
											2002-02-01 15:34:10 +00:00
										 |  |  |         (reprfunc)int_repr,			/* tp_str */ | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | 	PyObject_GenericGetAttr,		/* tp_getattro */ | 
					
						
							|  |  |  | 	0,					/* tp_setattro */ | 
					
						
							|  |  |  | 	0,					/* tp_as_buffer */ | 
					
						
							| 
									
										
										
										
											2001-08-29 15:47:46 +00:00
										 |  |  | 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES | | 
					
						
							|  |  |  | 		Py_TPFLAGS_BASETYPE,		/* tp_flags */ | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | 	int_doc,				/* tp_doc */ | 
					
						
							|  |  |  | 	0,					/* tp_traverse */ | 
					
						
							|  |  |  | 	0,					/* tp_clear */ | 
					
						
							|  |  |  | 	0,					/* tp_richcompare */ | 
					
						
							|  |  |  | 	0,					/* tp_weaklistoffset */ | 
					
						
							|  |  |  | 	0,					/* tp_iter */ | 
					
						
							|  |  |  | 	0,					/* tp_iternext */ | 
					
						
							| 
									
										
										
										
											2003-01-29 17:58:45 +00:00
										 |  |  | 	int_methods,				/* tp_methods */ | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | 	0,					/* tp_members */ | 
					
						
							|  |  |  | 	0,					/* tp_getset */ | 
					
						
							|  |  |  | 	0,					/* tp_base */ | 
					
						
							|  |  |  | 	0,					/* tp_dict */ | 
					
						
							|  |  |  | 	0,					/* tp_descr_get */ | 
					
						
							|  |  |  | 	0,					/* tp_descr_set */ | 
					
						
							|  |  |  | 	0,					/* tp_dictoffset */ | 
					
						
							|  |  |  | 	0,					/* tp_init */ | 
					
						
							|  |  |  | 	0,					/* tp_alloc */ | 
					
						
							|  |  |  | 	int_new,				/* tp_new */ | 
					
						
							| 
									
										
										
										
											2002-04-26 00:53:34 +00:00
										 |  |  | 	(freefunc)int_free,           		/* tp_free */ | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											1997-08-05 02:16:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-30 22:29:22 +00:00
										 |  |  | int | 
					
						
							| 
									
										
										
										
											2002-12-31 03:42:13 +00:00
										 |  |  | _PyInt_Init(void) | 
					
						
							| 
									
										
										
										
											2002-12-30 22:29:22 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	PyIntObject *v; | 
					
						
							|  |  |  | 	int ival; | 
					
						
							|  |  |  | #if NSMALLNEGINTS + NSMALLPOSINTS > 0
 | 
					
						
							|  |  |  | 	for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++) { | 
					
						
							| 
									
										
										
										
											2004-02-08 18:54:37 +00:00
										 |  |  |               if (!free_list && (free_list = fill_free_list()) == NULL) | 
					
						
							| 
									
										
										
										
											2002-12-30 22:29:22 +00:00
										 |  |  | 			return 0; | 
					
						
							|  |  |  | 		/* PyObject_New is inlined */ | 
					
						
							|  |  |  | 		v = free_list; | 
					
						
							|  |  |  | 		free_list = (PyIntObject *)v->ob_type; | 
					
						
							|  |  |  | 		PyObject_INIT(v, &PyInt_Type); | 
					
						
							|  |  |  | 		v->ob_ival = ival; | 
					
						
							|  |  |  | 		small_ints[ival + NSMALLNEGINTS] = v; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 	return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-08-05 02:16:08 +00:00
										 |  |  | void | 
					
						
							| 
									
										
										
										
											2000-07-09 15:16:51 +00:00
										 |  |  | PyInt_Fini(void) | 
					
						
							| 
									
										
										
										
											1997-08-05 02:16:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1999-03-12 19:43:17 +00:00
										 |  |  | 	PyIntObject *p; | 
					
						
							|  |  |  | 	PyIntBlock *list, *next; | 
					
						
							| 
									
										
										
										
											1997-08-05 02:16:08 +00:00
										 |  |  | 	int i; | 
					
						
							| 
									
										
										
										
											1999-03-10 22:55:24 +00:00
										 |  |  | 	int bc, bf;	/* block count, number of freed blocks */ | 
					
						
							|  |  |  | 	int irem, isum;	/* remaining unfreed ints per block, total */ | 
					
						
							| 
									
										
										
										
											1997-08-05 02:16:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-03-10 22:55:24 +00:00
										 |  |  | #if NSMALLNEGINTS + NSMALLPOSINTS > 0
 | 
					
						
							|  |  |  |         PyIntObject **q; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         i = NSMALLNEGINTS + NSMALLPOSINTS; | 
					
						
							|  |  |  |         q = small_ints; | 
					
						
							|  |  |  |         while (--i >= 0) { | 
					
						
							|  |  |  |                 Py_XDECREF(*q); | 
					
						
							|  |  |  |                 *q++ = NULL; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											1997-08-05 02:16:08 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1999-03-10 22:55:24 +00:00
										 |  |  | 	bc = 0; | 
					
						
							|  |  |  | 	bf = 0; | 
					
						
							|  |  |  | 	isum = 0; | 
					
						
							|  |  |  | 	list = block_list; | 
					
						
							|  |  |  | 	block_list = NULL; | 
					
						
							| 
									
										
										
										
											1999-03-19 20:30:39 +00:00
										 |  |  | 	free_list = NULL; | 
					
						
							| 
									
										
										
										
											1999-03-10 22:55:24 +00:00
										 |  |  | 	while (list != NULL) { | 
					
						
							|  |  |  | 		bc++; | 
					
						
							|  |  |  | 		irem = 0; | 
					
						
							| 
									
										
										
										
											1999-03-19 20:30:39 +00:00
										 |  |  | 		for (i = 0, p = &list->objects[0]; | 
					
						
							|  |  |  | 		     i < N_INTOBJECTS; | 
					
						
							|  |  |  | 		     i++, p++) { | 
					
						
							| 
									
										
										
										
											2001-09-11 16:13:52 +00:00
										 |  |  | 			if (PyInt_CheckExact(p) && p->ob_refcnt != 0) | 
					
						
							| 
									
										
										
										
											1999-03-10 22:55:24 +00:00
										 |  |  | 				irem++; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											1999-03-12 19:43:17 +00:00
										 |  |  | 		next = list->next; | 
					
						
							| 
									
										
										
										
											1999-03-10 22:55:24 +00:00
										 |  |  | 		if (irem) { | 
					
						
							| 
									
										
										
										
											1999-03-12 19:43:17 +00:00
										 |  |  | 			list->next = block_list; | 
					
						
							|  |  |  | 			block_list = list; | 
					
						
							| 
									
										
										
										
											1999-03-19 20:30:39 +00:00
										 |  |  | 			for (i = 0, p = &list->objects[0]; | 
					
						
							|  |  |  | 			     i < N_INTOBJECTS; | 
					
						
							|  |  |  | 			     i++, p++) { | 
					
						
							| 
									
										
										
										
											2001-09-11 16:13:52 +00:00
										 |  |  | 				if (!PyInt_CheckExact(p) || | 
					
						
							| 
									
										
										
										
											2001-08-29 15:47:46 +00:00
										 |  |  | 				    p->ob_refcnt == 0) { | 
					
						
							| 
									
										
										
										
											1999-03-19 20:30:39 +00:00
										 |  |  | 					p->ob_type = (struct _typeobject *) | 
					
						
							|  |  |  | 						free_list; | 
					
						
							|  |  |  | 					free_list = p; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | #if NSMALLNEGINTS + NSMALLPOSINTS > 0
 | 
					
						
							|  |  |  | 				else if (-NSMALLNEGINTS <= p->ob_ival && | 
					
						
							|  |  |  | 					 p->ob_ival < NSMALLPOSINTS && | 
					
						
							|  |  |  | 					 small_ints[p->ob_ival + | 
					
						
							|  |  |  | 						    NSMALLNEGINTS] == NULL) { | 
					
						
							|  |  |  | 					Py_INCREF(p); | 
					
						
							|  |  |  | 					small_ints[p->ob_ival + | 
					
						
							|  |  |  | 						   NSMALLNEGINTS] = p; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											1999-03-10 22:55:24 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2002-04-28 16:57:34 +00:00
										 |  |  | 			PyMem_FREE(list); | 
					
						
							| 
									
										
										
										
											1999-03-10 22:55:24 +00:00
										 |  |  | 			bf++; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		isum += irem; | 
					
						
							| 
									
										
										
										
											1999-03-12 19:43:17 +00:00
										 |  |  | 		list = next; | 
					
						
							| 
									
										
										
										
											1999-03-10 22:55:24 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1999-03-12 19:43:17 +00:00
										 |  |  | 	if (!Py_VerboseFlag) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	fprintf(stderr, "# cleanup ints"); | 
					
						
							|  |  |  | 	if (!isum) { | 
					
						
							|  |  |  | 		fprintf(stderr, "\n"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							|  |  |  | 		fprintf(stderr, | 
					
						
							|  |  |  | 			": %d unfreed int%s in %d out of %d block%s\n", | 
					
						
							|  |  |  | 			isum, isum == 1 ? "" : "s", | 
					
						
							|  |  |  | 			bc - bf, bc, bc == 1 ? "" : "s"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (Py_VerboseFlag > 1) { | 
					
						
							|  |  |  | 		list = block_list; | 
					
						
							|  |  |  | 		while (list != NULL) { | 
					
						
							| 
									
										
										
										
											1999-03-19 20:30:39 +00:00
										 |  |  | 			for (i = 0, p = &list->objects[0]; | 
					
						
							|  |  |  | 			     i < N_INTOBJECTS; | 
					
						
							|  |  |  | 			     i++, p++) { | 
					
						
							| 
									
										
										
										
											2001-09-11 16:13:52 +00:00
										 |  |  | 				if (PyInt_CheckExact(p) && p->ob_refcnt != 0) | 
					
						
							| 
									
										
										
										
											2006-03-01 05:41:20 +00:00
										 |  |  | 					/* XXX(twouters) cast refcount to
 | 
					
						
							|  |  |  | 					   long until %zd is universally | 
					
						
							|  |  |  | 					   available | 
					
						
							|  |  |  | 					 */ | 
					
						
							| 
									
										
										
										
											1999-03-12 19:43:17 +00:00
										 |  |  | 					fprintf(stderr, | 
					
						
							| 
									
										
										
										
											2006-03-01 05:41:20 +00:00
										 |  |  | 				"#   <int at %p, refcnt=%ld, val=%ld>\n", | 
					
						
							|  |  |  | 						p, (long)p->ob_refcnt, | 
					
						
							|  |  |  | 						p->ob_ival); | 
					
						
							| 
									
										
										
										
											1999-03-12 19:43:17 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			list = list->next; | 
					
						
							| 
									
										
										
										
											1999-03-10 22:55:24 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1997-08-05 02:16:08 +00:00
										 |  |  | } |