annotate Objects/intobject.c @ 22360:c8a6ea00a9e1 legacy-trunk

restructure a bit to not rely on test case execution ordering add test case for bug #482460
author Skip Montanaro <skip@pobox.com>
date Sun, 17 Mar 2002 23:03:42 +0000
parents d521cf0899c8
children 3eddd9d68af7 aa8d59823add
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
1
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Integer object implementation */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
4 #include "Python.h"
11383
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
5 #include <ctype.h>
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
1448
328f446d2016 Added getmaxint() so sys can initialize sys.maxint.
Guido van Rossum <guido@python.org>
parents: 1413
diff changeset
7 long
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
8 PyInt_GetMax(void)
1448
328f446d2016 Added getmaxint() so sys can initialize sys.maxint.
Guido van Rossum <guido@python.org>
parents: 1413
diff changeset
9 {
328f446d2016 Added getmaxint() so sys can initialize sys.maxint.
Guido van Rossum <guido@python.org>
parents: 1413
diff changeset
10 return LONG_MAX; /* To initialize sys.maxint */
328f446d2016 Added getmaxint() so sys can initialize sys.maxint.
Guido van Rossum <guido@python.org>
parents: 1413
diff changeset
11 }
328f446d2016 Added getmaxint() so sys can initialize sys.maxint.
Guido van Rossum <guido@python.org>
parents: 1413
diff changeset
12
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 /* Standard Booleans */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
14
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
15 PyIntObject _Py_ZeroStruct = {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
16 PyObject_HEAD_INIT(&PyInt_Type)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 0
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 };
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
19
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
20 PyIntObject _Py_TrueStruct = {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
21 PyObject_HEAD_INIT(&PyInt_Type)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 1
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 };
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
25 /* Return 1 if exception raised, 0 if caller should retry using longs */
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
26 static int
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
27 err_ovf(char *msg)
11
bcea6c822906 New error handling.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
28 {
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
29 if (PyErr_Warn(PyExc_OverflowWarning, msg) < 0) {
19455
25b9b634d9e3 err_ovf(): only raise OverflowError when OverflowWarning was raised.
Guido van Rossum <guido@python.org>
parents: 19454
diff changeset
30 if (PyErr_ExceptionMatches(PyExc_OverflowWarning))
25b9b634d9e3 err_ovf(): only raise OverflowError when OverflowWarning was raised.
Guido van Rossum <guido@python.org>
parents: 19454
diff changeset
31 PyErr_SetString(PyExc_OverflowError, msg);
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
32 return 1;
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
33 }
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
34 else
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
35 return 0;
11
bcea6c822906 New error handling.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
36 }
bcea6c822906 New error handling.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
37
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
38 /* Integers are quite normal objects, to make object handling uniform.
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
39 (Using odd pointers to represent integers would save much space
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
40 but require extra checks for this special case throughout the code.)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
41 Since, a typical Python program spends much of its time allocating
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
42 and deallocating integers, these operations should be very fast.
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
43 Therefore we use a dedicated allocation scheme with a much lower
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
44 overhead (in space and time) than straight malloc(): a simple
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
45 dedicated free list, filled when necessary with memory from malloc().
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
46 */
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
47
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
48 #define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
49 #define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
50 #define N_INTOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyIntObject))
10373
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
51
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
52 struct _intblock {
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
53 struct _intblock *next;
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
54 PyIntObject objects[N_INTOBJECTS];
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
55 };
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
56
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
57 typedef struct _intblock PyIntBlock;
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
58
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
59 static PyIntBlock *block_list = NULL;
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
60 static PyIntObject *free_list = NULL;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
61
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
62 static PyIntObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
63 fill_free_list(void)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
64 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
65 PyIntObject *p, *q;
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12248
diff changeset
66 /* XXX Int blocks escape the object heap. Use PyObject_MALLOC ??? */
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12248
diff changeset
67 p = (PyIntObject *) PyMem_MALLOC(sizeof(PyIntBlock));
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
68 if (p == NULL)
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12248
diff changeset
69 return (PyIntObject *) PyErr_NoMemory();
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
70 ((PyIntBlock *)p)->next = block_list;
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
71 block_list = (PyIntBlock *)p;
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
72 p = &((PyIntBlock *)p)->objects[0];
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
73 q = p + N_INTOBJECTS;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
74 while (--q > p)
10373
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
75 q->ob_type = (struct _typeobject *)(q-1);
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
76 q->ob_type = NULL;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
77 return p + N_INTOBJECTS - 1;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
78 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
79
1352
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
80 #ifndef NSMALLPOSINTS
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
81 #define NSMALLPOSINTS 100
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
82 #endif
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
83 #ifndef NSMALLNEGINTS
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
84 #define NSMALLNEGINTS 1
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
85 #endif
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
86 #if NSMALLNEGINTS + NSMALLPOSINTS > 0
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
87 /* References to small integers are saved in this array so that they
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
88 can be shared.
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
89 The integers that are saved are those in the range
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
90 -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
91 */
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
92 static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
1352
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
93 #endif
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
94 #ifdef COUNT_ALLOCS
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
95 int quick_int_allocs, quick_neg_int_allocs;
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
96 #endif
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
97
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
98 PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
99 PyInt_FromLong(long ival)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
101 register PyIntObject *v;
1352
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
102 #if NSMALLNEGINTS + NSMALLPOSINTS > 0
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
103 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS &&
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
104 (v = small_ints[ival + NSMALLNEGINTS]) != NULL) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
105 Py_INCREF(v);
1352
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
106 #ifdef COUNT_ALLOCS
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
107 if (ival >= 0)
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
108 quick_int_allocs++;
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
109 else
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
110 quick_neg_int_allocs++;
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
111 #endif
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
112 return (PyObject *) v;
1352
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
113 }
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
114 #endif
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
115 if (free_list == NULL) {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
116 if ((free_list = fill_free_list()) == NULL)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
117 return NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 }
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12248
diff changeset
119 /* PyObject_New is inlined */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
120 v = free_list;
10373
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
121 free_list = (PyIntObject *)v->ob_type;
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12248
diff changeset
122 PyObject_INIT(v, &PyInt_Type);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
123 v->ob_ival = ival;
1352
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
124 #if NSMALLNEGINTS + NSMALLPOSINTS > 0
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
125 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
126 /* save this one for a following allocation */
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
127 Py_INCREF(v);
1352
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
128 small_ints[ival + NSMALLNEGINTS] = v;
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
129 }
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
130 #endif
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
131 return (PyObject *) v;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
132 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
133
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
134 static void
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
135 int_dealloc(PyIntObject *v)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
136 {
19865
f2a3009b528e Replace a few places where X->ob_type was compared to &PyXXX_Type with
Guido van Rossum <guido@python.org>
parents: 19719
diff changeset
137 if (PyInt_CheckExact(v)) {
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
138 v->ob_type = (struct _typeobject *)free_list;
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
139 free_list = v;
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
140 }
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
141 else
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
142 v->ob_type->tp_free((PyObject *)v);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 long
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
146 PyInt_AsLong(register PyObject *op)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
148 PyNumberMethods *nb;
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
149 PyIntObject *io;
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
150 long val;
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
151
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
152 if (op && PyInt_Check(op))
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
153 return PyInt_AS_LONG((PyIntObject*) op);
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
154
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
155 if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
156 nb->nb_int == NULL) {
12630
57d4fc8308e3 Replace PyErr_BadArgument() error in PyInt_AsLong() with "an integer
Guido van Rossum <guido@python.org>
parents: 12576
diff changeset
157 PyErr_SetString(PyExc_TypeError, "an integer is required");
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 return -1;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 }
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
160
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
161 io = (PyIntObject*) (*nb->nb_int) (op);
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
162 if (io == NULL)
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
163 return -1;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
164 if (!PyInt_Check(io)) {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
165 PyErr_SetString(PyExc_TypeError,
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
166 "nb_int should return int object");
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
167 return -1;
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
168 }
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
169
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
170 val = PyInt_AS_LONG(io);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
171 Py_DECREF(io);
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
172
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
173 return val;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
175
11383
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
176 PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
177 PyInt_FromString(char *s, char **pend, int base)
11383
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
178 {
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
179 char *end;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
180 long x;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
181 char buffer[256]; /* For errors */
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
182
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
183 if ((base != 0 && base < 2) || base > 36) {
15318
8aa947e1eee8 Ka-Ping Yee <ping@lfw.org>:
Fred Drake <fdrake@acm.org>
parents: 15041
diff changeset
184 PyErr_SetString(PyExc_ValueError, "int() base must be >= 2 and <= 36");
11383
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
185 return NULL;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
186 }
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
187
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
188 while (*s && isspace(Py_CHARMASK(*s)))
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
189 s++;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
190 errno = 0;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
191 if (base == 0 && s[0] == '0')
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
192 x = (long) PyOS_strtoul(s, &end, base);
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
193 else
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
194 x = PyOS_strtol(s, &end, base);
16997
86fd723f2928 Use Py_CHARMASK for ctype macros. Fixes bug #232787.
Martin v. Löwis <martin@v.loewis.de>
parents: 15945
diff changeset
195 if (end == s || !isalnum(Py_CHARMASK(end[-1])))
11383
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
196 goto bad;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
197 while (*end && isspace(Py_CHARMASK(*end)))
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
198 end++;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
199 if (*end != '\0') {
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
200 bad:
21080
5b459677fc44 PyInt_FromString(), int_repr(), int_oct(), int_hex(): Conversion of
Barry Warsaw <barry@python.org>
parents: 19976
diff changeset
201 PyOS_snprintf(buffer, sizeof(buffer),
5b459677fc44 PyInt_FromString(), int_repr(), int_oct(), int_hex(): Conversion of
Barry Warsaw <barry@python.org>
parents: 19976
diff changeset
202 "invalid literal for int(): %.200s", s);
11383
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
203 PyErr_SetString(PyExc_ValueError, buffer);
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
204 return NULL;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
205 }
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
206 else if (errno != 0) {
21080
5b459677fc44 PyInt_FromString(), int_repr(), int_oct(), int_hex(): Conversion of
Barry Warsaw <barry@python.org>
parents: 19976
diff changeset
207 PyOS_snprintf(buffer, sizeof(buffer),
5b459677fc44 PyInt_FromString(), int_repr(), int_oct(), int_hex(): Conversion of
Barry Warsaw <barry@python.org>
parents: 19976
diff changeset
208 "int() literal too large: %.200s", s);
11383
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
209 PyErr_SetString(PyExc_ValueError, buffer);
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
210 return NULL;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
211 }
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
212 if (pend)
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
213 *pend = end;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
214 return PyInt_FromLong(x);
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
215 }
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
216
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19051
diff changeset
217 #ifdef Py_USING_UNICODE
12248
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
218 PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
219 PyInt_FromUnicode(Py_UNICODE *s, int length, int base)
12248
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
220 {
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
221 char buffer[256];
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
222
12248
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
223 if (length >= sizeof(buffer)) {
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
224 PyErr_SetString(PyExc_ValueError,
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
225 "int() literal too large to convert");
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
226 return NULL;
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
227 }
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
228 if (PyUnicode_EncodeDecimal(s, length, buffer, NULL))
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
229 return NULL;
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
230 return PyInt_FromString(buffer, NULL, base);
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
231 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19051
diff changeset
232 #endif
12248
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
233
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 /* Methods */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
235
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
236 /* Integers are seen as the "smallest" of all numeric types and thus
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
237 don't have any knowledge about conversion of other types to
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
238 integers. */
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
239
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
240 #define CONVERT_TO_LONG(obj, lng) \
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
241 if (PyInt_Check(obj)) { \
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
242 lng = PyInt_AS_LONG(obj); \
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
243 } \
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
244 else { \
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
245 Py_INCREF(Py_NotImplemented); \
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
246 return Py_NotImplemented; \
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
247 }
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
248
750
a5e6881cebf0 lint fix
Guido van Rossum <guido@python.org>
parents: 610
diff changeset
249 /* ARGSUSED */
284
6ac402023cac printobject now returns an error code
Guido van Rossum <guido@python.org>
parents: 240
diff changeset
250 static int
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
251 int_print(PyIntObject *v, FILE *fp, int flags)
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
252 /* flags -- not used but required by interface */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 fprintf(fp, "%ld", v->ob_ival);
284
6ac402023cac printobject now returns an error code
Guido van Rossum <guido@python.org>
parents: 240
diff changeset
255 return 0;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
256 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
257
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
258 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
259 int_repr(PyIntObject *v)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
260 {
21124
21bb4c4b7e26 SF bug #487743: test_builtin fails on 64 bit platform.
Tim Peters <tim.peters@gmail.com>
parents: 21080
diff changeset
261 char buf[64];
21080
5b459677fc44 PyInt_FromString(), int_repr(), int_oct(), int_hex(): Conversion of
Barry Warsaw <barry@python.org>
parents: 19976
diff changeset
262 PyOS_snprintf(buf, sizeof(buf), "%ld", v->ob_ival);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
263 return PyString_FromString(buf);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
264 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
265
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 static int
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
267 int_compare(PyIntObject *v, PyIntObject *w)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
268 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
269 register long i = v->ob_ival;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 register long j = w->ob_ival;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
271 return (i < j) ? -1 : (i > j) ? 1 : 0;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
272 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
273
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
274 static long
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
275 int_hash(PyIntObject *v)
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
276 {
4903
6a629d278a18 Fix overflow test for multiply to catch some cases it missed.
Guido van Rossum <guido@python.org>
parents: 4606
diff changeset
277 /* XXX If this is changed, you also need to change the way
6a629d278a18 Fix overflow test for multiply to catch some cases it missed.
Guido van Rossum <guido@python.org>
parents: 4606
diff changeset
278 Python's long, float and complex types are hashed. */
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
279 long x = v -> ob_ival;
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
280 if (x == -1)
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
281 x = -2;
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
282 return x;
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
283 }
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
284
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
285 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
286 int_add(PyIntObject *v, PyIntObject *w)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
287 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
288 register long a, b, x;
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
289 CONVERT_TO_LONG(v, a);
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
290 CONVERT_TO_LONG(w, b);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
291 x = a + b;
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
292 if ((x^a) >= 0 || (x^b) >= 0)
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
293 return PyInt_FromLong(x);
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
294 if (err_ovf("integer addition"))
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
295 return NULL;
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
296 return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
297 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
298
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
299 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
300 int_sub(PyIntObject *v, PyIntObject *w)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
301 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
302 register long a, b, x;
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
303 CONVERT_TO_LONG(v, a);
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
304 CONVERT_TO_LONG(w, b);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
305 x = a - b;
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
306 if ((x^a) >= 0 || (x^~b) >= 0)
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
307 return PyInt_FromLong(x);
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
308 if (err_ovf("integer subtraction"))
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
309 return NULL;
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
310 return PyLong_Type.tp_as_number->nb_subtract((PyObject *)v,
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
311 (PyObject *)w);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
312 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
313
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
314 /*
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
315 Integer overflow checking for * is painful: Python tried a couple ways, but
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
316 they didn't work on all platforms, or failed in endcases (a product of
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
317 -sys.maxint-1 has been a particular pain).
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
318
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
319 Here's another way:
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
320
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
321 The native long product x*y is either exactly right or *way* off, being
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
322 just the last n bits of the true product, where n is the number of bits
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
323 in a long (the delivered product is the true product plus i*2**n for
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
324 some integer i).
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
325
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
326 The native double product (double)x * (double)y is subject to three
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
327 rounding errors: on a sizeof(long)==8 box, each cast to double can lose
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
328 info, and even on a sizeof(long)==4 box, the multiplication can lose info.
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
329 But, unlike the native long product, it's not in *range* trouble: even
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
330 if sizeof(long)==32 (256-bit longs), the product easily fits in the
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
331 dynamic range of a double. So the leading 50 (or so) bits of the double
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
332 product are correct.
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
333
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
334 We check these two ways against each other, and declare victory if they're
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
335 approximately the same. Else, because the native long product is the only
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
336 one that can lose catastrophic amounts of information, it's the native long
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
337 product that must have overflowed.
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
338 */
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
339
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
340 static PyObject *
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
341 int_mul(PyObject *v, PyObject *w)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
342 {
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
343 long a, b;
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
344 long longprod; /* a*b in native long arithmetic */
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
345 double doubled_longprod; /* (double)longprod */
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
346 double doubleprod; /* (double)a * (double)b */
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
347
19925
df409844b659 A fix for SF bug #461546 (bug in long_mul).
Guido van Rossum <guido@python.org>
parents: 19878
diff changeset
348 if (!PyInt_Check(v) &&
df409844b659 A fix for SF bug #461546 (bug in long_mul).
Guido van Rossum <guido@python.org>
parents: 19878
diff changeset
349 v->ob_type->tp_as_sequence &&
df409844b659 A fix for SF bug #461546 (bug in long_mul).
Guido van Rossum <guido@python.org>
parents: 19878
diff changeset
350 v->ob_type->tp_as_sequence->sq_repeat) {
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
351 /* sequence * int */
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
352 a = PyInt_AsLong(w);
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
353 return (*v->ob_type->tp_as_sequence->sq_repeat)(v, a);
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
354 }
19925
df409844b659 A fix for SF bug #461546 (bug in long_mul).
Guido van Rossum <guido@python.org>
parents: 19878
diff changeset
355 if (!PyInt_Check(w) &&
df409844b659 A fix for SF bug #461546 (bug in long_mul).
Guido van Rossum <guido@python.org>
parents: 19878
diff changeset
356 w->ob_type->tp_as_sequence &&
df409844b659 A fix for SF bug #461546 (bug in long_mul).
Guido van Rossum <guido@python.org>
parents: 19878
diff changeset
357 w->ob_type->tp_as_sequence->sq_repeat) {
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
358 /* int * sequence */
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
359 a = PyInt_AsLong(v);
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
360 return (*w->ob_type->tp_as_sequence->sq_repeat)(w, a);
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
361 }
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
362
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
363 CONVERT_TO_LONG(v, a);
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
364 CONVERT_TO_LONG(w, b);
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
365 longprod = a * b;
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
366 doubleprod = (double)a * (double)b;
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
367 doubled_longprod = (double)longprod;
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
368
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
369 /* Fast path for normal case: small multiplicands, and no info
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
370 is lost in either method. */
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
371 if (doubled_longprod == doubleprod)
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
372 return PyInt_FromLong(longprod);
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
373
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
374 /* Somebody somewhere lost info. Close enough, or way off? Note
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
375 that a != 0 and b != 0 (else doubled_longprod == doubleprod == 0).
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
376 The difference either is or isn't significant compared to the
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
377 true value (of which doubleprod is a good approximation).
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
378 */
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
379 {
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
380 const double diff = doubled_longprod - doubleprod;
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
381 const double absdiff = diff >= 0.0 ? diff : -diff;
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
382 const double absprod = doubleprod >= 0.0 ? doubleprod :
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
383 -doubleprod;
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
384 /* absdiff/absprod <= 1/32 iff
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
385 32 * absdiff <= absprod -- 5 good bits is "close enough" */
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
386 if (32.0 * absdiff <= absprod)
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
387 return PyInt_FromLong(longprod);
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
388 else if (err_ovf("integer multiplication"))
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
389 return NULL;
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
390 else
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
391 return PyLong_Type.tp_as_number->nb_multiply(v, w);
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
392 }
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
393 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
394
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
395 /* Return type of i_divmod */
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
396 enum divmod_result {
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
397 DIVMOD_OK, /* Correct result */
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
398 DIVMOD_OVERFLOW, /* Overflow, try again using longs */
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
399 DIVMOD_ERROR /* Exception raised */
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
400 };
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
401
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
402 static enum divmod_result
18146
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
403 i_divmod(register long x, register long y,
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
404 long *p_xdivy, long *p_xmody)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
405 {
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
406 long xdivy, xmody;
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
407
18146
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
408 if (y == 0) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
409 PyErr_SetString(PyExc_ZeroDivisionError,
15318
8aa947e1eee8 Ka-Ping Yee <ping@lfw.org>:
Fred Drake <fdrake@acm.org>
parents: 15041
diff changeset
410 "integer division or modulo by zero");
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
411 return DIVMOD_ERROR;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
412 }
18146
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
413 /* (-sys.maxint-1)/-1 is the only overflow case. */
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
414 if (y == -1 && x < 0 && x == -x) {
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
415 if (err_ovf("integer division"))
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
416 return DIVMOD_ERROR;
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
417 return DIVMOD_OVERFLOW;
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
418 }
18146
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
419 xdivy = x / y;
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
420 xmody = x - xdivy * y;
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
421 /* If the signs of x and y differ, and the remainder is non-0,
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
422 * C89 doesn't define whether xdivy is now the floor or the
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
423 * ceiling of the infinitely precise quotient. We want the floor,
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
424 * and we have it iff the remainder's sign matches y's.
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
425 */
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
426 if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) {
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
427 xmody += y;
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
428 --xdivy;
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
429 assert(xmody && ((y ^ xmody) >= 0));
229
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
430 }
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
431 *p_xdivy = xdivy;
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
432 *p_xmody = xmody;
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
433 return DIVMOD_OK;
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
434 }
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
435
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
436 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
437 int_div(PyIntObject *x, PyIntObject *y)
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
438 {
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
439 long xi, yi;
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
440 long d, m;
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
441 CONVERT_TO_LONG(x, xi);
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
442 CONVERT_TO_LONG(y, yi);
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
443 switch (i_divmod(xi, yi, &d, &m)) {
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
444 case DIVMOD_OK:
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
445 return PyInt_FromLong(d);
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
446 case DIVMOD_OVERFLOW:
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
447 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
448 (PyObject *)y);
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
449 default:
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
450 return NULL;
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
451 }
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
452 }
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
453
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
454 static PyObject *
19633
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
455 int_classic_div(PyIntObject *x, PyIntObject *y)
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
456 {
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
457 long xi, yi;
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
458 long d, m;
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
459 CONVERT_TO_LONG(x, xi);
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
460 CONVERT_TO_LONG(y, yi);
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
461 if (Py_DivisionWarningFlag &&
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
462 PyErr_Warn(PyExc_DeprecationWarning, "classic int division") < 0)
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
463 return NULL;
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
464 switch (i_divmod(xi, yi, &d, &m)) {
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
465 case DIVMOD_OK:
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
466 return PyInt_FromLong(d);
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
467 case DIVMOD_OVERFLOW:
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
468 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x,
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
469 (PyObject *)y);
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
470 default:
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
471 return NULL;
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
472 }
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
473 }
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
474
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
475 static PyObject *
19676
c768d3191df1 Move int_true_divide next to the other division routines.
Tim Peters <tim.peters@gmail.com>
parents: 19666
diff changeset
476 int_true_divide(PyObject *v, PyObject *w)
c768d3191df1 Move int_true_divide next to the other division routines.
Tim Peters <tim.peters@gmail.com>
parents: 19666
diff changeset
477 {
19677
91533675d6cb Change long/long true division to return as many good bits as it can;
Tim Peters <tim.peters@gmail.com>
parents: 19676
diff changeset
478 /* If they aren't both ints, give someone else a chance. In
91533675d6cb Change long/long true division to return as many good bits as it can;
Tim Peters <tim.peters@gmail.com>
parents: 19676
diff changeset
479 particular, this lets int/long get handled by longs, which
91533675d6cb Change long/long true division to return as many good bits as it can;
Tim Peters <tim.peters@gmail.com>
parents: 19676
diff changeset
480 underflows to 0 gracefully if the long is too big to convert
91533675d6cb Change long/long true division to return as many good bits as it can;
Tim Peters <tim.peters@gmail.com>
parents: 19676
diff changeset
481 to float. */
91533675d6cb Change long/long true division to return as many good bits as it can;
Tim Peters <tim.peters@gmail.com>
parents: 19676
diff changeset
482 if (PyInt_Check(v) && PyInt_Check(w))
91533675d6cb Change long/long true division to return as many good bits as it can;
Tim Peters <tim.peters@gmail.com>
parents: 19676
diff changeset
483 return PyFloat_Type.tp_as_number->nb_true_divide(v, w);
91533675d6cb Change long/long true division to return as many good bits as it can;
Tim Peters <tim.peters@gmail.com>
parents: 19676
diff changeset
484 Py_INCREF(Py_NotImplemented);
91533675d6cb Change long/long true division to return as many good bits as it can;
Tim Peters <tim.peters@gmail.com>
parents: 19676
diff changeset
485 return Py_NotImplemented;
19676
c768d3191df1 Move int_true_divide next to the other division routines.
Tim Peters <tim.peters@gmail.com>
parents: 19666
diff changeset
486 }
c768d3191df1 Move int_true_divide next to the other division routines.
Tim Peters <tim.peters@gmail.com>
parents: 19666
diff changeset
487
c768d3191df1 Move int_true_divide next to the other division routines.
Tim Peters <tim.peters@gmail.com>
parents: 19666
diff changeset
488 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
489 int_mod(PyIntObject *x, PyIntObject *y)
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
490 {
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
491 long xi, yi;
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
492 long d, m;
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
493 CONVERT_TO_LONG(x, xi);
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
494 CONVERT_TO_LONG(y, yi);
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
495 switch (i_divmod(xi, yi, &d, &m)) {
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
496 case DIVMOD_OK:
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
497 return PyInt_FromLong(m);
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
498 case DIVMOD_OVERFLOW:
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
499 return PyLong_Type.tp_as_number->nb_remainder((PyObject *)x,
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
500 (PyObject *)y);
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
501 default:
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
502 return NULL;
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
503 }
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
504 }
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
505
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
506 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
507 int_divmod(PyIntObject *x, PyIntObject *y)
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
508 {
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
509 long xi, yi;
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
510 long d, m;
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
511 CONVERT_TO_LONG(x, xi);
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
512 CONVERT_TO_LONG(y, yi);
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
513 switch (i_divmod(xi, yi, &d, &m)) {
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
514 case DIVMOD_OK:
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
515 return Py_BuildValue("(ll)", d, m);
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
516 case DIVMOD_OVERFLOW:
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
517 return PyLong_Type.tp_as_number->nb_divmod((PyObject *)x,
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
518 (PyObject *)y);
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
519 default:
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
520 return NULL;
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
521 }
229
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
522 }
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
523
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
524 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
525 int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
526 {
4606
739b8480f1ac Fix core dump from pow(x,y,0).
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
527 register long iv, iw, iz=0, ix, temp, prev;
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
528 CONVERT_TO_LONG(v, iv);
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
529 CONVERT_TO_LONG(w, iw);
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
530 if (iw < 0) {
19666
cf65ebf87560 New restriction on pow(x, y, z): If z is not None, x and y must be of
Tim Peters <tim.peters@gmail.com>
parents: 19633
diff changeset
531 if ((PyObject *)z != Py_None) {
19719
cdfdd5359411 Make the error msgs in our pow() implementations consistent.
Tim Peters <tim.peters@gmail.com>
parents: 19677
diff changeset
532 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
cdfdd5359411 Make the error msgs in our pow() implementations consistent.
Tim Peters <tim.peters@gmail.com>
parents: 19677
diff changeset
533 "cannot be negative when 3rd argument specified");
19666
cf65ebf87560 New restriction on pow(x, y, z): If z is not None, x and y must be of
Tim Peters <tim.peters@gmail.com>
parents: 19633
diff changeset
534 return NULL;
cf65ebf87560 New restriction on pow(x, y, z): If z is not None, x and y must be of
Tim Peters <tim.peters@gmail.com>
parents: 19633
diff changeset
535 }
18499
2bb75a1f3184 On int to the negative integral power, let float handle it instead of
Guido van Rossum <guido@python.org>
parents: 18146
diff changeset
536 /* Return a float. This works because we know that
2bb75a1f3184 On int to the negative integral power, let float handle it instead of
Guido van Rossum <guido@python.org>
parents: 18146
diff changeset
537 this calls float_pow() which converts its
2bb75a1f3184 On int to the negative integral power, let float handle it instead of
Guido van Rossum <guido@python.org>
parents: 18146
diff changeset
538 arguments to double. */
2bb75a1f3184 On int to the negative integral power, let float handle it instead of
Guido van Rossum <guido@python.org>
parents: 18146
diff changeset
539 return PyFloat_Type.tp_as_number->nb_power(
2bb75a1f3184 On int to the negative integral power, let float handle it instead of
Guido van Rossum <guido@python.org>
parents: 18146
diff changeset
540 (PyObject *)v, (PyObject *)w, (PyObject *)z);
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
541 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
542 if ((PyObject *)z != Py_None) {
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
543 CONVERT_TO_LONG(z, iz);
4606
739b8480f1ac Fix core dump from pow(x,y,0).
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
544 if (iz == 0) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
545 PyErr_SetString(PyExc_ValueError,
19719
cdfdd5359411 Make the error msgs in our pow() implementations consistent.
Tim Peters <tim.peters@gmail.com>
parents: 19677
diff changeset
546 "pow() 3rd argument cannot be 0");
4606
739b8480f1ac Fix core dump from pow(x,y,0).
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
547 return NULL;
739b8480f1ac Fix core dump from pow(x,y,0).
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
548 }
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
549 }
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
550 /*
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
551 * XXX: The original exponentiation code stopped looping
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
552 * when temp hit zero; this code will continue onwards
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
553 * unnecessarily, but at least it won't cause any errors.
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
554 * Hopefully the speed improvement from the fast exponentiation
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
555 * will compensate for the slight inefficiency.
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
556 * XXX: Better handling of overflows is desperately needed.
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
557 */
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
558 temp = iv;
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
559 ix = 1;
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
560 while (iw > 0) {
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
561 prev = ix; /* Save value for overflow check */
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
562 if (iw & 1) {
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
563 ix = ix*temp;
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
564 if (temp == 0)
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
565 break; /* Avoid ix / 0 */
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
566 if (ix / temp != prev) {
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
567 if (err_ovf("integer exponentiation"))
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
568 return NULL;
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
569 return PyLong_Type.tp_as_number->nb_power(
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
570 (PyObject *)v,
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
571 (PyObject *)w,
19454
9afd9d5fb97a int_pow(): Repair typo when passing on to float pow (the 2nd argument was
Tim Peters <tim.peters@gmail.com>
parents: 19435
diff changeset
572 (PyObject *)z);
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
573 }
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
574 }
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
575 iw >>= 1; /* Shift exponent down by 1 bit */
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
576 if (iw==0) break;
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
577 prev = temp;
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
578 temp *= temp; /* Square the value of temp */
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
579 if (prev!=0 && temp/prev!=prev) {
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
580 if (err_ovf("integer exponentiation"))
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
581 return NULL;
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
582 return PyLong_Type.tp_as_number->nb_power(
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
583 (PyObject *)v, (PyObject *)w, (PyObject *)z);
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
584 }
4606
739b8480f1ac Fix core dump from pow(x,y,0).
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
585 if (iz) {
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
586 /* If we did a multiplication, perform a modulo */
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
587 ix = ix % iz;
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
588 temp = temp % iz;
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
589 }
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
590 }
4606
739b8480f1ac Fix core dump from pow(x,y,0).
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
591 if (iz) {
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
592 long div, mod;
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
593 switch (i_divmod(ix, iz, &div, &mod)) {
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
594 case DIVMOD_OK:
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
595 ix = mod;
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
596 break;
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
597 case DIVMOD_OVERFLOW:
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
598 return PyLong_Type.tp_as_number->nb_power(
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
599 (PyObject *)v, (PyObject *)w, (PyObject *)z);
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
600 default:
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
601 return NULL;
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
602 }
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
603 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
604 return PyInt_FromLong(ix);
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
605 }
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
606
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
607 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
608 int_neg(PyIntObject *v)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
609 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
610 register long a, x;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
611 a = v->ob_ival;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
612 x = -a;
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
613 if (a < 0 && x < 0) {
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
614 if (err_ovf("integer negation"))
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
615 return NULL;
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
616 return PyNumber_Negative(PyLong_FromLong(a));
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
617 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
618 return PyInt_FromLong(x);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
619 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
620
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
621 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
622 int_pos(PyIntObject *v)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
623 {
19878
cc146ee52897 More bug 460020. When I is a subclass of int, disable the +I(whatever),
Tim Peters <tim.peters@gmail.com>
parents: 19865
diff changeset
624 if (PyInt_CheckExact(v)) {
cc146ee52897 More bug 460020. When I is a subclass of int, disable the +I(whatever),
Tim Peters <tim.peters@gmail.com>
parents: 19865
diff changeset
625 Py_INCREF(v);
cc146ee52897 More bug 460020. When I is a subclass of int, disable the +I(whatever),
Tim Peters <tim.peters@gmail.com>
parents: 19865
diff changeset
626 return (PyObject *)v;
cc146ee52897 More bug 460020. When I is a subclass of int, disable the +I(whatever),
Tim Peters <tim.peters@gmail.com>
parents: 19865
diff changeset
627 }
cc146ee52897 More bug 460020. When I is a subclass of int, disable the +I(whatever),
Tim Peters <tim.peters@gmail.com>
parents: 19865
diff changeset
628 else
cc146ee52897 More bug 460020. When I is a subclass of int, disable the +I(whatever),
Tim Peters <tim.peters@gmail.com>
parents: 19865
diff changeset
629 return PyInt_FromLong(v->ob_ival);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
630 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
631
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
632 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
633 int_abs(PyIntObject *v)
229
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
634 {
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
635 if (v->ob_ival >= 0)
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
636 return int_pos(v);
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
637 else
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
638 return int_neg(v);
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
639 }
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
640
240
0aad3a7b97ef Added nonzero test
Guido van Rossum <guido@python.org>
parents: 229
diff changeset
641 static int
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
642 int_nonzero(PyIntObject *v)
240
0aad3a7b97ef Added nonzero test
Guido van Rossum <guido@python.org>
parents: 229
diff changeset
643 {
0aad3a7b97ef Added nonzero test
Guido van Rossum <guido@python.org>
parents: 229
diff changeset
644 return v->ob_ival != 0;
0aad3a7b97ef Added nonzero test
Guido van Rossum <guido@python.org>
parents: 229
diff changeset
645 }
0aad3a7b97ef Added nonzero test
Guido van Rossum <guido@python.org>
parents: 229
diff changeset
646
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
647 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
648 int_invert(PyIntObject *v)
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
649 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
650 return PyInt_FromLong(~v->ob_ival);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
651 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
652
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
653 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
654 int_lshift(PyIntObject *v, PyIntObject *w)
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
655 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
656 register long a, b;
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
657 CONVERT_TO_LONG(v, a);
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
658 CONVERT_TO_LONG(w, b);
589
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
659 if (b < 0) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
660 PyErr_SetString(PyExc_ValueError, "negative shift count");
589
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
661 return NULL;
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
662 }
19878
cc146ee52897 More bug 460020. When I is a subclass of int, disable the +I(whatever),
Tim Peters <tim.peters@gmail.com>
parents: 19865
diff changeset
663 if (a == 0 || b == 0)
cc146ee52897 More bug 460020. When I is a subclass of int, disable the +I(whatever),
Tim Peters <tim.peters@gmail.com>
parents: 19865
diff changeset
664 return int_pos(v);
1365
a5fc104849aa Changes to make range checks portable to 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 1352
diff changeset
665 if (b >= LONG_BIT) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
666 return PyInt_FromLong(0L);
589
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
667 }
18755
f8bd14aef4d6 Kill more warnings from the SGI compiler.
Fred Drake <fdrake@acm.org>
parents: 18499
diff changeset
668 a = (long)((unsigned long)a << b);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
669 return PyInt_FromLong(a);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
670 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
671
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
672 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
673 int_rshift(PyIntObject *v, PyIntObject *w)
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
674 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
675 register long a, b;
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
676 CONVERT_TO_LONG(v, a);
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
677 CONVERT_TO_LONG(w, b);
589
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
678 if (b < 0) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
679 PyErr_SetString(PyExc_ValueError, "negative shift count");
589
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
680 return NULL;
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
681 }
19878
cc146ee52897 More bug 460020. When I is a subclass of int, disable the +I(whatever),
Tim Peters <tim.peters@gmail.com>
parents: 19865
diff changeset
682 if (a == 0 || b == 0)
cc146ee52897 More bug 460020. When I is a subclass of int, disable the +I(whatever),
Tim Peters <tim.peters@gmail.com>
parents: 19865
diff changeset
683 return int_pos(v);
1365
a5fc104849aa Changes to make range checks portable to 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 1352
diff changeset
684 if (b >= LONG_BIT) {
589
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
685 if (a < 0)
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
686 a = -1;
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
687 else
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
688 a = 0;
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
689 }
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
690 else {
13423
a87803eb9dfb Cray J90 fixes for long ints.
Tim Peters <tim.peters@gmail.com>
parents: 13256
diff changeset
691 a = Py_ARITHMETIC_RIGHT_SHIFT(long, a, b);
589
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
692 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
693 return PyInt_FromLong(a);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
694 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
695
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
696 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
697 int_and(PyIntObject *v, PyIntObject *w)
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
698 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
699 register long a, b;
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
700 CONVERT_TO_LONG(v, a);
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
701 CONVERT_TO_LONG(w, b);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
702 return PyInt_FromLong(a & b);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
703 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
704
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
705 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
706 int_xor(PyIntObject *v, PyIntObject *w)
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
707 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
708 register long a, b;
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
709 CONVERT_TO_LONG(v, a);
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
710 CONVERT_TO_LONG(w, b);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
711 return PyInt_FromLong(a ^ b);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
712 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
713
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
714 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
715 int_or(PyIntObject *v, PyIntObject *w)
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
716 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
717 register long a, b;
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
718 CONVERT_TO_LONG(v, a);
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
719 CONVERT_TO_LONG(w, b);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
720 return PyInt_FromLong(a | b);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
721 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
722
19976
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
723 static int
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
724 int_coerce(PyObject **pv, PyObject **pw)
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
725 {
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
726 if (PyInt_Check(*pw)) {
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
727 Py_INCREF(*pv);
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
728 Py_INCREF(*pw);
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
729 return 0;
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
730 }
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
731 return 1; /* Can't do it */
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
732 }
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
733
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
734 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
735 int_int(PyIntObject *v)
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
736 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
737 Py_INCREF(v);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
738 return (PyObject *)v;
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
739 }
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
740
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
741 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
742 int_long(PyIntObject *v)
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
743 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
744 return PyLong_FromLong((v -> ob_ival));
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
745 }
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
746
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
747 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
748 int_float(PyIntObject *v)
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
749 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
750 return PyFloat_FromDouble((double)(v -> ob_ival));
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
751 }
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
752
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
753 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
754 int_oct(PyIntObject *v)
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
755 {
4952
05fd432d9e2b Increased buffer sizes used by hex() and oct() -- on 64-bit or 128-bit
Guido van Rossum <guido@python.org>
parents: 4937
diff changeset
756 char buf[100];
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
757 long x = v -> ob_ival;
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
758 if (x == 0)
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
759 strcpy(buf, "0");
4937
789de7c66712 Changed hex() and oct() again, to never emit a '-' sign.
Guido van Rossum <guido@python.org>
parents: 4926
diff changeset
760 else
21080
5b459677fc44 PyInt_FromString(), int_repr(), int_oct(), int_hex(): Conversion of
Barry Warsaw <barry@python.org>
parents: 19976
diff changeset
761 PyOS_snprintf(buf, sizeof(buf), "0%lo", x);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
762 return PyString_FromString(buf);
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
763 }
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
764
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
765 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
766 int_hex(PyIntObject *v)
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
767 {
4952
05fd432d9e2b Increased buffer sizes used by hex() and oct() -- on 64-bit or 128-bit
Guido van Rossum <guido@python.org>
parents: 4937
diff changeset
768 char buf[100];
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
769 long x = v -> ob_ival;
21080
5b459677fc44 PyInt_FromString(), int_repr(), int_oct(), int_hex(): Conversion of
Barry Warsaw <barry@python.org>
parents: 19976
diff changeset
770 PyOS_snprintf(buf, sizeof(buf), "0x%lx", x);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
771 return PyString_FromString(buf);
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
772 }
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
773
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
774 staticforward PyObject *
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
775 int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
776
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
777 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
778 int_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
779 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
780 PyObject *x = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
781 int base = -909;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
782 static char *kwlist[] = {"x", "base", 0};
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
783
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
784 if (type != &PyInt_Type)
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
785 return int_subtype_new(type, args, kwds); /* Wimp out */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
786 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
787 &x, &base))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
788 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
789 if (x == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
790 return PyInt_FromLong(0L);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
791 if (base == -909)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
792 return PyNumber_Int(x);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
793 if (PyString_Check(x))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
794 return PyInt_FromString(PyString_AS_STRING(x), NULL, base);
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19051
diff changeset
795 #ifdef Py_USING_UNICODE
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
796 if (PyUnicode_Check(x))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
797 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(x),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
798 PyUnicode_GET_SIZE(x),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
799 base);
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19051
diff changeset
800 #endif
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
801 PyErr_SetString(PyExc_TypeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
802 "int() can't convert non-string with explicit base");
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
803 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
804 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
805
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
806 /* Wimpy, slow approach to tp_new calls for subtypes of int:
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
807 first create a regular int from whatever arguments we got,
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
808 then allocate a subtype instance and initialize its ob_ival
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
809 from the regular int. The regular int is then thrown away.
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
810 */
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
811 static PyObject *
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
812 int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
813 {
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
814 PyObject *tmp, *new;
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
815
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
816 assert(PyType_IsSubtype(type, &PyInt_Type));
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
817 tmp = int_new(&PyInt_Type, args, kwds);
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
818 if (tmp == NULL)
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
819 return NULL;
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
820 assert(PyInt_Check(tmp));
19590
bf2c77840f1c Fix typo: double semicolons.
Guido van Rossum <guido@python.org>
parents: 19552
diff changeset
821 new = type->tp_alloc(type, 0);
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
822 if (new == NULL)
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
823 return NULL;
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
824 ((PyIntObject *)new)->ob_ival = ((PyIntObject *)tmp)->ob_ival;
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
825 Py_DECREF(tmp);
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
826 return new;
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
827 }
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
828
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
829 static char int_doc[] =
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
830 "int(x[, base]) -> integer\n\
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
831 \n\
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
832 Convert a string or number to an integer, if possible. A floating point\n\
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
833 argument will be truncated towards zero (this does not include a string\n\
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
834 representation of a floating point number!) When converting a string, use\n\
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
835 the optional base. It is an error to supply a base when converting a\n\
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
836 non-string.";
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
837
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
838 static PyNumberMethods int_as_number = {
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
839 (binaryfunc)int_add, /*nb_add*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
840 (binaryfunc)int_sub, /*nb_subtract*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
841 (binaryfunc)int_mul, /*nb_multiply*/
19633
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
842 (binaryfunc)int_classic_div, /*nb_divide*/
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
843 (binaryfunc)int_mod, /*nb_remainder*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
844 (binaryfunc)int_divmod, /*nb_divmod*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
845 (ternaryfunc)int_pow, /*nb_power*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
846 (unaryfunc)int_neg, /*nb_negative*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
847 (unaryfunc)int_pos, /*nb_positive*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
848 (unaryfunc)int_abs, /*nb_absolute*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
849 (inquiry)int_nonzero, /*nb_nonzero*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
850 (unaryfunc)int_invert, /*nb_invert*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
851 (binaryfunc)int_lshift, /*nb_lshift*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
852 (binaryfunc)int_rshift, /*nb_rshift*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
853 (binaryfunc)int_and, /*nb_and*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
854 (binaryfunc)int_xor, /*nb_xor*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
855 (binaryfunc)int_or, /*nb_or*/
19976
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
856 int_coerce, /*nb_coerce*/
15724
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
857 (unaryfunc)int_int, /*nb_int*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
858 (unaryfunc)int_long, /*nb_long*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
859 (unaryfunc)int_float, /*nb_float*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
860 (unaryfunc)int_oct, /*nb_oct*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
861 (unaryfunc)int_hex, /*nb_hex*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
862 0, /*nb_inplace_add*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
863 0, /*nb_inplace_subtract*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
864 0, /*nb_inplace_multiply*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
865 0, /*nb_inplace_divide*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
866 0, /*nb_inplace_remainder*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
867 0, /*nb_inplace_power*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
868 0, /*nb_inplace_lshift*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
869 0, /*nb_inplace_rshift*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
870 0, /*nb_inplace_and*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
871 0, /*nb_inplace_xor*/
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
872 0, /*nb_inplace_or*/
19051
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
873 (binaryfunc)int_div, /* nb_floor_divide */
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
874 int_true_divide, /* nb_true_divide */
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
875 0, /* nb_inplace_floor_divide */
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
876 0, /* nb_inplace_true_divide */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
877 };
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
878
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
879 PyTypeObject PyInt_Type = {
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
880 PyObject_HEAD_INIT(&PyType_Type)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
881 0,
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
882 "int",
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
883 sizeof(PyIntObject),
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
884 0,
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
885 (destructor)int_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
886 (printfunc)int_print, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
887 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
888 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
889 (cmpfunc)int_compare, /* tp_compare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
890 (reprfunc)int_repr, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
891 &int_as_number, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
892 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
893 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
894 (hashfunc)int_hash, /* tp_hash */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
895 0, /* tp_call */
21858
d521cf0899c8 Bugfix candidate.
Guido van Rossum <guido@python.org>
parents: 21206
diff changeset
896 (reprfunc)int_repr, /* tp_str */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
897 PyObject_GenericGetAttr, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
898 0, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
899 0, /* tp_as_buffer */
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
900 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
901 Py_TPFLAGS_BASETYPE, /* tp_flags */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
902 int_doc, /* tp_doc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
903 0, /* tp_traverse */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
904 0, /* tp_clear */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
905 0, /* tp_richcompare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
906 0, /* tp_weaklistoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
907 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
908 0, /* tp_iternext */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
909 0, /* tp_methods */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
910 0, /* tp_members */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
911 0, /* tp_getset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
912 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
913 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
914 0, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
915 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
916 0, /* tp_dictoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
917 0, /* tp_init */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
918 0, /* tp_alloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
919 int_new, /* tp_new */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
920 };
5936
80d24364b932 Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
921
80d24364b932 Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
922 void
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
923 PyInt_Fini(void)
5936
80d24364b932 Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
924 {
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
925 PyIntObject *p;
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
926 PyIntBlock *list, *next;
5936
80d24364b932 Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
927 int i;
10373
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
928 int bc, bf; /* block count, number of freed blocks */
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
929 int irem, isum; /* remaining unfreed ints per block, total */
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
930
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
931 #if NSMALLNEGINTS + NSMALLPOSINTS > 0
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
932 PyIntObject **q;
5936
80d24364b932 Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
933
10373
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
934 i = NSMALLNEGINTS + NSMALLPOSINTS;
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
935 q = small_ints;
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
936 while (--i >= 0) {
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
937 Py_XDECREF(*q);
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
938 *q++ = NULL;
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
939 }
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
940 #endif
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
941 bc = 0;
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
942 bf = 0;
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
943 isum = 0;
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
944 list = block_list;
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
945 block_list = NULL;
10431
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
946 free_list = NULL;
10373
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
947 while (list != NULL) {
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
948 bc++;
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
949 irem = 0;
10431
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
950 for (i = 0, p = &list->objects[0];
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
951 i < N_INTOBJECTS;
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
952 i++, p++) {
19865
f2a3009b528e Replace a few places where X->ob_type was compared to &PyXXX_Type with
Guido van Rossum <guido@python.org>
parents: 19719
diff changeset
953 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
10373
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
954 irem++;
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
955 }
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
956 next = list->next;
10373
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
957 if (irem) {
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
958 list->next = block_list;
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
959 block_list = list;
10431
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
960 for (i = 0, p = &list->objects[0];
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
961 i < N_INTOBJECTS;
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
962 i++, p++) {
19865
f2a3009b528e Replace a few places where X->ob_type was compared to &PyXXX_Type with
Guido van Rossum <guido@python.org>
parents: 19719
diff changeset
963 if (!PyInt_CheckExact(p) ||
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
964 p->ob_refcnt == 0) {
10431
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
965 p->ob_type = (struct _typeobject *)
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
966 free_list;
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
967 free_list = p;
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
968 }
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
969 #if NSMALLNEGINTS + NSMALLPOSINTS > 0
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
970 else if (-NSMALLNEGINTS <= p->ob_ival &&
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
971 p->ob_ival < NSMALLPOSINTS &&
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
972 small_ints[p->ob_ival +
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
973 NSMALLNEGINTS] == NULL) {
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
974 Py_INCREF(p);
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
975 small_ints[p->ob_ival +
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
976 NSMALLNEGINTS] = p;
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
977 }
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
978 #endif
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
979 }
10373
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
980 }
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
981 else {
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12248
diff changeset
982 PyMem_FREE(list); /* XXX PyObject_FREE ??? */
10373
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
983 bf++;
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
984 }
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
985 isum += irem;
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
986 list = next;
5936
80d24364b932 Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
987 }
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
988 if (!Py_VerboseFlag)
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
989 return;
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
990 fprintf(stderr, "# cleanup ints");
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
991 if (!isum) {
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
992 fprintf(stderr, "\n");
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
993 }
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
994 else {
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
995 fprintf(stderr,
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
996 ": %d unfreed int%s in %d out of %d block%s\n",
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
997 isum, isum == 1 ? "" : "s",
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
998 bc - bf, bc, bc == 1 ? "" : "s");
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
999 }
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1000 if (Py_VerboseFlag > 1) {
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1001 list = block_list;
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1002 while (list != NULL) {
10431
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
1003 for (i = 0, p = &list->objects[0];
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
1004 i < N_INTOBJECTS;
0789e0b55587 Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
Guido van Rossum <guido@python.org>
parents: 10391
diff changeset
1005 i++, p++) {
19865
f2a3009b528e Replace a few places where X->ob_type was compared to &PyXXX_Type with
Guido van Rossum <guido@python.org>
parents: 19719
diff changeset
1006 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1007 fprintf(stderr,
13210
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 12630
diff changeset
1008 "# <int at %p, refcnt=%d, val=%ld>\n",
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 12630
diff changeset
1009 p, p->ob_refcnt, p->ob_ival);
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1010 }
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1011 list = list->next;
10373
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
1012 }
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
1013 }
5936
80d24364b932 Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
1014 }