blob: 86e2e8c08fbca78a34f2316f06d3ed8f1bcabad2 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Integer object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Barry Warsaw226ae6c1999-10-12 19:54:53 +00005#include <ctype.h>
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006
Guido van Rossum2e1d4331993-12-24 10:22:45 +00007long
Fred Drakea2f55112000-07-09 15:16:51 +00008PyInt_GetMax(void)
Guido van Rossum2e1d4331993-12-24 10:22:45 +00009{
10 return LONG_MAX; /* To initialize sys.maxint */
11}
12
Guido van Rossum3f5da241990-12-20 15:06:42 +000013/* Integers are quite normal objects, to make object handling uniform.
14 (Using odd pointers to represent integers would save much space
15 but require extra checks for this special case throughout the code.)
Tim Peters29c0afc2002-04-28 16:57:34 +000016 Since a typical Python program spends much of its time allocating
Guido van Rossum3f5da241990-12-20 15:06:42 +000017 and deallocating integers, these operations should be very fast.
18 Therefore we use a dedicated allocation scheme with a much lower
19 overhead (in space and time) than straight malloc(): a simple
20 dedicated free list, filled when necessary with memory from malloc().
Tim Peters29c0afc2002-04-28 16:57:34 +000021
22 block_list is a singly-linked list of all PyIntBlocks ever allocated,
23 linked via their next members. PyIntBlocks are never returned to the
24 system before shutdown (PyInt_Fini).
25
26 free_list is a singly-linked list of available PyIntObjects, linked
27 via abuse of their ob_type members.
Guido van Rossum3f5da241990-12-20 15:06:42 +000028*/
29
30#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
Guido van Rossum3fce8831999-03-12 19:43:17 +000031#define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
32#define N_INTOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyIntObject))
Guido van Rossumda084ed1999-03-10 22:55:24 +000033
Guido van Rossum3fce8831999-03-12 19:43:17 +000034struct _intblock {
35 struct _intblock *next;
36 PyIntObject objects[N_INTOBJECTS];
37};
38
39typedef struct _intblock PyIntBlock;
40
41static PyIntBlock *block_list = NULL;
42static PyIntObject *free_list = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000043
Guido van Rossumc0b618a1997-05-02 03:12:38 +000044static PyIntObject *
Fred Drakea2f55112000-07-09 15:16:51 +000045fill_free_list(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +000046{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000047 PyIntObject *p, *q;
Tim Peters29c0afc2002-04-28 16:57:34 +000048 /* Python's object allocator isn't appropriate for large blocks. */
Guido van Rossumb18618d2000-05-03 23:44:39 +000049 p = (PyIntObject *) PyMem_MALLOC(sizeof(PyIntBlock));
Guido van Rossum3f5da241990-12-20 15:06:42 +000050 if (p == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +000051 return (PyIntObject *) PyErr_NoMemory();
Guido van Rossum3fce8831999-03-12 19:43:17 +000052 ((PyIntBlock *)p)->next = block_list;
53 block_list = (PyIntBlock *)p;
Tim Peters29c0afc2002-04-28 16:57:34 +000054 /* Link the int objects together, from rear to front, then return
55 the address of the last int object in the block. */
Guido van Rossum3fce8831999-03-12 19:43:17 +000056 p = &((PyIntBlock *)p)->objects[0];
Guido van Rossum3f5da241990-12-20 15:06:42 +000057 q = p + N_INTOBJECTS;
58 while (--q > p)
Guido van Rossumda084ed1999-03-10 22:55:24 +000059 q->ob_type = (struct _typeobject *)(q-1);
60 q->ob_type = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000061 return p + N_INTOBJECTS - 1;
62}
63
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000064#ifndef NSMALLPOSINTS
Georg Brandl418a1ef2006-02-22 11:30:06 +000065#define NSMALLPOSINTS 257
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000066#endif
67#ifndef NSMALLNEGINTS
Neal Norwitzc91ed402002-12-30 22:29:22 +000068#define NSMALLNEGINTS 5
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000069#endif
70#if NSMALLNEGINTS + NSMALLPOSINTS > 0
71/* References to small integers are saved in this array so that they
72 can be shared.
73 The integers that are saved are those in the range
74 -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
75*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +000076static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000077#endif
78#ifdef COUNT_ALLOCS
79int quick_int_allocs, quick_neg_int_allocs;
80#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +000081
Guido van Rossumc0b618a1997-05-02 03:12:38 +000082PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +000083PyInt_FromLong(long ival)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000084{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 register PyIntObject *v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000086#if NSMALLNEGINTS + NSMALLPOSINTS > 0
Neal Norwitzc91ed402002-12-30 22:29:22 +000087 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
88 v = small_ints[ival + NSMALLNEGINTS];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 Py_INCREF(v);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000090#ifdef COUNT_ALLOCS
91 if (ival >= 0)
92 quick_int_allocs++;
93 else
94 quick_neg_int_allocs++;
95#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 return (PyObject *) v;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000097 }
98#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +000099 if (free_list == NULL) {
100 if ((free_list = fill_free_list()) == NULL)
101 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000102 }
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000103 /* Inline PyObject_New */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000104 v = free_list;
Guido van Rossumda084ed1999-03-10 22:55:24 +0000105 free_list = (PyIntObject *)v->ob_type;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000106 PyObject_INIT(v, &PyInt_Type);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000107 v->ob_ival = ival;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000108 return (PyObject *) v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000109}
110
Martin v. Löwis18e16552006-02-15 17:27:45 +0000111PyObject *
112PyInt_FromSize_t(size_t ival)
113{
114 if (ival <= LONG_MAX)
115 return PyInt_FromLong((long)ival);
116 return _PyLong_FromSize_t(ival);
117}
118
119PyObject *
120PyInt_FromSsize_t(Py_ssize_t ival)
121{
122 if (ival >= LONG_MIN && ival <= LONG_MAX)
123 return PyInt_FromLong((long)ival);
124 return _PyLong_FromSsize_t(ival);
125}
126
Guido van Rossum3f5da241990-12-20 15:06:42 +0000127static void
Fred Drakea2f55112000-07-09 15:16:51 +0000128int_dealloc(PyIntObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000129{
Guido van Rossumdea6ef92001-09-11 16:13:52 +0000130 if (PyInt_CheckExact(v)) {
Guido van Rossumbef14172001-08-29 15:47:46 +0000131 v->ob_type = (struct _typeobject *)free_list;
132 free_list = v;
133 }
134 else
135 v->ob_type->tp_free((PyObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136}
137
Guido van Rossum93646982002-04-26 00:53:34 +0000138static void
139int_free(PyIntObject *v)
140{
141 v->ob_type = (struct _typeobject *)free_list;
142 free_list = v;
143}
144
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145long
Fred Drakea2f55112000-07-09 15:16:51 +0000146PyInt_AsLong(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000148 PyNumberMethods *nb;
149 PyIntObject *io;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000150 long val;
Tim Petersa3c01ce2001-12-04 23:05:10 +0000151
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 if (op && PyInt_Check(op))
153 return PyInt_AS_LONG((PyIntObject*) op);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000154
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000155 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
156 nb->nb_int == NULL) {
Guido van Rossumc18a6f42000-05-09 14:27:48 +0000157 PyErr_SetString(PyExc_TypeError, "an integer is required");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000158 return -1;
159 }
Tim Petersa3c01ce2001-12-04 23:05:10 +0000160
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 io = (PyIntObject*) (*nb->nb_int) (op);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000162 if (io == NULL)
163 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000164 if (!PyInt_Check(io)) {
Walter Dörwaldf1715402002-11-19 20:49:15 +0000165 if (PyLong_Check(io)) {
166 /* got a long? => retry int conversion */
167 val = PyLong_AsLong((PyObject *)io);
Thomas Heller850566b2003-02-20 20:32:11 +0000168 Py_DECREF(io);
169 if ((val == -1) && PyErr_Occurred())
Walter Dörwaldf1715402002-11-19 20:49:15 +0000170 return -1;
Thomas Heller850566b2003-02-20 20:32:11 +0000171 return val;
Walter Dörwaldf1715402002-11-19 20:49:15 +0000172 }
173 else
174 {
Thomas Hellera4ea6032003-04-17 18:55:45 +0000175 Py_DECREF(io);
Walter Dörwaldf1715402002-11-19 20:49:15 +0000176 PyErr_SetString(PyExc_TypeError,
177 "nb_int should return int object");
178 return -1;
179 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000180 }
Tim Petersa3c01ce2001-12-04 23:05:10 +0000181
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 val = PyInt_AS_LONG(io);
183 Py_DECREF(io);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000184
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000185 return val;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186}
187
Martin v. Löwis18e16552006-02-15 17:27:45 +0000188Py_ssize_t
189PyInt_AsSsize_t(register PyObject *op)
190{
Thomas Woutersb1410fb2006-02-15 23:08:56 +0000191#if SIZEOF_SIZE_T != SIZEOF_LONG
Martin v. Löwis18e16552006-02-15 17:27:45 +0000192 PyNumberMethods *nb;
193 PyIntObject *io;
194 Py_ssize_t val;
Thomas Woutersb1410fb2006-02-15 23:08:56 +0000195#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000196 if (op && !PyInt_CheckExact(op) && PyLong_Check(op))
197 return _PyLong_AsSsize_t(op);
Thomas Woutersb1410fb2006-02-15 23:08:56 +0000198#if SIZEOF_SIZE_T == SIZEOF_LONG
Martin v. Löwis18e16552006-02-15 17:27:45 +0000199 return PyInt_AsLong(op);
200#else
201
202 if (op && PyInt_Check(op))
203 return PyInt_AS_LONG((PyIntObject*) op);
204
205 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
206 (nb->nb_int == NULL && nb->nb_long == 0)) {
207 PyErr_SetString(PyExc_TypeError, "an integer is required");
208 return -1;
209 }
210
211 if (nb->nb_long != 0) {
212 io = (PyIntObject*) (*nb->nb_long) (op);
213 } else {
214 io = (PyIntObject*) (*nb->nb_int) (op);
215 }
216 if (io == NULL)
217 return -1;
218 if (!PyInt_Check(io)) {
219 if (PyLong_Check(io)) {
220 /* got a long? => retry int conversion */
221 val = _PyLong_AsSsize_t((PyObject *)io);
222 Py_DECREF(io);
223 if ((val == -1) && PyErr_Occurred())
224 return -1;
225 return val;
226 }
227 else
228 {
229 Py_DECREF(io);
230 PyErr_SetString(PyExc_TypeError,
231 "nb_int should return int object");
232 return -1;
233 }
234 }
235
236 val = PyInt_AS_LONG(io);
237 Py_DECREF(io);
238
239 return val;
240#endif
241}
242
Thomas Hellera4ea6032003-04-17 18:55:45 +0000243unsigned long
244PyInt_AsUnsignedLongMask(register PyObject *op)
245{
246 PyNumberMethods *nb;
247 PyIntObject *io;
248 unsigned long val;
249
250 if (op && PyInt_Check(op))
251 return PyInt_AS_LONG((PyIntObject*) op);
252 if (op && PyLong_Check(op))
253 return PyLong_AsUnsignedLongMask(op);
254
255 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
256 nb->nb_int == NULL) {
257 PyErr_SetString(PyExc_TypeError, "an integer is required");
258 return -1;
259 }
260
261 io = (PyIntObject*) (*nb->nb_int) (op);
262 if (io == NULL)
263 return -1;
264 if (!PyInt_Check(io)) {
265 if (PyLong_Check(io)) {
266 val = PyLong_AsUnsignedLongMask((PyObject *)io);
267 Py_DECREF(io);
268 if (PyErr_Occurred())
269 return -1;
270 return val;
271 }
272 else
273 {
274 Py_DECREF(io);
275 PyErr_SetString(PyExc_TypeError,
276 "nb_int should return int object");
277 return -1;
278 }
279 }
280
281 val = PyInt_AS_LONG(io);
282 Py_DECREF(io);
283
284 return val;
285}
286
287#ifdef HAVE_LONG_LONG
288unsigned PY_LONG_LONG
289PyInt_AsUnsignedLongLongMask(register PyObject *op)
290{
291 PyNumberMethods *nb;
292 PyIntObject *io;
293 unsigned PY_LONG_LONG val;
294
295 if (op && PyInt_Check(op))
296 return PyInt_AS_LONG((PyIntObject*) op);
297 if (op && PyLong_Check(op))
298 return PyLong_AsUnsignedLongLongMask(op);
299
300 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
301 nb->nb_int == NULL) {
302 PyErr_SetString(PyExc_TypeError, "an integer is required");
303 return -1;
304 }
305
306 io = (PyIntObject*) (*nb->nb_int) (op);
307 if (io == NULL)
308 return -1;
309 if (!PyInt_Check(io)) {
310 if (PyLong_Check(io)) {
311 val = PyLong_AsUnsignedLongLongMask((PyObject *)io);
312 Py_DECREF(io);
313 if (PyErr_Occurred())
314 return -1;
315 return val;
316 }
317 else
318 {
319 Py_DECREF(io);
320 PyErr_SetString(PyExc_TypeError,
321 "nb_int should return int object");
322 return -1;
323 }
324 }
325
326 val = PyInt_AS_LONG(io);
327 Py_DECREF(io);
328
329 return val;
330}
331#endif
332
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000333PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000334PyInt_FromString(char *s, char **pend, int base)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000335{
336 char *end;
337 long x;
338 char buffer[256]; /* For errors */
339
340 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossum47710652003-02-12 20:48:22 +0000341 PyErr_SetString(PyExc_ValueError,
342 "int() base must be >= 2 and <= 36");
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000343 return NULL;
344 }
345
346 while (*s && isspace(Py_CHARMASK(*s)))
347 s++;
348 errno = 0;
Guido van Rossum47710652003-02-12 20:48:22 +0000349 if (base == 0 && s[0] == '0') {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000350 x = (long) PyOS_strtoul(s, &end, base);
Guido van Rossum47710652003-02-12 20:48:22 +0000351 if (x < 0)
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000352 return PyLong_FromString(s, pend, base);
Guido van Rossum47710652003-02-12 20:48:22 +0000353 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000354 else
355 x = PyOS_strtol(s, &end, base);
Martin v. Löwis2b6727b2001-03-06 12:12:02 +0000356 if (end == s || !isalnum(Py_CHARMASK(end[-1])))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000357 goto bad;
358 while (*end && isspace(Py_CHARMASK(*end)))
359 end++;
360 if (*end != '\0') {
361 bad:
Barry Warsaw61975092001-11-28 20:55:34 +0000362 PyOS_snprintf(buffer, sizeof(buffer),
363 "invalid literal for int(): %.200s", s);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000364 PyErr_SetString(PyExc_ValueError, buffer);
365 return NULL;
366 }
Tim Petersc8854432004-08-25 02:14:08 +0000367 else if (errno != 0)
Walter Dörwald07e14762002-11-06 16:15:14 +0000368 return PyLong_FromString(s, pend, base);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000369 if (pend)
370 *pend = end;
371 return PyInt_FromLong(x);
372}
373
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000374#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000375PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000376PyInt_FromUnicode(Py_UNICODE *s, Py_ssize_t length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000377{
Walter Dörwald07e14762002-11-06 16:15:14 +0000378 PyObject *result;
379 char *buffer = PyMem_MALLOC(length+1);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000380
Walter Dörwald07e14762002-11-06 16:15:14 +0000381 if (buffer == NULL)
382 return NULL;
383
384 if (PyUnicode_EncodeDecimal(s, length, buffer, NULL)) {
385 PyMem_FREE(buffer);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000386 return NULL;
387 }
Walter Dörwald07e14762002-11-06 16:15:14 +0000388 result = PyInt_FromString(buffer, NULL, base);
389 PyMem_FREE(buffer);
390 return result;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000391}
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000392#endif
Guido van Rossum9e896b32000-04-05 20:11:21 +0000393
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394/* Methods */
395
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000396/* Integers are seen as the "smallest" of all numeric types and thus
397 don't have any knowledge about conversion of other types to
398 integers. */
399
400#define CONVERT_TO_LONG(obj, lng) \
401 if (PyInt_Check(obj)) { \
402 lng = PyInt_AS_LONG(obj); \
403 } \
404 else { \
405 Py_INCREF(Py_NotImplemented); \
406 return Py_NotImplemented; \
407 }
408
Guido van Rossum719f5fa1992-03-27 17:31:02 +0000409/* ARGSUSED */
Guido van Rossum90933611991-06-07 16:10:43 +0000410static int
Fred Drakea2f55112000-07-09 15:16:51 +0000411int_print(PyIntObject *v, FILE *fp, int flags)
412 /* flags -- not used but required by interface */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000413{
414 fprintf(fp, "%ld", v->ob_ival);
Guido van Rossum90933611991-06-07 16:10:43 +0000415 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000416}
417
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000419int_repr(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000420{
Tim Peters42221042001-12-01 02:52:56 +0000421 char buf[64];
Barry Warsaw61975092001-11-28 20:55:34 +0000422 PyOS_snprintf(buf, sizeof(buf), "%ld", v->ob_ival);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000424}
425
426static int
Fred Drakea2f55112000-07-09 15:16:51 +0000427int_compare(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000428{
429 register long i = v->ob_ival;
430 register long j = w->ob_ival;
431 return (i < j) ? -1 : (i > j) ? 1 : 0;
432}
433
Guido van Rossum9bfef441993-03-29 10:43:31 +0000434static long
Fred Drakea2f55112000-07-09 15:16:51 +0000435int_hash(PyIntObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000436{
Guido van Rossum541cdd81997-01-06 22:53:20 +0000437 /* XXX If this is changed, you also need to change the way
438 Python's long, float and complex types are hashed. */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000439 long x = v -> ob_ival;
440 if (x == -1)
441 x = -2;
442 return x;
443}
444
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000446int_add(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000447{
448 register long a, b, x;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000449 CONVERT_TO_LONG(v, a);
450 CONVERT_TO_LONG(w, b);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000451 x = a + b;
Guido van Rossume27f7952001-08-23 02:59:04 +0000452 if ((x^a) >= 0 || (x^b) >= 0)
453 return PyInt_FromLong(x);
Guido van Rossume27f7952001-08-23 02:59:04 +0000454 return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000455}
456
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000458int_sub(PyIntObject *v, PyIntObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000459{
460 register long a, b, x;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000461 CONVERT_TO_LONG(v, a);
462 CONVERT_TO_LONG(w, b);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000463 x = a - b;
Guido van Rossume27f7952001-08-23 02:59:04 +0000464 if ((x^a) >= 0 || (x^~b) >= 0)
465 return PyInt_FromLong(x);
Guido van Rossume27f7952001-08-23 02:59:04 +0000466 return PyLong_Type.tp_as_number->nb_subtract((PyObject *)v,
467 (PyObject *)w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000468}
469
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000470/*
Tim Petersa3c01ce2001-12-04 23:05:10 +0000471Integer overflow checking for * is painful: Python tried a couple ways, but
472they didn't work on all platforms, or failed in endcases (a product of
473-sys.maxint-1 has been a particular pain).
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000474
Tim Petersa3c01ce2001-12-04 23:05:10 +0000475Here's another way:
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000476
Tim Petersa3c01ce2001-12-04 23:05:10 +0000477The native long product x*y is either exactly right or *way* off, being
478just the last n bits of the true product, where n is the number of bits
479in a long (the delivered product is the true product plus i*2**n for
480some integer i).
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000481
Tim Petersa3c01ce2001-12-04 23:05:10 +0000482The native double product (double)x * (double)y is subject to three
483rounding errors: on a sizeof(long)==8 box, each cast to double can lose
484info, and even on a sizeof(long)==4 box, the multiplication can lose info.
485But, unlike the native long product, it's not in *range* trouble: even
486if sizeof(long)==32 (256-bit longs), the product easily fits in the
487dynamic range of a double. So the leading 50 (or so) bits of the double
488product are correct.
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000489
Tim Petersa3c01ce2001-12-04 23:05:10 +0000490We check these two ways against each other, and declare victory if they're
491approximately the same. Else, because the native long product is the only
492one that can lose catastrophic amounts of information, it's the native long
493product that must have overflowed.
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000494*/
495
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496static PyObject *
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000497int_mul(PyObject *v, PyObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000498{
Tim Petersa3c01ce2001-12-04 23:05:10 +0000499 long a, b;
500 long longprod; /* a*b in native long arithmetic */
501 double doubled_longprod; /* (double)longprod */
502 double doubleprod; /* (double)a * (double)b */
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000503
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000504 CONVERT_TO_LONG(v, a);
505 CONVERT_TO_LONG(w, b);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000506 longprod = a * b;
507 doubleprod = (double)a * (double)b;
508 doubled_longprod = (double)longprod;
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000509
Tim Petersa3c01ce2001-12-04 23:05:10 +0000510 /* Fast path for normal case: small multiplicands, and no info
511 is lost in either method. */
512 if (doubled_longprod == doubleprod)
513 return PyInt_FromLong(longprod);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000514
Tim Petersa3c01ce2001-12-04 23:05:10 +0000515 /* Somebody somewhere lost info. Close enough, or way off? Note
516 that a != 0 and b != 0 (else doubled_longprod == doubleprod == 0).
517 The difference either is or isn't significant compared to the
518 true value (of which doubleprod is a good approximation).
519 */
520 {
521 const double diff = doubled_longprod - doubleprod;
522 const double absdiff = diff >= 0.0 ? diff : -diff;
523 const double absprod = doubleprod >= 0.0 ? doubleprod :
524 -doubleprod;
525 /* absdiff/absprod <= 1/32 iff
526 32 * absdiff <= absprod -- 5 good bits is "close enough" */
527 if (32.0 * absdiff <= absprod)
528 return PyInt_FromLong(longprod);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000529 else
530 return PyLong_Type.tp_as_number->nb_multiply(v, w);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000531 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000532}
533
Guido van Rossume27f7952001-08-23 02:59:04 +0000534/* Return type of i_divmod */
535enum divmod_result {
536 DIVMOD_OK, /* Correct result */
537 DIVMOD_OVERFLOW, /* Overflow, try again using longs */
538 DIVMOD_ERROR /* Exception raised */
539};
540
541static enum divmod_result
Tim Peters1dad6a82001-06-18 19:21:11 +0000542i_divmod(register long x, register long y,
Fred Drakea2f55112000-07-09 15:16:51 +0000543 long *p_xdivy, long *p_xmody)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000544{
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000545 long xdivy, xmody;
Tim Petersa3c01ce2001-12-04 23:05:10 +0000546
Tim Peters1dad6a82001-06-18 19:21:11 +0000547 if (y == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000548 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +0000549 "integer division or modulo by zero");
Guido van Rossume27f7952001-08-23 02:59:04 +0000550 return DIVMOD_ERROR;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000551 }
Tim Peters1dad6a82001-06-18 19:21:11 +0000552 /* (-sys.maxint-1)/-1 is the only overflow case. */
Tim Petersc8854432004-08-25 02:14:08 +0000553 if (y == -1 && x < 0 && x == -x)
Guido van Rossume27f7952001-08-23 02:59:04 +0000554 return DIVMOD_OVERFLOW;
Tim Peters1dad6a82001-06-18 19:21:11 +0000555 xdivy = x / y;
556 xmody = x - xdivy * y;
557 /* If the signs of x and y differ, and the remainder is non-0,
558 * C89 doesn't define whether xdivy is now the floor or the
559 * ceiling of the infinitely precise quotient. We want the floor,
560 * and we have it iff the remainder's sign matches y's.
561 */
562 if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) {
563 xmody += y;
564 --xdivy;
565 assert(xmody && ((y ^ xmody) >= 0));
Guido van Rossum00466951991-05-05 20:08:27 +0000566 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000567 *p_xdivy = xdivy;
568 *p_xmody = xmody;
Guido van Rossume27f7952001-08-23 02:59:04 +0000569 return DIVMOD_OK;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000570}
571
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000573int_div(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000574{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000575 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000576 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000577 CONVERT_TO_LONG(x, xi);
578 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000579 switch (i_divmod(xi, yi, &d, &m)) {
580 case DIVMOD_OK:
581 return PyInt_FromLong(d);
582 case DIVMOD_OVERFLOW:
583 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
584 (PyObject *)y);
585 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000586 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000587 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000588}
589
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000590static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000591int_classic_div(PyIntObject *x, PyIntObject *y)
592{
593 long xi, yi;
594 long d, m;
595 CONVERT_TO_LONG(x, xi);
596 CONVERT_TO_LONG(y, yi);
597 if (Py_DivisionWarningFlag &&
598 PyErr_Warn(PyExc_DeprecationWarning, "classic int division") < 0)
599 return NULL;
600 switch (i_divmod(xi, yi, &d, &m)) {
601 case DIVMOD_OK:
602 return PyInt_FromLong(d);
603 case DIVMOD_OVERFLOW:
604 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
605 (PyObject *)y);
606 default:
607 return NULL;
608 }
609}
610
611static PyObject *
Tim Peters9c1d7fd2001-09-04 05:52:47 +0000612int_true_divide(PyObject *v, PyObject *w)
613{
Tim Peterse2a60002001-09-04 06:17:36 +0000614 /* If they aren't both ints, give someone else a chance. In
615 particular, this lets int/long get handled by longs, which
616 underflows to 0 gracefully if the long is too big to convert
617 to float. */
618 if (PyInt_Check(v) && PyInt_Check(w))
619 return PyFloat_Type.tp_as_number->nb_true_divide(v, w);
620 Py_INCREF(Py_NotImplemented);
621 return Py_NotImplemented;
Tim Peters9c1d7fd2001-09-04 05:52:47 +0000622}
623
624static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000625int_mod(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000626{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000627 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000628 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000629 CONVERT_TO_LONG(x, xi);
630 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000631 switch (i_divmod(xi, yi, &d, &m)) {
632 case DIVMOD_OK:
633 return PyInt_FromLong(m);
634 case DIVMOD_OVERFLOW:
635 return PyLong_Type.tp_as_number->nb_remainder((PyObject *)x,
636 (PyObject *)y);
637 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000638 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000639 }
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000640}
641
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000642static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000643int_divmod(PyIntObject *x, PyIntObject *y)
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000644{
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000645 long xi, yi;
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000646 long d, m;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000647 CONVERT_TO_LONG(x, xi);
648 CONVERT_TO_LONG(y, yi);
Guido van Rossume27f7952001-08-23 02:59:04 +0000649 switch (i_divmod(xi, yi, &d, &m)) {
650 case DIVMOD_OK:
651 return Py_BuildValue("(ll)", d, m);
652 case DIVMOD_OVERFLOW:
653 return PyLong_Type.tp_as_number->nb_divmod((PyObject *)x,
654 (PyObject *)y);
655 default:
Guido van Rossum2b16a6f1992-01-19 16:28:51 +0000656 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000657 }
Guido van Rossum00466951991-05-05 20:08:27 +0000658}
659
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000660static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000661int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000662{
Guido van Rossum9478dd41996-12-06 20:14:43 +0000663 register long iv, iw, iz=0, ix, temp, prev;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000664 CONVERT_TO_LONG(v, iv);
665 CONVERT_TO_LONG(w, iw);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000666 if (iw < 0) {
Tim Peters32f453e2001-09-03 08:35:41 +0000667 if ((PyObject *)z != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +0000668 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
669 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +0000670 return NULL;
671 }
Guido van Rossumb82fedc2001-07-12 11:19:45 +0000672 /* Return a float. This works because we know that
673 this calls float_pow() which converts its
674 arguments to double. */
675 return PyFloat_Type.tp_as_number->nb_power(
676 (PyObject *)v, (PyObject *)w, (PyObject *)z);
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000677 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000678 if ((PyObject *)z != Py_None) {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000679 CONVERT_TO_LONG(z, iz);
Guido van Rossum9478dd41996-12-06 20:14:43 +0000680 if (iz == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000681 PyErr_SetString(PyExc_ValueError,
Tim Peters4c483c42001-09-05 06:24:58 +0000682 "pow() 3rd argument cannot be 0");
Guido van Rossum9478dd41996-12-06 20:14:43 +0000683 return NULL;
684 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000685 }
686 /*
687 * XXX: The original exponentiation code stopped looping
688 * when temp hit zero; this code will continue onwards
689 * unnecessarily, but at least it won't cause any errors.
690 * Hopefully the speed improvement from the fast exponentiation
691 * will compensate for the slight inefficiency.
692 * XXX: Better handling of overflows is desperately needed.
693 */
694 temp = iv;
695 ix = 1;
696 while (iw > 0) {
697 prev = ix; /* Save value for overflow check */
Tim Petersa3c01ce2001-12-04 23:05:10 +0000698 if (iw & 1) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000699 ix = ix*temp;
700 if (temp == 0)
701 break; /* Avoid ix / 0 */
Guido van Rossume27f7952001-08-23 02:59:04 +0000702 if (ix / temp != prev) {
Guido van Rossume27f7952001-08-23 02:59:04 +0000703 return PyLong_Type.tp_as_number->nb_power(
704 (PyObject *)v,
705 (PyObject *)w,
Tim Peters31960db2001-08-23 21:28:33 +0000706 (PyObject *)z);
Guido van Rossume27f7952001-08-23 02:59:04 +0000707 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000708 }
709 iw >>= 1; /* Shift exponent down by 1 bit */
710 if (iw==0) break;
711 prev = temp;
712 temp *= temp; /* Square the value of temp */
Tim Petersc8854432004-08-25 02:14:08 +0000713 if (prev != 0 && temp / prev != prev) {
Guido van Rossume27f7952001-08-23 02:59:04 +0000714 return PyLong_Type.tp_as_number->nb_power(
715 (PyObject *)v, (PyObject *)w, (PyObject *)z);
716 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000717 if (iz) {
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000718 /* If we did a multiplication, perform a modulo */
719 ix = ix % iz;
720 temp = temp % iz;
721 }
722 }
Guido van Rossum9478dd41996-12-06 20:14:43 +0000723 if (iz) {
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000724 long div, mod;
Guido van Rossume27f7952001-08-23 02:59:04 +0000725 switch (i_divmod(ix, iz, &div, &mod)) {
726 case DIVMOD_OK:
727 ix = mod;
728 break;
729 case DIVMOD_OVERFLOW:
730 return PyLong_Type.tp_as_number->nb_power(
731 (PyObject *)v, (PyObject *)w, (PyObject *)z);
732 default:
733 return NULL;
734 }
Guido van Rossumbf8c0e31994-08-29 12:48:32 +0000735 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000736 return PyInt_FromLong(ix);
Tim Petersa3c01ce2001-12-04 23:05:10 +0000737}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000738
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000739static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000740int_neg(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000741{
742 register long a, x;
743 a = v->ob_ival;
744 x = -a;
Guido van Rossume27f7952001-08-23 02:59:04 +0000745 if (a < 0 && x < 0) {
Tim Petersc8854432004-08-25 02:14:08 +0000746 PyObject *o = PyLong_FromLong(a);
Neal Norwitzfa56e2d2003-01-19 15:40:09 +0000747 if (o != NULL) {
748 PyObject *result = PyNumber_Negative(o);
749 Py_DECREF(o);
750 return result;
751 }
752 return NULL;
Guido van Rossume27f7952001-08-23 02:59:04 +0000753 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754 return PyInt_FromLong(x);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000755}
756
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000757static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000758int_pos(PyIntObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000759{
Tim Peters73a1dfe2001-09-11 21:44:14 +0000760 if (PyInt_CheckExact(v)) {
761 Py_INCREF(v);
762 return (PyObject *)v;
763 }
764 else
765 return PyInt_FromLong(v->ob_ival);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000766}
767
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000768static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000769int_abs(PyIntObject *v)
Guido van Rossum00466951991-05-05 20:08:27 +0000770{
771 if (v->ob_ival >= 0)
772 return int_pos(v);
773 else
774 return int_neg(v);
775}
776
Guido van Rossum0bff0151991-05-14 12:05:32 +0000777static int
Fred Drakea2f55112000-07-09 15:16:51 +0000778int_nonzero(PyIntObject *v)
Guido van Rossum0bff0151991-05-14 12:05:32 +0000779{
780 return v->ob_ival != 0;
781}
782
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000783static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000784int_invert(PyIntObject *v)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000785{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000786 return PyInt_FromLong(~v->ob_ival);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000787}
788
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000789static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000790int_lshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000791{
Guido van Rossum078151d2002-08-11 04:24:12 +0000792 long a, b, c;
Raymond Hettingera006c372004-06-26 23:22:57 +0000793 PyObject *vv, *ww, *result;
794
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000795 CONVERT_TO_LONG(v, a);
796 CONVERT_TO_LONG(w, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000797 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000799 return NULL;
800 }
Tim Peters73a1dfe2001-09-11 21:44:14 +0000801 if (a == 0 || b == 0)
802 return int_pos(v);
Guido van Rossum72481a31993-10-26 15:21:51 +0000803 if (b >= LONG_BIT) {
Raymond Hettingera006c372004-06-26 23:22:57 +0000804 vv = PyLong_FromLong(PyInt_AS_LONG(v));
805 if (vv == NULL)
806 return NULL;
807 ww = PyLong_FromLong(PyInt_AS_LONG(w));
808 if (ww == NULL) {
809 Py_DECREF(vv);
810 return NULL;
811 }
812 result = PyNumber_Lshift(vv, ww);
813 Py_DECREF(vv);
814 Py_DECREF(ww);
815 return result;
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000816 }
Tim Petersda1a2212002-08-11 17:54:42 +0000817 c = a << b;
818 if (a != Py_ARITHMETIC_RIGHT_SHIFT(long, c, b)) {
Raymond Hettingera006c372004-06-26 23:22:57 +0000819 vv = PyLong_FromLong(PyInt_AS_LONG(v));
820 if (vv == NULL)
821 return NULL;
822 ww = PyLong_FromLong(PyInt_AS_LONG(w));
823 if (ww == NULL) {
824 Py_DECREF(vv);
825 return NULL;
826 }
827 result = PyNumber_Lshift(vv, ww);
828 Py_DECREF(vv);
829 Py_DECREF(ww);
830 return result;
Guido van Rossum078151d2002-08-11 04:24:12 +0000831 }
832 return PyInt_FromLong(c);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000833}
834
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000835static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000836int_rshift(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000837{
838 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000839 CONVERT_TO_LONG(v, a);
840 CONVERT_TO_LONG(w, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000841 if (b < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000842 PyErr_SetString(PyExc_ValueError, "negative shift count");
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000843 return NULL;
844 }
Tim Peters73a1dfe2001-09-11 21:44:14 +0000845 if (a == 0 || b == 0)
846 return int_pos(v);
Guido van Rossum72481a31993-10-26 15:21:51 +0000847 if (b >= LONG_BIT) {
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000848 if (a < 0)
849 a = -1;
850 else
851 a = 0;
852 }
853 else {
Tim Peters7d3a5112000-07-08 04:17:21 +0000854 a = Py_ARITHMETIC_RIGHT_SHIFT(long, a, b);
Guido van Rossumf3b351f1992-01-14 18:33:22 +0000855 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856 return PyInt_FromLong(a);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000857}
858
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000859static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000860int_and(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000861{
862 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000863 CONVERT_TO_LONG(v, a);
864 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000865 return PyInt_FromLong(a & b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000866}
867
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000868static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000869int_xor(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000870{
871 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000872 CONVERT_TO_LONG(v, a);
873 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000874 return PyInt_FromLong(a ^ b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000875}
876
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000877static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000878int_or(PyIntObject *v, PyIntObject *w)
Guido van Rossum7928cd71991-10-24 14:59:31 +0000879{
880 register long a, b;
Neil Schemenauer139e72a2001-01-04 01:45:33 +0000881 CONVERT_TO_LONG(v, a);
882 CONVERT_TO_LONG(w, b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000883 return PyInt_FromLong(a | b);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000884}
885
Guido van Rossum1952e382001-09-19 01:25:16 +0000886static int
887int_coerce(PyObject **pv, PyObject **pw)
888{
889 if (PyInt_Check(*pw)) {
890 Py_INCREF(*pv);
891 Py_INCREF(*pw);
892 return 0;
893 }
894 return 1; /* Can't do it */
895}
896
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000897static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000898int_int(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000899{
Brett Cannonc3647ac2005-04-26 03:45:26 +0000900 if (PyInt_CheckExact(v))
901 Py_INCREF(v);
902 else
903 v = (PyIntObject *)PyInt_FromLong(v->ob_ival);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000904 return (PyObject *)v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000905}
906
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000907static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000908int_long(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000909{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000910 return PyLong_FromLong((v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000911}
912
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000913static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000914int_float(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000915{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916 return PyFloat_FromDouble((double)(v -> ob_ival));
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000917}
918
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000919static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000920int_oct(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000921{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000922 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000923 long x = v -> ob_ival;
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000924 if (x < 0)
925 PyOS_snprintf(buf, sizeof(buf), "-0%lo", -x);
926 else if (x == 0)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000927 strcpy(buf, "0");
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000928 else
Barry Warsaw61975092001-11-28 20:55:34 +0000929 PyOS_snprintf(buf, sizeof(buf), "0%lo", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000931}
932
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933static PyObject *
Fred Drakea2f55112000-07-09 15:16:51 +0000934int_hex(PyIntObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000935{
Guido van Rossum6f72f971997-01-14 15:43:41 +0000936 char buf[100];
Guido van Rossum9bfef441993-03-29 10:43:31 +0000937 long x = v -> ob_ival;
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000938 if (x < 0)
939 PyOS_snprintf(buf, sizeof(buf), "-0x%lx", -x);
940 else
941 PyOS_snprintf(buf, sizeof(buf), "0x%lx", x);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000942 return PyString_FromString(buf);
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000943}
944
Jeremy Hylton938ace62002-07-17 16:30:39 +0000945static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +0000946int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
947
Tim Peters6d6c1a32001-08-02 04:15:00 +0000948static PyObject *
949int_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
950{
951 PyObject *x = NULL;
952 int base = -909;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000953 static char *kwlist[] = {"x", "base", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000954
Guido van Rossumbef14172001-08-29 15:47:46 +0000955 if (type != &PyInt_Type)
956 return int_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000957 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
958 &x, &base))
959 return NULL;
960 if (x == NULL)
961 return PyInt_FromLong(0L);
962 if (base == -909)
963 return PyNumber_Int(x);
964 if (PyString_Check(x))
965 return PyInt_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000966#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000967 if (PyUnicode_Check(x))
968 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(x),
969 PyUnicode_GET_SIZE(x),
970 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000971#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000972 PyErr_SetString(PyExc_TypeError,
973 "int() can't convert non-string with explicit base");
974 return NULL;
975}
976
Guido van Rossumbef14172001-08-29 15:47:46 +0000977/* Wimpy, slow approach to tp_new calls for subtypes of int:
978 first create a regular int from whatever arguments we got,
979 then allocate a subtype instance and initialize its ob_ival
980 from the regular int. The regular int is then thrown away.
981*/
982static PyObject *
983int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
984{
985 PyObject *tmp, *new;
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000986 long ival;
Guido van Rossumbef14172001-08-29 15:47:46 +0000987
988 assert(PyType_IsSubtype(type, &PyInt_Type));
989 tmp = int_new(&PyInt_Type, args, kwds);
990 if (tmp == NULL)
991 return NULL;
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000992 if (!PyInt_Check(tmp)) {
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000993 ival = PyLong_AsLong(tmp);
Michael W. Hudson71665dc2003-08-11 17:32:02 +0000994 if (ival == -1 && PyErr_Occurred()) {
995 Py_DECREF(tmp);
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000996 return NULL;
Michael W. Hudson71665dc2003-08-11 17:32:02 +0000997 }
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000998 } else {
999 ival = ((PyIntObject *)tmp)->ob_ival;
1000 }
1001
Guido van Rossumd93dce12001-08-30 03:09:31 +00001002 new = type->tp_alloc(type, 0);
Raymond Hettingerf4667932003-06-28 20:04:25 +00001003 if (new == NULL) {
1004 Py_DECREF(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00001005 return NULL;
Raymond Hettingerf4667932003-06-28 20:04:25 +00001006 }
Neal Norwitzde8b94c2003-02-10 02:12:43 +00001007 ((PyIntObject *)new)->ob_ival = ival;
Guido van Rossumbef14172001-08-29 15:47:46 +00001008 Py_DECREF(tmp);
1009 return new;
1010}
1011
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001012static PyObject *
1013int_getnewargs(PyIntObject *v)
1014{
1015 return Py_BuildValue("(l)", v->ob_ival);
1016}
1017
1018static PyMethodDef int_methods[] = {
1019 {"__getnewargs__", (PyCFunction)int_getnewargs, METH_NOARGS},
1020 {NULL, NULL} /* sentinel */
1021};
1022
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001023PyDoc_STRVAR(int_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001024"int(x[, base]) -> integer\n\
1025\n\
1026Convert a string or number to an integer, if possible. A floating point\n\
1027argument will be truncated towards zero (this does not include a string\n\
1028representation of a floating point number!) When converting a string, use\n\
1029the optional base. It is an error to supply a base when converting a\n\
Walter Dörwaldf1715402002-11-19 20:49:15 +00001030non-string. If the argument is outside the integer range a long object\n\
1031will be returned instead.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001032
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033static PyNumberMethods int_as_number = {
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001034 (binaryfunc)int_add, /*nb_add*/
1035 (binaryfunc)int_sub, /*nb_subtract*/
1036 (binaryfunc)int_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00001037 (binaryfunc)int_classic_div, /*nb_divide*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001038 (binaryfunc)int_mod, /*nb_remainder*/
1039 (binaryfunc)int_divmod, /*nb_divmod*/
1040 (ternaryfunc)int_pow, /*nb_power*/
1041 (unaryfunc)int_neg, /*nb_negative*/
1042 (unaryfunc)int_pos, /*nb_positive*/
1043 (unaryfunc)int_abs, /*nb_absolute*/
1044 (inquiry)int_nonzero, /*nb_nonzero*/
1045 (unaryfunc)int_invert, /*nb_invert*/
1046 (binaryfunc)int_lshift, /*nb_lshift*/
1047 (binaryfunc)int_rshift, /*nb_rshift*/
1048 (binaryfunc)int_and, /*nb_and*/
1049 (binaryfunc)int_xor, /*nb_xor*/
1050 (binaryfunc)int_or, /*nb_or*/
Guido van Rossum1952e382001-09-19 01:25:16 +00001051 int_coerce, /*nb_coerce*/
Neil Schemenauer139e72a2001-01-04 01:45:33 +00001052 (unaryfunc)int_int, /*nb_int*/
1053 (unaryfunc)int_long, /*nb_long*/
1054 (unaryfunc)int_float, /*nb_float*/
1055 (unaryfunc)int_oct, /*nb_oct*/
1056 (unaryfunc)int_hex, /*nb_hex*/
1057 0, /*nb_inplace_add*/
1058 0, /*nb_inplace_subtract*/
1059 0, /*nb_inplace_multiply*/
1060 0, /*nb_inplace_divide*/
1061 0, /*nb_inplace_remainder*/
1062 0, /*nb_inplace_power*/
1063 0, /*nb_inplace_lshift*/
1064 0, /*nb_inplace_rshift*/
1065 0, /*nb_inplace_and*/
1066 0, /*nb_inplace_xor*/
1067 0, /*nb_inplace_or*/
Guido van Rossum4668b002001-08-08 05:00:18 +00001068 (binaryfunc)int_div, /* nb_floor_divide */
1069 int_true_divide, /* nb_true_divide */
1070 0, /* nb_inplace_floor_divide */
1071 0, /* nb_inplace_true_divide */
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001072 (lenfunc)PyInt_AsSsize_t, /* nb_index */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001073};
1074
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001075PyTypeObject PyInt_Type = {
1076 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001077 0,
1078 "int",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001079 sizeof(PyIntObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001080 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001081 (destructor)int_dealloc, /* tp_dealloc */
1082 (printfunc)int_print, /* tp_print */
1083 0, /* tp_getattr */
1084 0, /* tp_setattr */
1085 (cmpfunc)int_compare, /* tp_compare */
1086 (reprfunc)int_repr, /* tp_repr */
1087 &int_as_number, /* tp_as_number */
1088 0, /* tp_as_sequence */
1089 0, /* tp_as_mapping */
1090 (hashfunc)int_hash, /* tp_hash */
1091 0, /* tp_call */
Guido van Rossume75bfde2002-02-01 15:34:10 +00001092 (reprfunc)int_repr, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001093 PyObject_GenericGetAttr, /* tp_getattro */
1094 0, /* tp_setattro */
1095 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00001096 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
1097 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001098 int_doc, /* tp_doc */
1099 0, /* tp_traverse */
1100 0, /* tp_clear */
1101 0, /* tp_richcompare */
1102 0, /* tp_weaklistoffset */
1103 0, /* tp_iter */
1104 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00001105 int_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001106 0, /* tp_members */
1107 0, /* tp_getset */
1108 0, /* tp_base */
1109 0, /* tp_dict */
1110 0, /* tp_descr_get */
1111 0, /* tp_descr_set */
1112 0, /* tp_dictoffset */
1113 0, /* tp_init */
1114 0, /* tp_alloc */
1115 int_new, /* tp_new */
Guido van Rossum93646982002-04-26 00:53:34 +00001116 (freefunc)int_free, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001117};
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001118
Neal Norwitzc91ed402002-12-30 22:29:22 +00001119int
Neal Norwitzb2501f42002-12-31 03:42:13 +00001120_PyInt_Init(void)
Neal Norwitzc91ed402002-12-30 22:29:22 +00001121{
1122 PyIntObject *v;
1123 int ival;
1124#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1125 for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++) {
Raymond Hettingerb32e6402004-02-08 18:54:37 +00001126 if (!free_list && (free_list = fill_free_list()) == NULL)
Neal Norwitzc91ed402002-12-30 22:29:22 +00001127 return 0;
1128 /* PyObject_New is inlined */
1129 v = free_list;
1130 free_list = (PyIntObject *)v->ob_type;
1131 PyObject_INIT(v, &PyInt_Type);
1132 v->ob_ival = ival;
1133 small_ints[ival + NSMALLNEGINTS] = v;
1134 }
1135#endif
1136 return 1;
1137}
1138
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001139void
Fred Drakea2f55112000-07-09 15:16:51 +00001140PyInt_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001141{
Guido van Rossum3fce8831999-03-12 19:43:17 +00001142 PyIntObject *p;
1143 PyIntBlock *list, *next;
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001144 int i;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001145 int bc, bf; /* block count, number of freed blocks */
1146 int irem, isum; /* remaining unfreed ints per block, total */
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001147
Guido van Rossumda084ed1999-03-10 22:55:24 +00001148#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1149 PyIntObject **q;
1150
1151 i = NSMALLNEGINTS + NSMALLPOSINTS;
1152 q = small_ints;
1153 while (--i >= 0) {
1154 Py_XDECREF(*q);
1155 *q++ = NULL;
1156 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001157#endif
Guido van Rossumda084ed1999-03-10 22:55:24 +00001158 bc = 0;
1159 bf = 0;
1160 isum = 0;
1161 list = block_list;
1162 block_list = NULL;
Guido van Rossum51288bc1999-03-19 20:30:39 +00001163 free_list = NULL;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001164 while (list != NULL) {
Guido van Rossumda084ed1999-03-10 22:55:24 +00001165 bc++;
1166 irem = 0;
Guido van Rossum51288bc1999-03-19 20:30:39 +00001167 for (i = 0, p = &list->objects[0];
1168 i < N_INTOBJECTS;
1169 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001170 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
Guido van Rossumda084ed1999-03-10 22:55:24 +00001171 irem++;
1172 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00001173 next = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001174 if (irem) {
Guido van Rossum3fce8831999-03-12 19:43:17 +00001175 list->next = block_list;
1176 block_list = list;
Guido van Rossum51288bc1999-03-19 20:30:39 +00001177 for (i = 0, p = &list->objects[0];
1178 i < N_INTOBJECTS;
1179 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001180 if (!PyInt_CheckExact(p) ||
Guido van Rossumbef14172001-08-29 15:47:46 +00001181 p->ob_refcnt == 0) {
Guido van Rossum51288bc1999-03-19 20:30:39 +00001182 p->ob_type = (struct _typeobject *)
1183 free_list;
1184 free_list = p;
1185 }
1186#if NSMALLNEGINTS + NSMALLPOSINTS > 0
1187 else if (-NSMALLNEGINTS <= p->ob_ival &&
1188 p->ob_ival < NSMALLPOSINTS &&
1189 small_ints[p->ob_ival +
1190 NSMALLNEGINTS] == NULL) {
1191 Py_INCREF(p);
1192 small_ints[p->ob_ival +
1193 NSMALLNEGINTS] = p;
1194 }
1195#endif
1196 }
Guido van Rossumda084ed1999-03-10 22:55:24 +00001197 }
1198 else {
Tim Peters29c0afc2002-04-28 16:57:34 +00001199 PyMem_FREE(list);
Guido van Rossumda084ed1999-03-10 22:55:24 +00001200 bf++;
1201 }
1202 isum += irem;
Guido van Rossum3fce8831999-03-12 19:43:17 +00001203 list = next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001204 }
Guido van Rossum3fce8831999-03-12 19:43:17 +00001205 if (!Py_VerboseFlag)
1206 return;
1207 fprintf(stderr, "# cleanup ints");
1208 if (!isum) {
1209 fprintf(stderr, "\n");
1210 }
1211 else {
1212 fprintf(stderr,
1213 ": %d unfreed int%s in %d out of %d block%s\n",
1214 isum, isum == 1 ? "" : "s",
1215 bc - bf, bc, bc == 1 ? "" : "s");
1216 }
1217 if (Py_VerboseFlag > 1) {
1218 list = block_list;
1219 while (list != NULL) {
Guido van Rossum51288bc1999-03-19 20:30:39 +00001220 for (i = 0, p = &list->objects[0];
1221 i < N_INTOBJECTS;
1222 i++, p++) {
Guido van Rossumdea6ef92001-09-11 16:13:52 +00001223 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
Thomas Wouters8b87a0b2006-03-01 05:41:20 +00001224 /* XXX(twouters) cast refcount to
1225 long until %zd is universally
1226 available
1227 */
Guido van Rossum3fce8831999-03-12 19:43:17 +00001228 fprintf(stderr,
Thomas Wouters8b87a0b2006-03-01 05:41:20 +00001229 "# <int at %p, refcnt=%ld, val=%ld>\n",
1230 p, (long)p->ob_refcnt,
1231 p->ob_ival);
Guido van Rossum3fce8831999-03-12 19:43:17 +00001232 }
1233 list = list->next;
Guido van Rossumda084ed1999-03-10 22:55:24 +00001234 }
1235 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +00001236}