annotate Objects/intobject.c @ 58925:eecf1bef052d 2.6

Merged revisions 78207 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r78207 | ezio.melotti | 2010-02-17 01:26:09 +0200 (Wed, 17 Feb 2010) | 1 line #7930: fix stripid ........
author Ezio Melotti <ezio.melotti@gmail.com>
date Tue, 16 Feb 2010 23:29:44 +0000
parents d587a4e5ba5a
children e38335d4df91
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
44432
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
7 static PyObject *int_int(PyIntObject *v);
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
8
1448
328f446d2016 Added getmaxint() so sys can initialize sys.maxint.
Guido van Rossum <guido@python.org>
parents: 1413
diff changeset
9 long
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
10 PyInt_GetMax(void)
1448
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 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
13 }
328f446d2016 Added getmaxint() so sys can initialize sys.maxint.
Guido van Rossum <guido@python.org>
parents: 1413
diff changeset
14
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
15 /* Integers are quite normal objects, to make object handling uniform.
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
16 (Using odd pointers to represent integers would save much space
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
17 but require extra checks for this special case throughout the code.)
23299
01478a132908 Just added comments, and cleared some XXX questions, related to int
Tim Peters <tim.peters@gmail.com>
parents: 23279
diff changeset
18 Since a typical Python program spends much of its time allocating
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
19 and deallocating integers, these operations should be very fast.
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
20 Therefore we use a dedicated allocation scheme with a much lower
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
21 overhead (in space and time) than straight malloc(): a simple
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
22 dedicated free list, filled when necessary with memory from malloc().
23299
01478a132908 Just added comments, and cleared some XXX questions, related to int
Tim Peters <tim.peters@gmail.com>
parents: 23279
diff changeset
23
01478a132908 Just added comments, and cleared some XXX questions, related to int
Tim Peters <tim.peters@gmail.com>
parents: 23279
diff changeset
24 block_list is a singly-linked list of all PyIntBlocks ever allocated,
01478a132908 Just added comments, and cleared some XXX questions, related to int
Tim Peters <tim.peters@gmail.com>
parents: 23279
diff changeset
25 linked via their next members. PyIntBlocks are never returned to the
01478a132908 Just added comments, and cleared some XXX questions, related to int
Tim Peters <tim.peters@gmail.com>
parents: 23279
diff changeset
26 system before shutdown (PyInt_Fini).
01478a132908 Just added comments, and cleared some XXX questions, related to int
Tim Peters <tim.peters@gmail.com>
parents: 23279
diff changeset
27
01478a132908 Just added comments, and cleared some XXX questions, related to int
Tim Peters <tim.peters@gmail.com>
parents: 23279
diff changeset
28 free_list is a singly-linked list of available PyIntObjects, linked
01478a132908 Just added comments, and cleared some XXX questions, related to int
Tim Peters <tim.peters@gmail.com>
parents: 23279
diff changeset
29 via abuse of their ob_type members.
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
30 */
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
31
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
32 #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
33 #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
34 #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
35
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
36 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
37 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
38 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
39 };
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
40
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
41 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
42
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
43 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
44 static PyIntObject *free_list = NULL;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
45
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
46 static PyIntObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
47 fill_free_list(void)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
48 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
49 PyIntObject *p, *q;
23299
01478a132908 Just added comments, and cleared some XXX questions, related to int
Tim Peters <tim.peters@gmail.com>
parents: 23279
diff changeset
50 /* Python's object allocator isn't appropriate for large blocks. */
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12248
diff changeset
51 p = (PyIntObject *) PyMem_MALLOC(sizeof(PyIntBlock));
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
52 if (p == NULL)
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12248
diff changeset
53 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
54 ((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
55 block_list = (PyIntBlock *)p;
23299
01478a132908 Just added comments, and cleared some XXX questions, related to int
Tim Peters <tim.peters@gmail.com>
parents: 23279
diff changeset
56 /* Link the int objects together, from rear to front, then return
01478a132908 Just added comments, and cleared some XXX questions, related to int
Tim Peters <tim.peters@gmail.com>
parents: 23279
diff changeset
57 the address of the last int object in the block. */
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
58 p = &((PyIntBlock *)p)->objects[0];
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
59 q = p + N_INTOBJECTS;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
60 while (--q > p)
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43378
diff changeset
61 Py_TYPE(q) = (struct _typeobject *)(q-1);
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43378
diff changeset
62 Py_TYPE(q) = NULL;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
63 return p + N_INTOBJECTS - 1;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
64 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
65
1352
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
66 #ifndef NSMALLPOSINTS
36645
5a836986206d RFE #1436243: make integers in [0..256] preallocated.
Georg Brandl <georg@python.org>
parents: 36505
diff changeset
67 #define NSMALLPOSINTS 257
1352
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
68 #endif
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
69 #ifndef NSMALLNEGINTS
26889
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
70 #define NSMALLNEGINTS 5
1352
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
71 #endif
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
72 #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
73 /* 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
74 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
75 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
76 -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
77 */
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
78 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
79 #endif
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
80 #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
81 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
82 #endif
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
83
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
84 PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
85 PyInt_FromLong(long ival)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
87 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
88 #if NSMALLNEGINTS + NSMALLPOSINTS > 0
26889
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
89 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
90 v = small_ints[ival + NSMALLNEGINTS];
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
91 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
92 #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
93 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
94 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
95 else
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
96 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
97 #endif
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
98 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
99 }
4d1a15fc4748 intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents: 1347
diff changeset
100 #endif
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
101 if (free_list == NULL) {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
102 if ((free_list = fill_free_list()) == NULL)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
103 return NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 }
24898
a869d2de536f Call me anal, but there was a particular phrase that was speading to
Guido van Rossum <guido@python.org>
parents: 24831
diff changeset
105 /* Inline PyObject_New */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
106 v = free_list;
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43378
diff changeset
107 free_list = (PyIntObject *)Py_TYPE(v);
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12248
diff changeset
108 PyObject_INIT(v, &PyInt_Type);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
109 v->ob_ival = ival;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
110 return (PyObject *) v;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
111 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
112
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
113 PyObject *
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
114 PyInt_FromSize_t(size_t ival)
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
115 {
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
116 if (ival <= LONG_MAX)
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
117 return PyInt_FromLong((long)ival);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
118 return _PyLong_FromSize_t(ival);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
119 }
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
120
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
121 PyObject *
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
122 PyInt_FromSsize_t(Py_ssize_t ival)
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
123 {
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
124 if (ival >= LONG_MIN && ival <= LONG_MAX)
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
125 return PyInt_FromLong((long)ival);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
126 return _PyLong_FromSsize_t(ival);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
127 }
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
128
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
129 static void
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
130 int_dealloc(PyIntObject *v)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 39
diff changeset
131 {
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
132 if (PyInt_CheckExact(v)) {
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43378
diff changeset
133 Py_TYPE(v) = (struct _typeobject *)free_list;
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
134 free_list = v;
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
135 }
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
136 else
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43378
diff changeset
137 Py_TYPE(v)->tp_free((PyObject *)v);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139
23279
200559fcc664 Make sure that tp_free frees the int the same way as tp_dealloc would.
Guido van Rossum <guido@python.org>
parents: 22785
diff changeset
140 static void
200559fcc664 Make sure that tp_free frees the int the same way as tp_dealloc would.
Guido van Rossum <guido@python.org>
parents: 22785
diff changeset
141 int_free(PyIntObject *v)
200559fcc664 Make sure that tp_free frees the int the same way as tp_dealloc would.
Guido van Rossum <guido@python.org>
parents: 22785
diff changeset
142 {
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43378
diff changeset
143 Py_TYPE(v) = (struct _typeobject *)free_list;
23279
200559fcc664 Make sure that tp_free frees the int the same way as tp_dealloc would.
Guido van Rossum <guido@python.org>
parents: 22785
diff changeset
144 free_list = v;
200559fcc664 Make sure that tp_free frees the int the same way as tp_dealloc would.
Guido van Rossum <guido@python.org>
parents: 22785
diff changeset
145 }
200559fcc664 Make sure that tp_free frees the int the same way as tp_dealloc would.
Guido van Rossum <guido@python.org>
parents: 22785
diff changeset
146
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 long
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
148 PyInt_AsLong(register PyObject *op)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
150 PyNumberMethods *nb;
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
151 PyIntObject *io;
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
152 long val;
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
153
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
154 if (op && PyInt_Check(op))
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
155 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
156
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43378
diff changeset
157 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
158 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
159 PyErr_SetString(PyExc_TypeError, "an integer is required");
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 return -1;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 }
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
162
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
163 io = (PyIntObject*) (*nb->nb_int) (op);
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
164 if (io == NULL)
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
165 return -1;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
166 if (!PyInt_Check(io)) {
26291
d31ddc66b1b5 Change int() so that passing a string, unicode, float or long argument
Walter Dörwald <walter@livinglogic.de>
parents: 26081
diff changeset
167 if (PyLong_Check(io)) {
d31ddc66b1b5 Change int() so that passing a string, unicode, float or long argument
Walter Dörwald <walter@livinglogic.de>
parents: 26081
diff changeset
168 /* got a long? => retry int conversion */
d31ddc66b1b5 Change int() so that passing a string, unicode, float or long argument
Walter Dörwald <walter@livinglogic.de>
parents: 26081
diff changeset
169 val = PyLong_AsLong((PyObject *)io);
27993
beea4f21c9f0 Strange control flow in PyInt_AsLong. When nb_int is called inside
Thomas Heller <theller@ctypes.org>
parents: 27851
diff changeset
170 Py_DECREF(io);
beea4f21c9f0 Strange control flow in PyInt_AsLong. When nb_int is called inside
Thomas Heller <theller@ctypes.org>
parents: 27851
diff changeset
171 if ((val == -1) && PyErr_Occurred())
26291
d31ddc66b1b5 Change int() so that passing a string, unicode, float or long argument
Walter Dörwald <walter@livinglogic.de>
parents: 26081
diff changeset
172 return -1;
27993
beea4f21c9f0 Strange control flow in PyInt_AsLong. When nb_int is called inside
Thomas Heller <theller@ctypes.org>
parents: 27851
diff changeset
173 return val;
26291
d31ddc66b1b5 Change int() so that passing a string, unicode, float or long argument
Walter Dörwald <walter@livinglogic.de>
parents: 26081
diff changeset
174 }
d31ddc66b1b5 Change int() so that passing a string, unicode, float or long argument
Walter Dörwald <walter@livinglogic.de>
parents: 26081
diff changeset
175 else
d31ddc66b1b5 Change int() so that passing a string, unicode, float or long argument
Walter Dörwald <walter@livinglogic.de>
parents: 26081
diff changeset
176 {
28652
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
177 Py_DECREF(io);
26291
d31ddc66b1b5 Change int() so that passing a string, unicode, float or long argument
Walter Dörwald <walter@livinglogic.de>
parents: 26081
diff changeset
178 PyErr_SetString(PyExc_TypeError,
d31ddc66b1b5 Change int() so that passing a string, unicode, float or long argument
Walter Dörwald <walter@livinglogic.de>
parents: 26081
diff changeset
179 "nb_int should return int object");
d31ddc66b1b5 Change int() so that passing a string, unicode, float or long argument
Walter Dörwald <walter@livinglogic.de>
parents: 26081
diff changeset
180 return -1;
d31ddc66b1b5 Change int() so that passing a string, unicode, float or long argument
Walter Dörwald <walter@livinglogic.de>
parents: 26081
diff changeset
181 }
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
182 }
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
183
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
184 val = PyInt_AS_LONG(io);
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
185 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
186
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
187 return val;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
189
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
190 Py_ssize_t
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
191 PyInt_AsSsize_t(register PyObject *op)
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
192 {
36505
5825c6ace28b Avoid unused variables when SIZEOF_SIZE_T == SIZEOF_LONG. Also normalize
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
193 #if SIZEOF_SIZE_T != SIZEOF_LONG
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
194 PyNumberMethods *nb;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
195 PyIntObject *io;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
196 Py_ssize_t val;
36505
5825c6ace28b Avoid unused variables when SIZEOF_SIZE_T == SIZEOF_LONG. Also normalize
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
197 #endif
39463
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 37815
diff changeset
198
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 37815
diff changeset
199 if (op == NULL) {
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 37815
diff changeset
200 PyErr_SetString(PyExc_TypeError, "an integer is required");
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 37815
diff changeset
201 return -1;
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 37815
diff changeset
202 }
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 37815
diff changeset
203
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 37815
diff changeset
204 if (PyInt_Check(op))
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 37815
diff changeset
205 return PyInt_AS_LONG((PyIntObject*) op);
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 37815
diff changeset
206 if (PyLong_Check(op))
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
207 return _PyLong_AsSsize_t(op);
36505
5825c6ace28b Avoid unused variables when SIZEOF_SIZE_T == SIZEOF_LONG. Also normalize
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
208 #if SIZEOF_SIZE_T == SIZEOF_LONG
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
209 return PyInt_AsLong(op);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
210 #else
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
211
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43378
diff changeset
212 if ((nb = Py_TYPE(op)->tp_as_number) == NULL ||
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
213 (nb->nb_int == NULL && nb->nb_long == 0)) {
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
214 PyErr_SetString(PyExc_TypeError, "an integer is required");
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
215 return -1;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
216 }
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
217
41634
54179538a387 As per Armin Rigo's suggestion, remove special handing from intobject.c to deal with the peculiarities of classobject's implementation of the number protocol. The nb_long method of classobject now falls back to nb_int if there is no __long__ attribute present.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
218 if (nb->nb_long != 0)
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
219 io = (PyIntObject*) (*nb->nb_long) (op);
41634
54179538a387 As per Armin Rigo's suggestion, remove special handing from intobject.c to deal with the peculiarities of classobject's implementation of the number protocol. The nb_long method of classobject now falls back to nb_int if there is no __long__ attribute present.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
220 else
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
221 io = (PyIntObject*) (*nb->nb_int) (op);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
222 if (io == NULL)
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
223 return -1;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
224 if (!PyInt_Check(io)) {
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
225 if (PyLong_Check(io)) {
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
226 /* got a long? => retry int conversion */
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
227 val = _PyLong_AsSsize_t((PyObject *)io);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
228 Py_DECREF(io);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
229 if ((val == -1) && PyErr_Occurred())
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
230 return -1;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
231 return val;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
232 }
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
233 else
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
234 {
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
235 Py_DECREF(io);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
236 PyErr_SetString(PyExc_TypeError,
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
237 "nb_int should return int object");
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
238 return -1;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
239 }
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
240 }
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
241
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
242 val = PyInt_AS_LONG(io);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
243 Py_DECREF(io);
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
244
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
245 return val;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
246 #endif
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
247 }
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
248
28652
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
249 unsigned long
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
250 PyInt_AsUnsignedLongMask(register PyObject *op)
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
251 {
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
252 PyNumberMethods *nb;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
253 PyIntObject *io;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
254 unsigned long val;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
255
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
256 if (op && PyInt_Check(op))
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
257 return PyInt_AS_LONG((PyIntObject*) op);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
258 if (op && PyLong_Check(op))
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
259 return PyLong_AsUnsignedLongMask(op);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
260
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43378
diff changeset
261 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
28652
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
262 nb->nb_int == NULL) {
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
263 PyErr_SetString(PyExc_TypeError, "an integer is required");
37815
20cb13bdf1f0 C++ compiler cleanup: bunch-o-casts, plus use of unsigned loop index var in a couple places
Skip Montanaro <skip@pobox.com>
parents: 37611
diff changeset
264 return (unsigned long)-1;
28652
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
265 }
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
266
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
267 io = (PyIntObject*) (*nb->nb_int) (op);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
268 if (io == NULL)
37815
20cb13bdf1f0 C++ compiler cleanup: bunch-o-casts, plus use of unsigned loop index var in a couple places
Skip Montanaro <skip@pobox.com>
parents: 37611
diff changeset
269 return (unsigned long)-1;
28652
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
270 if (!PyInt_Check(io)) {
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
271 if (PyLong_Check(io)) {
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
272 val = PyLong_AsUnsignedLongMask((PyObject *)io);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
273 Py_DECREF(io);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
274 if (PyErr_Occurred())
37815
20cb13bdf1f0 C++ compiler cleanup: bunch-o-casts, plus use of unsigned loop index var in a couple places
Skip Montanaro <skip@pobox.com>
parents: 37611
diff changeset
275 return (unsigned long)-1;
28652
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
276 return val;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
277 }
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
278 else
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
279 {
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
280 Py_DECREF(io);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
281 PyErr_SetString(PyExc_TypeError,
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
282 "nb_int should return int object");
37815
20cb13bdf1f0 C++ compiler cleanup: bunch-o-casts, plus use of unsigned loop index var in a couple places
Skip Montanaro <skip@pobox.com>
parents: 37611
diff changeset
283 return (unsigned long)-1;
28652
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
284 }
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
285 }
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
286
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
287 val = PyInt_AS_LONG(io);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
288 Py_DECREF(io);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
289
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
290 return val;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
291 }
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
292
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
293 #ifdef HAVE_LONG_LONG
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
294 unsigned PY_LONG_LONG
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
295 PyInt_AsUnsignedLongLongMask(register PyObject *op)
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
296 {
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
297 PyNumberMethods *nb;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
298 PyIntObject *io;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
299 unsigned PY_LONG_LONG val;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
300
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
301 if (op && PyInt_Check(op))
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
302 return PyInt_AS_LONG((PyIntObject*) op);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
303 if (op && PyLong_Check(op))
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
304 return PyLong_AsUnsignedLongLongMask(op);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
305
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43378
diff changeset
306 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL ||
28652
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
307 nb->nb_int == NULL) {
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
308 PyErr_SetString(PyExc_TypeError, "an integer is required");
37815
20cb13bdf1f0 C++ compiler cleanup: bunch-o-casts, plus use of unsigned loop index var in a couple places
Skip Montanaro <skip@pobox.com>
parents: 37611
diff changeset
309 return (unsigned PY_LONG_LONG)-1;
28652
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
310 }
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
311
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
312 io = (PyIntObject*) (*nb->nb_int) (op);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
313 if (io == NULL)
37815
20cb13bdf1f0 C++ compiler cleanup: bunch-o-casts, plus use of unsigned loop index var in a couple places
Skip Montanaro <skip@pobox.com>
parents: 37611
diff changeset
314 return (unsigned PY_LONG_LONG)-1;
28652
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
315 if (!PyInt_Check(io)) {
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
316 if (PyLong_Check(io)) {
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
317 val = PyLong_AsUnsignedLongLongMask((PyObject *)io);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
318 Py_DECREF(io);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
319 if (PyErr_Occurred())
37815
20cb13bdf1f0 C++ compiler cleanup: bunch-o-casts, plus use of unsigned loop index var in a couple places
Skip Montanaro <skip@pobox.com>
parents: 37611
diff changeset
320 return (unsigned PY_LONG_LONG)-1;
28652
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
321 return val;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
322 }
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
323 else
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
324 {
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
325 Py_DECREF(io);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
326 PyErr_SetString(PyExc_TypeError,
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
327 "nb_int should return int object");
37815
20cb13bdf1f0 C++ compiler cleanup: bunch-o-casts, plus use of unsigned loop index var in a couple places
Skip Montanaro <skip@pobox.com>
parents: 37611
diff changeset
328 return (unsigned PY_LONG_LONG)-1;
28652
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
329 }
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
330 }
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
331
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
332 val = PyInt_AS_LONG(io);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
333 Py_DECREF(io);
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
334
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
335 return val;
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
336 }
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
337 #endif
28a2975514cd SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents: 27993
diff changeset
338
11383
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
339 PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
340 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
341 {
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
342 char *end;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
343 long x;
37611
7afaa752c772 Fix int() and long() to repr() their argument when formatting the exception,
Thomas Wouters <thomas@python.org>
parents: 37589
diff changeset
344 Py_ssize_t slen;
7afaa752c772 Fix int() and long() to repr() their argument when formatting the exception,
Thomas Wouters <thomas@python.org>
parents: 37589
diff changeset
345 PyObject *sobj, *srepr;
11383
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
346
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
347 if ((base != 0 && base < 2) || base > 36) {
27851
7a20bbdbff36 Issue a warning when int('0...', 0) returns an int with the sign
Guido van Rossum <guido@python.org>
parents: 27779
diff changeset
348 PyErr_SetString(PyExc_ValueError,
7a20bbdbff36 Issue a warning when int('0...', 0) returns an int with the sign
Guido van Rossum <guido@python.org>
parents: 27779
diff changeset
349 "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
350 return NULL;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
351 }
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
352
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
353 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
354 s++;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
355 errno = 0;
27851
7a20bbdbff36 Issue a warning when int('0...', 0) returns an int with the sign
Guido van Rossum <guido@python.org>
parents: 27779
diff changeset
356 if (base == 0 && s[0] == '0') {
11383
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
357 x = (long) PyOS_strtoul(s, &end, base);
27851
7a20bbdbff36 Issue a warning when int('0...', 0) returns an int with the sign
Guido van Rossum <guido@python.org>
parents: 27779
diff changeset
358 if (x < 0)
31042
9c846c3df6f3 - Removed FutureWarnings related to hex/oct literals and conversions
Guido van Rossum <guido@python.org>
parents: 30131
diff changeset
359 return PyLong_FromString(s, pend, base);
27851
7a20bbdbff36 Issue a warning when int('0...', 0) returns an int with the sign
Guido van Rossum <guido@python.org>
parents: 27779
diff changeset
360 }
11383
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
361 else
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
362 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
363 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
364 goto bad;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
365 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
366 end++;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
367 if (*end != '\0') {
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
368 bad:
37611
7afaa752c772 Fix int() and long() to repr() their argument when formatting the exception,
Thomas Wouters <thomas@python.org>
parents: 37589
diff changeset
369 slen = strlen(s) < 200 ? strlen(s) : 200;
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47392
diff changeset
370 sobj = PyString_FromStringAndSize(s, slen);
37611
7afaa752c772 Fix int() and long() to repr() their argument when formatting the exception,
Thomas Wouters <thomas@python.org>
parents: 37589
diff changeset
371 if (sobj == NULL)
7afaa752c772 Fix int() and long() to repr() their argument when formatting the exception,
Thomas Wouters <thomas@python.org>
parents: 37589
diff changeset
372 return NULL;
7afaa752c772 Fix int() and long() to repr() their argument when formatting the exception,
Thomas Wouters <thomas@python.org>
parents: 37589
diff changeset
373 srepr = PyObject_Repr(sobj);
7afaa752c772 Fix int() and long() to repr() their argument when formatting the exception,
Thomas Wouters <thomas@python.org>
parents: 37589
diff changeset
374 Py_DECREF(sobj);
7afaa752c772 Fix int() and long() to repr() their argument when formatting the exception,
Thomas Wouters <thomas@python.org>
parents: 37589
diff changeset
375 if (srepr == NULL)
7afaa752c772 Fix int() and long() to repr() their argument when formatting the exception,
Thomas Wouters <thomas@python.org>
parents: 37589
diff changeset
376 return NULL;
7afaa752c772 Fix int() and long() to repr() their argument when formatting the exception,
Thomas Wouters <thomas@python.org>
parents: 37589
diff changeset
377 PyErr_Format(PyExc_ValueError,
7afaa752c772 Fix int() and long() to repr() their argument when formatting the exception,
Thomas Wouters <thomas@python.org>
parents: 37589
diff changeset
378 "invalid literal for int() with base %d: %s",
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47392
diff changeset
379 base, PyString_AS_STRING(srepr));
37611
7afaa752c772 Fix int() and long() to repr() their argument when formatting the exception,
Thomas Wouters <thomas@python.org>
parents: 37589
diff changeset
380 Py_DECREF(srepr);
11383
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
381 return NULL;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
382 }
33256
6641d0542592 Stop producing or using OverflowWarning. PEP 237 thought this would
Tim Peters <tim.peters@gmail.com>
parents: 32759
diff changeset
383 else if (errno != 0)
26081
999accfa91c5 Make int("...") return a long if an int would overflow.
Walter Dörwald <walter@livinglogic.de>
parents: 25217
diff changeset
384 return PyLong_FromString(s, pend, base);
11383
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
385 if (pend)
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
386 *pend = end;
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
387 return PyInt_FromLong(x);
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
388 }
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 11332
diff changeset
389
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19051
diff changeset
390 #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
391 PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
392 PyInt_FromUnicode(Py_UNICODE *s, Py_ssize_t 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
393 {
26081
999accfa91c5 Make int("...") return a long if an int would overflow.
Walter Dörwald <walter@livinglogic.de>
parents: 25217
diff changeset
394 PyObject *result;
37589
aeee85b6a5dd More C++-compliance. Note especially listobject.c - to get C++ to accept the
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37304
diff changeset
395 char *buffer = (char *)PyMem_MALLOC(length+1);
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
396
26081
999accfa91c5 Make int("...") return a long if an int would overflow.
Walter Dörwald <walter@livinglogic.de>
parents: 25217
diff changeset
397 if (buffer == NULL)
41733
0ad6951c18f7 Port rev 55353 from Guido:
Neal Norwitz <nnorwitz@gmail.com>
parents: 41634
diff changeset
398 return PyErr_NoMemory();
26081
999accfa91c5 Make int("...") return a long if an int would overflow.
Walter Dörwald <walter@livinglogic.de>
parents: 25217
diff changeset
399
999accfa91c5 Make int("...") return a long if an int would overflow.
Walter Dörwald <walter@livinglogic.de>
parents: 25217
diff changeset
400 if (PyUnicode_EncodeDecimal(s, length, buffer, NULL)) {
999accfa91c5 Make int("...") return a long if an int would overflow.
Walter Dörwald <walter@livinglogic.de>
parents: 25217
diff changeset
401 PyMem_FREE(buffer);
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
402 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
403 }
26081
999accfa91c5 Make int("...") return a long if an int would overflow.
Walter Dörwald <walter@livinglogic.de>
parents: 25217
diff changeset
404 result = PyInt_FromString(buffer, NULL, base);
999accfa91c5 Make int("...") return a long if an int would overflow.
Walter Dörwald <walter@livinglogic.de>
parents: 25217
diff changeset
405 PyMem_FREE(buffer);
999accfa91c5 Make int("...") return a long if an int would overflow.
Walter Dörwald <walter@livinglogic.de>
parents: 25217
diff changeset
406 return result;
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
407 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19051
diff changeset
408 #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
409
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
410 /* Methods */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
411
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
412 /* 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
413 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
414 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
415
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
416 #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
417 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
418 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
419 } \
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
420 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
421 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
422 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
423 }
2dcc4a86a876 Make int a new style number type. Sequence repeat is now done here
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
424
750
a5e6881cebf0 lint fix
Guido van Rossum <guido@python.org>
parents: 610
diff changeset
425 /* ARGSUSED */
284
6ac402023cac printobject now returns an error code
Guido van Rossum <guido@python.org>
parents: 240
diff changeset
426 static int
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
427 int_print(PyIntObject *v, FILE *fp, int flags)
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
428 /* flags -- not used but required by interface */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
429 {
43378
7630248b593c Add a bunch of GIL release/acquire points in tp_print implementations and for
Brett Cannon <bcannon@gmail.com>
parents: 42333
diff changeset
430 long int_val = v->ob_ival;
7630248b593c Add a bunch of GIL release/acquire points in tp_print implementations and for
Brett Cannon <bcannon@gmail.com>
parents: 42333
diff changeset
431 Py_BEGIN_ALLOW_THREADS
7630248b593c Add a bunch of GIL release/acquire points in tp_print implementations and for
Brett Cannon <bcannon@gmail.com>
parents: 42333
diff changeset
432 fprintf(fp, "%ld", int_val);
7630248b593c Add a bunch of GIL release/acquire points in tp_print implementations and for
Brett Cannon <bcannon@gmail.com>
parents: 42333
diff changeset
433 Py_END_ALLOW_THREADS
284
6ac402023cac printobject now returns an error code
Guido van Rossum <guido@python.org>
parents: 240
diff changeset
434 return 0;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
435 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
436
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
437 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
438 int_repr(PyIntObject *v)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
439 {
45262
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
440 return _PyInt_Format(v, 10, 0);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
441 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
442
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
443 static int
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
444 int_compare(PyIntObject *v, PyIntObject *w)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
445 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
446 register long i = v->ob_ival;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
447 register long j = w->ob_ival;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
448 return (i < j) ? -1 : (i > j) ? 1 : 0;
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
449 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
450
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
451 static long
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
452 int_hash(PyIntObject *v)
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
453 {
4903
6a629d278a18 Fix overflow test for multiply to catch some cases it missed.
Guido van Rossum <guido@python.org>
parents: 4606
diff changeset
454 /* 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
455 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
456 long x = v -> ob_ival;
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
457 if (x == -1)
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
458 x = -2;
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
459 return x;
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
460 }
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
461
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
462 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
463 int_add(PyIntObject *v, PyIntObject *w)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
464 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
465 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
466 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
467 CONVERT_TO_LONG(w, b);
57534
cbb6e92c1a0d Merged revisions 76629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47897
diff changeset
468 /* casts in the line below avoid undefined behaviour on overflow */
cbb6e92c1a0d Merged revisions 76629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47897
diff changeset
469 x = (long)((unsigned long)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
470 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
471 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
472 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
473 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
474
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
475 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
476 int_sub(PyIntObject *v, PyIntObject *w)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
477 {
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
478 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
479 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
480 CONVERT_TO_LONG(w, b);
57534
cbb6e92c1a0d Merged revisions 76629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47897
diff changeset
481 /* casts in the line below avoid undefined behaviour on overflow */
cbb6e92c1a0d Merged revisions 76629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47897
diff changeset
482 x = (long)((unsigned long)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
483 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
484 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
485 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
486 (PyObject *)w);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
487 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
488
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
489 /*
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
490 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
491 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
492 -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
493
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
494 Here's another way:
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
495
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
496 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
497 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
498 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
499 some integer i).
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
500
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
501 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
502 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
503 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
504 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
505 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
506 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
507 product are correct.
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
508
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
509 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
510 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
511 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
512 product that must have overflowed.
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
513 */
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
514
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
515 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
516 int_mul(PyObject *v, PyObject *w)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
517 {
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
518 long a, b;
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
519 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
520 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
521 double doubleprod; /* (double)a * (double)b */
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
522
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
523 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
524 CONVERT_TO_LONG(w, b);
57534
cbb6e92c1a0d Merged revisions 76629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47897
diff changeset
525 /* casts in the next line avoid undefined behaviour on overflow */
cbb6e92c1a0d Merged revisions 76629 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47897
diff changeset
526 longprod = (long)((unsigned long)a * b);
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
527 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
528 doubled_longprod = (double)longprod;
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
529
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
530 /* 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
531 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
532 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
533 return PyInt_FromLong(longprod);
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
534
21206
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
535 /* 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
536 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
537 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
538 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
539 */
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
540 {
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
541 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
542 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
543 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
544 -doubleprod;
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
545 /* 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
546 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
547 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
548 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
549 else
81928c9d7011 SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents: 21124
diff changeset
550 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
551 }
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
552 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
553
39995
6ba402b60041 Forward-port of r52136,52138: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents: 39984
diff changeset
554 /* Integer overflow checking for unary negation: on a 2's-complement
6ba402b60041 Forward-port of r52136,52138: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents: 39984
diff changeset
555 * box, -x overflows iff x is the most negative long. In this case we
6ba402b60041 Forward-port of r52136,52138: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents: 39984
diff changeset
556 * get -x == x. However, -x is undefined (by C) if x /is/ the most
6ba402b60041 Forward-port of r52136,52138: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents: 39984
diff changeset
557 * negative long (it's a signed overflow case), and some compilers care.
6ba402b60041 Forward-port of r52136,52138: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents: 39984
diff changeset
558 * So we cast x to unsigned long first. However, then other compilers
6ba402b60041 Forward-port of r52136,52138: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents: 39984
diff changeset
559 * warn about applying unary minus to an unsigned operand. Hence the
6ba402b60041 Forward-port of r52136,52138: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents: 39984
diff changeset
560 * weird "0-".
6ba402b60041 Forward-port of r52136,52138: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents: 39984
diff changeset
561 */
6ba402b60041 Forward-port of r52136,52138: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents: 39984
diff changeset
562 #define UNARY_NEG_WOULD_OVERFLOW(x) \
6ba402b60041 Forward-port of r52136,52138: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents: 39984
diff changeset
563 ((x) < 0 && (unsigned long)(x) == 0-(unsigned long)(x))
6ba402b60041 Forward-port of r52136,52138: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents: 39984
diff changeset
564
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
565 /* 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
566 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
567 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
568 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
569 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
570 };
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
571
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
572 static enum divmod_result
18146
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
573 i_divmod(register long x, register long y,
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
574 long *p_xdivy, long *p_xmody)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
575 {
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
576 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
577
18146
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
578 if (y == 0) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
579 PyErr_SetString(PyExc_ZeroDivisionError,
15318
8aa947e1eee8 Ka-Ping Yee <ping@lfw.org>:
Fred Drake <fdrake@acm.org>
parents: 15041
diff changeset
580 "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
581 return DIVMOD_ERROR;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
582 }
18146
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
583 /* (-sys.maxint-1)/-1 is the only overflow case. */
39995
6ba402b60041 Forward-port of r52136,52138: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents: 39984
diff changeset
584 if (y == -1 && UNARY_NEG_WOULD_OVERFLOW(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
585 return DIVMOD_OVERFLOW;
18146
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
586 xdivy = x / y;
57568
d587a4e5ba5a Merged revisions 76665 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 57534
diff changeset
587 /* xdiv*y can overflow on platforms where x/y gives floor(x/y)
d587a4e5ba5a Merged revisions 76665 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 57534
diff changeset
588 * for x and y with differing signs. (This is unusual
d587a4e5ba5a Merged revisions 76665 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 57534
diff changeset
589 * behaviour, and C99 prohibits it, but it's allowed by C89;
d587a4e5ba5a Merged revisions 76665 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 57534
diff changeset
590 * for an example of overflow, take x = LONG_MIN, y = 5 or x =
d587a4e5ba5a Merged revisions 76665 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 57534
diff changeset
591 * LONG_MAX, y = -5.) However, x - xdivy*y is always
d587a4e5ba5a Merged revisions 76665 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 57534
diff changeset
592 * representable as a long, since it lies strictly between
d587a4e5ba5a Merged revisions 76665 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 57534
diff changeset
593 * -abs(y) and abs(y). We add casts to avoid intermediate
d587a4e5ba5a Merged revisions 76665 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 57534
diff changeset
594 * overflow.
d587a4e5ba5a Merged revisions 76665 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 57534
diff changeset
595 */
d587a4e5ba5a Merged revisions 76665 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 57534
diff changeset
596 xmody = (long)(x - (unsigned long)xdivy * y);
18146
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
597 /* 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
598 * 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
599 * 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
600 * 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
601 */
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
602 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
603 xmody += y;
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
604 --xdivy;
b51b4c2bf5f9 SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents: 16997
diff changeset
605 assert(xmody && ((y ^ xmody) >= 0));
229
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
606 }
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
607 *p_xdivy = xdivy;
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
608 *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
609 return DIVMOD_OK;
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
610 }
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
611
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
612 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
613 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
614 {
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
615 long xi, yi;
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
616 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
617 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
618 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
619 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
620 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
621 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
622 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
623 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
624 (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
625 default:
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
626 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
627 }
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
628 }
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
629
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
630 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
631 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
632 {
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
633 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
634 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
635 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
636 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
637 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
638 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
639 return NULL;
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
640 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
641 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
642 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
643 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
644 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
645 (PyObject *)y);
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
646 default:
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
647 return NULL;
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
648 }
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
649 }
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
650
c0a44829bcd5 Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents: 19590
diff changeset
651 static PyObject *
19676
c768d3191df1 Move int_true_divide next to the other division routines.
Tim Peters <tim.peters@gmail.com>
parents: 19666
diff changeset
652 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
653 {
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
654 /* 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
655 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
656 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
657 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
658 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
659 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
660 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
661 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
662 }
c768d3191df1 Move int_true_divide next to the other division routines.
Tim Peters <tim.peters@gmail.com>
parents: 19666
diff changeset
663
c768d3191df1 Move int_true_divide next to the other division routines.
Tim Peters <tim.peters@gmail.com>
parents: 19666
diff changeset
664 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
665 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
666 {
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
667 long xi, yi;
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
668 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
669 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
670 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
671 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
672 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
673 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
674 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
675 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
676 (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
677 default:
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
678 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
679 }
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
680 }
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
681
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
682 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
683 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
684 {
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
685 long xi, yi;
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
686 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
687 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
688 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
689 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
690 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
691 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
692 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
693 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
694 (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
695 default:
610
dcc6de1c37a4 Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents: 589
diff changeset
696 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
697 }
229
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
698 }
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
699
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
700 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
701 int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
702 {
4606
739b8480f1ac Fix core dump from pow(x,y,0).
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
703 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
704 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
705 CONVERT_TO_LONG(w, iw);
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
706 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
707 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
708 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
709 "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
710 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
711 }
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
712 /* 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
713 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
714 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
715 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
716 (PyObject *)v, (PyObject *)w, (PyObject *)z);
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
717 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
718 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
719 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
720 if (iz == 0) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
721 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
722 "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
723 return NULL;
739b8480f1ac Fix core dump from pow(x,y,0).
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
724 }
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
725 }
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
726 /*
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
727 * XXX: The original exponentiation code stopped looping
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
728 * 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
729 * 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
730 * 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
731 * will compensate for the slight inefficiency.
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
732 * 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
733 */
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
734 temp = iv;
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
735 ix = 1;
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
736 while (iw > 0) {
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
737 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
738 if (iw & 1) {
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
739 ix = ix*temp;
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
740 if (temp == 0)
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
741 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
742 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
743 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
744 (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
745 (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
746 (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
747 }
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
748 }
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
749 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
750 if (iw==0) break;
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
751 prev = temp;
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
752 temp *= temp; /* Square the value of temp */
33256
6641d0542592 Stop producing or using OverflowWarning. PEP 237 thought this would
Tim Peters <tim.peters@gmail.com>
parents: 32759
diff changeset
753 if (prev != 0 && temp / prev != prev) {
19435
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
754 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
755 (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
756 }
4606
739b8480f1ac Fix core dump from pow(x,y,0).
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
757 if (iz) {
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
758 /* 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
759 ix = ix % iz;
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
760 temp = temp % iz;
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
761 }
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
762 }
4606
739b8480f1ac Fix core dump from pow(x,y,0).
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
763 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
764 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
765 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
766 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
767 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
768 break;
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
769 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
770 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
771 (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
772 default:
dad3209ce973 Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents: 19343
diff changeset
773 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
774 }
1838
5f6acd1ab5c5 mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents: 1448
diff changeset
775 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
776 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
777 }
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
778
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
779 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
780 int_neg(PyIntObject *v)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
781 {
39984
ca887d55c592 Fix integer negation and absolute value to not rely
Martin v. Löwis <martin@v.loewis.de>
parents: 39741
diff changeset
782 register long a;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
783 a = v->ob_ival;
39995
6ba402b60041 Forward-port of r52136,52138: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents: 39984
diff changeset
784 /* check for overflow */
6ba402b60041 Forward-port of r52136,52138: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents: 39984
diff changeset
785 if (UNARY_NEG_WOULD_OVERFLOW(a)) {
33256
6641d0542592 Stop producing or using OverflowWarning. PEP 237 thought this would
Tim Peters <tim.peters@gmail.com>
parents: 32759
diff changeset
786 PyObject *o = PyLong_FromLong(a);
27301
5a975e82d70f SF # 669553, fix memory (ref) leaks
Neal Norwitz <nnorwitz@gmail.com>
parents: 26923
diff changeset
787 if (o != NULL) {
5a975e82d70f SF # 669553, fix memory (ref) leaks
Neal Norwitz <nnorwitz@gmail.com>
parents: 26923
diff changeset
788 PyObject *result = PyNumber_Negative(o);
5a975e82d70f SF # 669553, fix memory (ref) leaks
Neal Norwitz <nnorwitz@gmail.com>
parents: 26923
diff changeset
789 Py_DECREF(o);
5a975e82d70f SF # 669553, fix memory (ref) leaks
Neal Norwitz <nnorwitz@gmail.com>
parents: 26923
diff changeset
790 return result;
5a975e82d70f SF # 669553, fix memory (ref) leaks
Neal Norwitz <nnorwitz@gmail.com>
parents: 26923
diff changeset
791 }
5a975e82d70f SF # 669553, fix memory (ref) leaks
Neal Norwitz <nnorwitz@gmail.com>
parents: 26923
diff changeset
792 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
793 }
39984
ca887d55c592 Fix integer negation and absolute value to not rely
Martin v. Löwis <martin@v.loewis.de>
parents: 39741
diff changeset
794 return PyInt_FromLong(-a);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
795 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
796
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
797 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
798 int_abs(PyIntObject *v)
229
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
799 {
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
800 if (v->ob_ival >= 0)
44432
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
801 return int_int(v);
229
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
802 else
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
803 return int_neg(v);
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
804 }
08597e2b63d3 Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
805
240
0aad3a7b97ef Added nonzero test
Guido van Rossum <guido@python.org>
parents: 229
diff changeset
806 static int
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
807 int_nonzero(PyIntObject *v)
240
0aad3a7b97ef Added nonzero test
Guido van Rossum <guido@python.org>
parents: 229
diff changeset
808 {
0aad3a7b97ef Added nonzero test
Guido van Rossum <guido@python.org>
parents: 229
diff changeset
809 return v->ob_ival != 0;
0aad3a7b97ef Added nonzero test
Guido van Rossum <guido@python.org>
parents: 229
diff changeset
810 }
0aad3a7b97ef Added nonzero test
Guido van Rossum <guido@python.org>
parents: 229
diff changeset
811
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
812 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
813 int_invert(PyIntObject *v)
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
814 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
815 return PyInt_FromLong(~v->ob_ival);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
816 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
817
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
818 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
819 int_lshift(PyIntObject *v, PyIntObject *w)
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
820 {
24736
ff05eef3a6d1 Implement stage B0 of PEP 237: add warnings for operations that
Guido van Rossum <guido@python.org>
parents: 24702
diff changeset
821 long a, b, c;
32418
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
822 PyObject *vv, *ww, *result;
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
823
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
824 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
825 CONVERT_TO_LONG(w, b);
589
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
826 if (b < 0) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
827 PyErr_SetString(PyExc_ValueError, "negative shift count");
589
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
828 return NULL;
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
829 }
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
830 if (a == 0 || b == 0)
44432
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
831 return int_int(v);
1365
a5fc104849aa Changes to make range checks portable to 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 1352
diff changeset
832 if (b >= LONG_BIT) {
32418
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
833 vv = PyLong_FromLong(PyInt_AS_LONG(v));
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
834 if (vv == NULL)
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
835 return NULL;
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
836 ww = PyLong_FromLong(PyInt_AS_LONG(w));
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
837 if (ww == NULL) {
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
838 Py_DECREF(vv);
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
839 return NULL;
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
840 }
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
841 result = PyNumber_Lshift(vv, ww);
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
842 Py_DECREF(vv);
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
843 Py_DECREF(ww);
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
844 return result;
589
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
845 }
24742
c659f04ee499 int_lshift(): Simplified/sped overflow-checking.
Tim Peters <tim.peters@gmail.com>
parents: 24738
diff changeset
846 c = a << b;
c659f04ee499 int_lshift(): Simplified/sped overflow-checking.
Tim Peters <tim.peters@gmail.com>
parents: 24738
diff changeset
847 if (a != Py_ARITHMETIC_RIGHT_SHIFT(long, c, b)) {
32418
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
848 vv = PyLong_FromLong(PyInt_AS_LONG(v));
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
849 if (vv == NULL)
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
850 return NULL;
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
851 ww = PyLong_FromLong(PyInt_AS_LONG(w));
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
852 if (ww == NULL) {
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
853 Py_DECREF(vv);
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
854 return NULL;
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
855 }
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
856 result = PyNumber_Lshift(vv, ww);
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
857 Py_DECREF(vv);
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
858 Py_DECREF(ww);
255a71f2d215 SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents: 32269
diff changeset
859 return result;
24736
ff05eef3a6d1 Implement stage B0 of PEP 237: add warnings for operations that
Guido van Rossum <guido@python.org>
parents: 24702
diff changeset
860 }
ff05eef3a6d1 Implement stage B0 of PEP 237: add warnings for operations that
Guido van Rossum <guido@python.org>
parents: 24702
diff changeset
861 return PyInt_FromLong(c);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
862 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
863
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
864 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
865 int_rshift(PyIntObject *v, PyIntObject *w)
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
866 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
867 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
868 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
869 CONVERT_TO_LONG(w, b);
589
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
870 if (b < 0) {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
871 PyErr_SetString(PyExc_ValueError, "negative shift count");
589
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
872 return NULL;
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
873 }
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
874 if (a == 0 || b == 0)
44432
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
875 return int_int(v);
1365
a5fc104849aa Changes to make range checks portable to 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 1352
diff changeset
876 if (b >= LONG_BIT) {
589
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
877 if (a < 0)
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
878 a = -1;
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
879 else
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
880 a = 0;
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
881 }
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
882 else {
13423
a87803eb9dfb Cray J90 fixes for long ints.
Tim Peters <tim.peters@gmail.com>
parents: 13256
diff changeset
883 a = Py_ARITHMETIC_RIGHT_SHIFT(long, a, b);
589
6077704dab7a Different shift implementation.
Guido van Rossum <guido@python.org>
parents: 471
diff changeset
884 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
885 return PyInt_FromLong(a);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
886 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
887
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
888 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
889 int_and(PyIntObject *v, PyIntObject *w)
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
890 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
891 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
892 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
893 CONVERT_TO_LONG(w, b);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
894 return PyInt_FromLong(a & b);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
895 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
896
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
897 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
898 int_xor(PyIntObject *v, PyIntObject *w)
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
899 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
900 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
901 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
902 CONVERT_TO_LONG(w, b);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
903 return PyInt_FromLong(a ^ b);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
904 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
905
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
906 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
907 int_or(PyIntObject *v, PyIntObject *w)
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
908 {
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
909 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
910 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
911 CONVERT_TO_LONG(w, b);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
912 return PyInt_FromLong(a | b);
409
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
913 }
b5fe6482072f Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
914
19976
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
915 static int
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
916 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
917 {
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
918 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
919 Py_INCREF(*pv);
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
920 Py_INCREF(*pw);
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
921 return 0;
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
922 }
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
923 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
924 }
da00188d5270 Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents: 19925
diff changeset
925
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
926 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
927 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
928 {
34931
9a1b1e1ae653 Make subclasses of int, long, complex, float, and unicode perform type
Brett Cannon <bcannon@gmail.com>
parents: 33256
diff changeset
929 if (PyInt_CheckExact(v))
9a1b1e1ae653 Make subclasses of int, long, complex, float, and unicode perform type
Brett Cannon <bcannon@gmail.com>
parents: 33256
diff changeset
930 Py_INCREF(v);
9a1b1e1ae653 Make subclasses of int, long, complex, float, and unicode perform type
Brett Cannon <bcannon@gmail.com>
parents: 33256
diff changeset
931 else
9a1b1e1ae653 Make subclasses of int, long, complex, float, and unicode perform type
Brett Cannon <bcannon@gmail.com>
parents: 33256
diff changeset
932 v = (PyIntObject *)PyInt_FromLong(v->ob_ival);
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
933 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
934 }
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
935
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
936 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
937 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
938 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
939 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
940 }
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
941
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
942 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
943 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
944 {
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
945 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
946 }
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
947
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
948 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
949 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
950 {
45262
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
951 return _PyInt_Format(v, 8, 0);
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
952 }
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
953
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
954 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13423
diff changeset
955 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
956 {
45262
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
957 return _PyInt_Format(v, 16, 0);
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
958 }
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
959
24280
1598a1e473e2 staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23832
diff changeset
960 static PyObject *
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
961 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
962
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
963 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
964 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
965 {
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
966 PyObject *x = NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
967 int base = -909;
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36645
diff changeset
968 static char *kwlist[] = {"x", "base", 0};
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
969
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
970 if (type != &PyInt_Type)
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
971 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
972 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
973 &x, &base))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
974 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
975 if (x == NULL)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
976 return PyInt_FromLong(0L);
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
977 if (base == -909)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
978 return PyNumber_Int(x);
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47392
diff changeset
979 if (PyString_Check(x)) {
40103
4159386f8dbd Bug #1545497: when given an explicit base, int() did ignore NULs
Georg Brandl <georg@python.org>
parents: 39995
diff changeset
980 /* Since PyInt_FromString doesn't have a length parameter,
4159386f8dbd Bug #1545497: when given an explicit base, int() did ignore NULs
Georg Brandl <georg@python.org>
parents: 39995
diff changeset
981 * check here for possible NULs in the string. */
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47392
diff changeset
982 char *string = PyString_AS_STRING(x);
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47392
diff changeset
983 if (strlen(string) != PyString_Size(x)) {
40103
4159386f8dbd Bug #1545497: when given an explicit base, int() did ignore NULs
Georg Brandl <georg@python.org>
parents: 39995
diff changeset
984 /* create a repr() of the input string,
4159386f8dbd Bug #1545497: when given an explicit base, int() did ignore NULs
Georg Brandl <georg@python.org>
parents: 39995
diff changeset
985 * just like PyInt_FromString does */
4159386f8dbd Bug #1545497: when given an explicit base, int() did ignore NULs
Georg Brandl <georg@python.org>
parents: 39995
diff changeset
986 PyObject *srepr;
4159386f8dbd Bug #1545497: when given an explicit base, int() did ignore NULs
Georg Brandl <georg@python.org>
parents: 39995
diff changeset
987 srepr = PyObject_Repr(x);
4159386f8dbd Bug #1545497: when given an explicit base, int() did ignore NULs
Georg Brandl <georg@python.org>
parents: 39995
diff changeset
988 if (srepr == NULL)
4159386f8dbd Bug #1545497: when given an explicit base, int() did ignore NULs
Georg Brandl <georg@python.org>
parents: 39995
diff changeset
989 return NULL;
4159386f8dbd Bug #1545497: when given an explicit base, int() did ignore NULs
Georg Brandl <georg@python.org>
parents: 39995
diff changeset
990 PyErr_Format(PyExc_ValueError,
4159386f8dbd Bug #1545497: when given an explicit base, int() did ignore NULs
Georg Brandl <georg@python.org>
parents: 39995
diff changeset
991 "invalid literal for int() with base %d: %s",
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47392
diff changeset
992 base, PyString_AS_STRING(srepr));
40103
4159386f8dbd Bug #1545497: when given an explicit base, int() did ignore NULs
Georg Brandl <georg@python.org>
parents: 39995
diff changeset
993 Py_DECREF(srepr);
4159386f8dbd Bug #1545497: when given an explicit base, int() did ignore NULs
Georg Brandl <georg@python.org>
parents: 39995
diff changeset
994 return NULL;
4159386f8dbd Bug #1545497: when given an explicit base, int() did ignore NULs
Georg Brandl <georg@python.org>
parents: 39995
diff changeset
995 }
4159386f8dbd Bug #1545497: when given an explicit base, int() did ignore NULs
Georg Brandl <georg@python.org>
parents: 39995
diff changeset
996 return PyInt_FromString(string, NULL, base);
4159386f8dbd Bug #1545497: when given an explicit base, int() did ignore NULs
Georg Brandl <georg@python.org>
parents: 39995
diff changeset
997 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19051
diff changeset
998 #ifdef Py_USING_UNICODE
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
999 if (PyUnicode_Check(x))
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1000 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
1001 PyUnicode_GET_SIZE(x),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1002 base);
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19051
diff changeset
1003 #endif
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1004 PyErr_SetString(PyExc_TypeError,
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1005 "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
1006 return NULL;
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1007 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1008
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
1009 /* 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
1010 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
1011 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
1012 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
1013 */
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
1014 static PyObject *
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
1015 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
1016 {
37589
aeee85b6a5dd More C++-compliance. Note especially listobject.c - to get C++ to accept the
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37304
diff changeset
1017 PyObject *tmp, *newobj;
27779
fc5a60a61e32 Fix SF bug #683467, 'int' ability to generate longs not inherited
Neal Norwitz <nnorwitz@gmail.com>
parents: 27521
diff changeset
1018 long ival;
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
1019
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
1020 assert(PyType_IsSubtype(type, &PyInt_Type));
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
1021 tmp = int_new(&PyInt_Type, args, kwds);
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
1022 if (tmp == NULL)
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
1023 return NULL;
27779
fc5a60a61e32 Fix SF bug #683467, 'int' ability to generate longs not inherited
Neal Norwitz <nnorwitz@gmail.com>
parents: 27521
diff changeset
1024 if (!PyInt_Check(tmp)) {
fc5a60a61e32 Fix SF bug #683467, 'int' ability to generate longs not inherited
Neal Norwitz <nnorwitz@gmail.com>
parents: 27521
diff changeset
1025 ival = PyLong_AsLong(tmp);
30131
c33d3689ed5b Add a couple of decrefs to error paths.
Michael W. Hudson <mwh@python.net>
parents: 29641
diff changeset
1026 if (ival == -1 && PyErr_Occurred()) {
c33d3689ed5b Add a couple of decrefs to error paths.
Michael W. Hudson <mwh@python.net>
parents: 29641
diff changeset
1027 Py_DECREF(tmp);
27779
fc5a60a61e32 Fix SF bug #683467, 'int' ability to generate longs not inherited
Neal Norwitz <nnorwitz@gmail.com>
parents: 27521
diff changeset
1028 return NULL;
30131
c33d3689ed5b Add a couple of decrefs to error paths.
Michael W. Hudson <mwh@python.net>
parents: 29641
diff changeset
1029 }
27779
fc5a60a61e32 Fix SF bug #683467, 'int' ability to generate longs not inherited
Neal Norwitz <nnorwitz@gmail.com>
parents: 27521
diff changeset
1030 } else {
fc5a60a61e32 Fix SF bug #683467, 'int' ability to generate longs not inherited
Neal Norwitz <nnorwitz@gmail.com>
parents: 27521
diff changeset
1031 ival = ((PyIntObject *)tmp)->ob_ival;
fc5a60a61e32 Fix SF bug #683467, 'int' ability to generate longs not inherited
Neal Norwitz <nnorwitz@gmail.com>
parents: 27521
diff changeset
1032 }
fc5a60a61e32 Fix SF bug #683467, 'int' ability to generate longs not inherited
Neal Norwitz <nnorwitz@gmail.com>
parents: 27521
diff changeset
1033
37589
aeee85b6a5dd More C++-compliance. Note especially listobject.c - to get C++ to accept the
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37304
diff changeset
1034 newobj = type->tp_alloc(type, 0);
aeee85b6a5dd More C++-compliance. Note especially listobject.c - to get C++ to accept the
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37304
diff changeset
1035 if (newobj == NULL) {
29641
4909aa64405f SF patch 703666: Several objects don't decref tmp on failure in subtype_new
Raymond Hettinger <python@rcn.com>
parents: 28652
diff changeset
1036 Py_DECREF(tmp);
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
1037 return NULL;
29641
4909aa64405f SF patch 703666: Several objects don't decref tmp on failure in subtype_new
Raymond Hettinger <python@rcn.com>
parents: 28652
diff changeset
1038 }
37589
aeee85b6a5dd More C++-compliance. Note especially listobject.c - to get C++ to accept the
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37304
diff changeset
1039 ((PyIntObject *)newobj)->ob_ival = ival;
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
1040 Py_DECREF(tmp);
37589
aeee85b6a5dd More C++-compliance. Note especially listobject.c - to get C++ to accept the
Anthony Baxter <anthonybaxter@gmail.com>
parents: 37304
diff changeset
1041 return newobj;
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
1042 }
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
1043
27521
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 27301
diff changeset
1044 static PyObject *
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 27301
diff changeset
1045 int_getnewargs(PyIntObject *v)
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 27301
diff changeset
1046 {
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 27301
diff changeset
1047 return Py_BuildValue("(l)", v->ob_ival);
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 27301
diff changeset
1048 }
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 27301
diff changeset
1049
44432
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1050 static PyObject *
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1051 int_getN(PyIntObject *v, void *context) {
45815
8a3fa86c30a6 Fix build on platforms that don't have intptr_t. Patch by Joseph Armbruster.
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45381
diff changeset
1052 return PyInt_FromLong((Py_intptr_t)context);
44432
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1053 }
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1054
45262
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1055 /* Convert an integer to the given base. Returns a string.
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1056 If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'.
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1057 If newstyle is zero, then use the pre-2.6 behavior of octal having
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1058 a leading "0" */
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1059 PyAPI_FUNC(PyObject*)
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1060 _PyInt_Format(PyIntObject *v, int base, int newstyle)
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1061 {
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1062 /* There are no doubt many, many ways to optimize this, using code
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1063 similar to _PyLong_Format */
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1064 long n = v->ob_ival;
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1065 int negative = n < 0;
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1066 int is_zero = n == 0;
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1067
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1068 /* For the reasoning behind this size, see
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1069 http://c-faq.com/misc/hexio.html. Then, add a few bytes for
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1070 the possible sign and prefix "0[box]" */
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1071 char buf[sizeof(n)*CHAR_BIT+6];
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1072
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1073 /* Start by pointing to the end of the buffer. We fill in from
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1074 the back forward. */
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1075 char* p = &buf[sizeof(buf)];
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1076
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1077 assert(base >= 2 && base <= 36);
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1078
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1079 do {
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1080 /* I'd use i_divmod, except it doesn't produce the results
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1081 I want when n is negative. So just duplicate the salient
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1082 part here. */
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1083 long div = n / base;
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1084 long mod = n - div * base;
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1085
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1086 /* convert abs(mod) to the right character in [0-9, a-z] */
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1087 char cdigit = (char)(mod < 0 ? -mod : mod);
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1088 cdigit += (cdigit < 10) ? '0' : 'a'-10;
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1089 *--p = cdigit;
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1090
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1091 n = div;
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1092 } while(n);
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1093
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1094 if (base == 2) {
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1095 *--p = 'b';
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1096 *--p = '0';
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1097 }
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1098 else if (base == 8) {
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1099 if (newstyle) {
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1100 *--p = 'o';
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1101 *--p = '0';
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1102 }
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1103 else
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1104 if (!is_zero)
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1105 *--p = '0';
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1106 }
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1107 else if (base == 16) {
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1108 *--p = 'x';
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1109 *--p = '0';
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1110 }
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1111 else if (base != 10) {
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1112 *--p = '#';
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1113 *--p = '0' + base%10;
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1114 if (base > 10)
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1115 *--p = '0' + base/10;
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1116 }
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1117 if (negative)
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1118 *--p = '-';
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1119
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47392
diff changeset
1120 return PyString_FromStringAndSize(p, &buf[sizeof(buf)] - p);
45262
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1121 }
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45143
diff changeset
1122
45381
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1123 static PyObject *
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1124 int__format__(PyObject *self, PyObject *args)
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1125 {
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1126 PyObject *format_spec;
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1127
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1128 if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1129 return NULL;
47294
4fe192d48960 Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 46473
diff changeset
1130 if (PyBytes_Check(format_spec))
47392
47ef9a806ce9 Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents: 47294
diff changeset
1131 return _PyInt_FormatAdvanced(self,
47ef9a806ce9 Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents: 47294
diff changeset
1132 PyBytes_AS_STRING(format_spec),
47ef9a806ce9 Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents: 47294
diff changeset
1133 PyBytes_GET_SIZE(format_spec));
45381
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1134 if (PyUnicode_Check(format_spec)) {
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1135 /* Convert format_spec to a str */
47392
47ef9a806ce9 Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents: 47294
diff changeset
1136 PyObject *result;
47ef9a806ce9 Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents: 47294
diff changeset
1137 PyObject *str_spec = PyObject_Str(format_spec);
45381
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1138
47392
47ef9a806ce9 Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents: 47294
diff changeset
1139 if (str_spec == NULL)
47ef9a806ce9 Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents: 47294
diff changeset
1140 return NULL;
45381
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1141
47392
47ef9a806ce9 Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents: 47294
diff changeset
1142 result = _PyInt_FormatAdvanced(self,
47ef9a806ce9 Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents: 47294
diff changeset
1143 PyBytes_AS_STRING(str_spec),
47ef9a806ce9 Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents: 47294
diff changeset
1144 PyBytes_GET_SIZE(str_spec));
45381
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1145
47392
47ef9a806ce9 Refactor and clean up str.format() code (and helpers) in advance of optimizations.
Eric Smith <eric@trueblade.com>
parents: 47294
diff changeset
1146 Py_DECREF(str_spec);
45381
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1147 return result;
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1148 }
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1149 PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1150 return NULL;
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1151 }
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1152
46473
5bc7b20dc04a I finally got the time to update and merge Mark's and my trunk-math branch. The patch is collaborated work of Mark Dickinson and me. It was mostly done a few months ago. The patch fixes a lot of loose ends and edge cases related to operations with NaN, INF, very small values and complex math.
Christian Heimes <christian@cheimes.de>
parents: 46135
diff changeset
1153 #if 0
5bc7b20dc04a I finally got the time to update and merge Mark's and my trunk-math branch. The patch is collaborated work of Mark Dickinson and me. It was mostly done a few months ago. The patch fixes a lot of loose ends and edge cases related to operations with NaN, INF, very small values and complex math.
Christian Heimes <christian@cheimes.de>
parents: 46135
diff changeset
1154 static PyObject *
5bc7b20dc04a I finally got the time to update and merge Mark's and my trunk-math branch. The patch is collaborated work of Mark Dickinson and me. It was mostly done a few months ago. The patch fixes a lot of loose ends and edge cases related to operations with NaN, INF, very small values and complex math.
Christian Heimes <christian@cheimes.de>
parents: 46135
diff changeset
1155 int_is_finite(PyObject *v)
5bc7b20dc04a I finally got the time to update and merge Mark's and my trunk-math branch. The patch is collaborated work of Mark Dickinson and me. It was mostly done a few months ago. The patch fixes a lot of loose ends and edge cases related to operations with NaN, INF, very small values and complex math.
Christian Heimes <christian@cheimes.de>
parents: 46135
diff changeset
1156 {
5bc7b20dc04a I finally got the time to update and merge Mark's and my trunk-math branch. The patch is collaborated work of Mark Dickinson and me. It was mostly done a few months ago. The patch fixes a lot of loose ends and edge cases related to operations with NaN, INF, very small values and complex math.
Christian Heimes <christian@cheimes.de>
parents: 46135
diff changeset
1157 Py_RETURN_TRUE;
5bc7b20dc04a I finally got the time to update and merge Mark's and my trunk-math branch. The patch is collaborated work of Mark Dickinson and me. It was mostly done a few months ago. The patch fixes a lot of loose ends and edge cases related to operations with NaN, INF, very small values and complex math.
Christian Heimes <christian@cheimes.de>
parents: 46135
diff changeset
1158 }
5bc7b20dc04a I finally got the time to update and merge Mark's and my trunk-math branch. The patch is collaborated work of Mark Dickinson and me. It was mostly done a few months ago. The patch fixes a lot of loose ends and edge cases related to operations with NaN, INF, very small values and complex math.
Christian Heimes <christian@cheimes.de>
parents: 46135
diff changeset
1159 #endif
5bc7b20dc04a I finally got the time to update and merge Mark's and my trunk-math branch. The patch is collaborated work of Mark Dickinson and me. It was mostly done a few months ago. The patch fixes a lot of loose ends and edge cases related to operations with NaN, INF, very small values and complex math.
Christian Heimes <christian@cheimes.de>
parents: 46135
diff changeset
1160
27521
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 27301
diff changeset
1161 static PyMethodDef int_methods[] = {
44432
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1162 {"conjugate", (PyCFunction)int_int, METH_NOARGS,
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1163 "Returns self, the complex conjugate of any int."},
46473
5bc7b20dc04a I finally got the time to update and merge Mark's and my trunk-math branch. The patch is collaborated work of Mark Dickinson and me. It was mostly done a few months ago. The patch fixes a lot of loose ends and edge cases related to operations with NaN, INF, very small values and complex math.
Christian Heimes <christian@cheimes.de>
parents: 46135
diff changeset
1164 #if 0
5bc7b20dc04a I finally got the time to update and merge Mark's and my trunk-math branch. The patch is collaborated work of Mark Dickinson and me. It was mostly done a few months ago. The patch fixes a lot of loose ends and edge cases related to operations with NaN, INF, very small values and complex math.
Christian Heimes <christian@cheimes.de>
parents: 46135
diff changeset
1165 {"is_finite", (PyCFunction)int_is_finite, METH_NOARGS,
5bc7b20dc04a I finally got the time to update and merge Mark's and my trunk-math branch. The patch is collaborated work of Mark Dickinson and me. It was mostly done a few months ago. The patch fixes a lot of loose ends and edge cases related to operations with NaN, INF, very small values and complex math.
Christian Heimes <christian@cheimes.de>
parents: 46135
diff changeset
1166 "Returns always True."},
5bc7b20dc04a I finally got the time to update and merge Mark's and my trunk-math branch. The patch is collaborated work of Mark Dickinson and me. It was mostly done a few months ago. The patch fixes a lot of loose ends and edge cases related to operations with NaN, INF, very small values and complex math.
Christian Heimes <christian@cheimes.de>
parents: 46135
diff changeset
1167 #endif
44432
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1168 {"__trunc__", (PyCFunction)int_int, METH_NOARGS,
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1169 "Truncating an Integral returns itself."},
27521
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 27301
diff changeset
1170 {"__getnewargs__", (PyCFunction)int_getnewargs, METH_NOARGS},
45381
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45262
diff changeset
1171 {"__format__", (PyCFunction)int__format__, METH_VARARGS},
27521
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 27301
diff changeset
1172 {NULL, NULL} /* sentinel */
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 27301
diff changeset
1173 };
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 27301
diff changeset
1174
44432
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1175 static PyGetSetDef int_getset[] = {
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1176 {"real",
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1177 (getter)int_int, (setter)NULL,
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1178 "the real part of a complex number",
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1179 NULL},
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1180 {"imag",
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1181 (getter)int_getN, (setter)NULL,
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1182 "the imaginary part of a complex number",
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1183 (void*)0},
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1184 {"numerator",
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1185 (getter)int_int, (setter)NULL,
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1186 "the numerator of a rational number in lowest terms",
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1187 NULL},
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1188 {"denominator",
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1189 (getter)int_getN, (setter)NULL,
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1190 "the denominator of a rational number in lowest terms",
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1191 (void*)1},
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1192 {NULL} /* Sentinel */
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1193 };
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1194
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23299
diff changeset
1195 PyDoc_STRVAR(int_doc,
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1196 "int(x[, base]) -> integer\n\
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1197 \n\
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1198 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
1199 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
1200 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
1201 the optional base. It is an error to supply a base when converting a\n\
40586
b4ba7249aba5 Minor change in int() docstring for proper spacing.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 40585
diff changeset
1202 non-string. If base is zero, the proper base is guessed based on the\n\
40585
667bd027d800 Mention in the int() docstring that a base zero has meaning, as
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 40103
diff changeset
1203 string content. If the argument is outside the integer range a\n\
667bd027d800 Mention in the int() docstring that a base zero has meaning, as
Gustavo Niemeyer <gustavo@niemeyer.net>
parents: 40103
diff changeset
1204 long object will be returned instead.");
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1205
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
1206 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
1207 (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
1208 (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
1209 (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
1210 (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
1211 (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
1212 (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
1213 (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
1214 (unaryfunc)int_neg, /*nb_negative*/
44432
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1215 (unaryfunc)int_int, /*nb_positive*/
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
1216 (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
1217 (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
1218 (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
1219 (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
1220 (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
1221 (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
1222 (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
1223 (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
1224 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
1225 (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
1226 (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
1227 (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
1228 (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
1229 (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
1230 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
1231 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
1232 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
1233 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
1234 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
1235 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
1236 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
1237 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
1238 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
1239 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
1240 0, /*nb_inplace_or*/
19051
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1241 (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
1242 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
1243 0, /* nb_inplace_floor_divide */
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1244 0, /* nb_inplace_true_divide */
39463
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 37815
diff changeset
1245 (unaryfunc)int_int, /* nb_index */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1246 };
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1247
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
1248 PyTypeObject PyInt_Type = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 41733
diff changeset
1249 PyVarObject_HEAD_INIT(&PyType_Type, 0)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1250 "int",
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4952
diff changeset
1251 sizeof(PyIntObject),
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1252 0,
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1253 (destructor)int_dealloc, /* tp_dealloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1254 (printfunc)int_print, /* tp_print */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1255 0, /* tp_getattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1256 0, /* tp_setattr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1257 (cmpfunc)int_compare, /* tp_compare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1258 (reprfunc)int_repr, /* tp_repr */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1259 &int_as_number, /* tp_as_number */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1260 0, /* tp_as_sequence */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1261 0, /* tp_as_mapping */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1262 (hashfunc)int_hash, /* tp_hash */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1263 0, /* tp_call */
21858
d521cf0899c8 Bugfix candidate.
Guido van Rossum <guido@python.org>
parents: 21206
diff changeset
1264 (reprfunc)int_repr, /* tp_str */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1265 PyObject_GenericGetAttr, /* tp_getattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1266 0, /* tp_setattro */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1267 0, /* tp_as_buffer */
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
1268 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
40908
d01bd37bf5ce Variation of patch # 1624059 to speed up checking if an object is a subclass
Neal Norwitz <nnorwitz@gmail.com>
parents: 40586
diff changeset
1269 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_INT_SUBCLASS, /* tp_flags */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1270 int_doc, /* tp_doc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1271 0, /* tp_traverse */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1272 0, /* tp_clear */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1273 0, /* tp_richcompare */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1274 0, /* tp_weaklistoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1275 0, /* tp_iter */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1276 0, /* tp_iternext */
27521
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 27301
diff changeset
1277 int_methods, /* tp_methods */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1278 0, /* tp_members */
44432
4f9723d9ca32 Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 44350
diff changeset
1279 int_getset, /* tp_getset */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1280 0, /* tp_base */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1281 0, /* tp_dict */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1282 0, /* tp_descr_get */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1283 0, /* tp_descr_set */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1284 0, /* tp_dictoffset */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1285 0, /* tp_init */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1286 0, /* tp_alloc */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18755
diff changeset
1287 int_new, /* tp_new */
23279
200559fcc664 Make sure that tp_free frees the int the same way as tp_dealloc would.
Guido van Rossum <guido@python.org>
parents: 22785
diff changeset
1288 (freefunc)int_free, /* tp_free */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1289 };
5936
80d24364b932 Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
1290
26889
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1291 int
26923
dbfc3ef7d003 Since the *_Init() are private, prefix with _, suggested by Skip
Neal Norwitz <nnorwitz@gmail.com>
parents: 26889
diff changeset
1292 _PyInt_Init(void)
26889
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1293 {
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1294 PyIntObject *v;
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1295 int ival;
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1296 #if NSMALLNEGINTS + NSMALLPOSINTS > 0
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1297 for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++) {
31483
65d28fff1172 SF patch #875689: >100k alloc wasted on startup
Raymond Hettinger <python@rcn.com>
parents: 31042
diff changeset
1298 if (!free_list && (free_list = fill_free_list()) == NULL)
26889
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1299 return 0;
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1300 /* PyObject_New is inlined */
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1301 v = free_list;
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43378
diff changeset
1302 free_list = (PyIntObject *)Py_TYPE(v);
26889
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1303 PyObject_INIT(v, &PyInt_Type);
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1304 v->ob_ival = ival;
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1305 small_ints[ival + NSMALLNEGINTS] = v;
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1306 }
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1307 #endif
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1308 return 1;
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1309 }
12753e7b15f7 SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents: 26867
diff changeset
1310
47897
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1311 int
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1312 PyInt_ClearFreeList(void)
5936
80d24364b932 Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
1313 {
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1314 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
1315 PyIntBlock *list, *next;
47897
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1316 int i;
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1317 int u; /* remaining unfreed ints per block */
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1318 int freelist_size = 0;
5936
80d24364b932 Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
1319
10373
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
1320 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
1321 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
1322 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
1323 while (list != NULL) {
47897
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1324 u = 0;
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1325 for (i = 0, p = &list->objects[0];
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1326 i < N_INTOBJECTS;
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1327 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
1328 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
47897
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1329 u++;
10373
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
1330 }
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1331 next = list->next;
47897
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1332 if (u) {
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1333 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
1334 block_list = list;
47897
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1335 for (i = 0, p = &list->objects[0];
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1336 i < N_INTOBJECTS;
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1337 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
1338 if (!PyInt_CheckExact(p) ||
19552
6c30d20d27f2 Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents: 19455
diff changeset
1339 p->ob_refcnt == 0) {
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 43378
diff changeset
1340 Py_TYPE(p) = (struct _typeobject *)
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
1341 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
1342 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
1343 }
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
1344 #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
1345 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
1346 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
1347 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
1348 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
1349 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
1350 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
1351 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
1352 }
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
1353 #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
1354 }
10373
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
1355 }
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
1356 else {
23299
01478a132908 Just added comments, and cleared some XXX questions, related to int
Tim Peters <tim.peters@gmail.com>
parents: 23279
diff changeset
1357 PyMem_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
1358 }
47897
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1359 freelist_size += u;
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1360 list = next;
5936
80d24364b932 Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
1361 }
45143
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1362
47897
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1363 return freelist_size;
45143
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1364 }
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1365
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1366 void
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1367 PyInt_Fini(void)
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1368 {
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1369 PyIntObject *p;
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1370 PyIntBlock *list;
47897
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1371 int i;
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1372 int u; /* total unfreed ints per block */
45143
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1373
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1374 #if NSMALLNEGINTS + NSMALLPOSINTS > 0
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1375 PyIntObject **q;
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1376
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1377 i = NSMALLNEGINTS + NSMALLPOSINTS;
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1378 q = small_ints;
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1379 while (--i >= 0) {
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1380 Py_XDECREF(*q);
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1381 *q++ = NULL;
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1382 }
8fdd6d62ea55 Patch #1953
Christian Heimes <christian@cheimes.de>
parents: 44488
diff changeset
1383 #endif
47897
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1384 u = PyInt_ClearFreeList();
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1385 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
1386 return;
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1387 fprintf(stderr, "# cleanup ints");
47897
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1388 if (!u) {
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1389 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
1390 }
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1391 else {
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1392 fprintf(stderr,
47897
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1393 ": %d unfreed int%s\n",
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1394 u, u == 1 ? "" : "s");
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1395 }
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1396 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
1397 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
1398 while (list != NULL) {
47897
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1399 for (i = 0, p = &list->objects[0];
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1400 i < N_INTOBJECTS;
0738119c1ef8 - Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents: 47822
diff changeset
1401 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
1402 if (PyInt_CheckExact(p) && p->ob_refcnt != 0)
36759
83b860acfe95 Use %ld and casts to long for refcount printing, in absense of a universally
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
1403 /* XXX(twouters) cast refcount to
83b860acfe95 Use %ld and casts to long for refcount printing, in absense of a universally
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
1404 long until %zd is universally
83b860acfe95 Use %ld and casts to long for refcount printing, in absense of a universally
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
1405 available
83b860acfe95 Use %ld and casts to long for refcount printing, in absense of a universally
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
1406 */
10391
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1407 fprintf(stderr,
36759
83b860acfe95 Use %ld and casts to long for refcount printing, in absense of a universally
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
1408 "# <int at %p, refcnt=%ld, val=%ld>\n",
83b860acfe95 Use %ld and casts to long for refcount printing, in absense of a universally
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
1409 p, (long)p->ob_refcnt,
83b860acfe95 Use %ld and casts to long for refcount printing, in absense of a universally
Thomas Wouters <thomas@python.org>
parents: 36675
diff changeset
1410 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
1411 }
7b810aa35b5c Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents: 10373
diff changeset
1412 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
1413 }
07ee795774d8 Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents: 5936
diff changeset
1414 }
5936
80d24364b932 Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
1415 }