Mercurial > cpython-lru_cache-weakref
annotate Objects/intobject.c @ 80661:94de77bd0b4b 2.7
Issue #16194: document imp.load_dynamic problems
when read several extension modules from the same binary object file.
| author | Andrew Svetlov <andrew.svetlov@gmail.com> |
|---|---|
| date | Thu, 29 Nov 2012 19:51:28 +0200 |
| parents | 3b484f53f91b |
| children | c0266ba8e4c6 |
| rev | line source |
|---|---|
| 145 | 1 |
| 6 | 2 /* Integer object implementation */ |
| 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> |
|
53289
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
6 #include <float.h> |
| 6 | 7 |
|
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
|
8 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
|
9 |
|
1448
328f446d2016
Added getmaxint() so sys can initialize sys.maxint.
Guido van Rossum <guido@python.org>
parents:
1413
diff
changeset
|
10 long |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
11 PyInt_GetMax(void) |
|
1448
328f446d2016
Added getmaxint() so sys can initialize sys.maxint.
Guido van Rossum <guido@python.org>
parents:
1413
diff
changeset
|
12 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
13 return LONG_MAX; /* To initialize sys.maxint */ |
|
1448
328f446d2016
Added getmaxint() so sys can initialize sys.maxint.
Guido van Rossum <guido@python.org>
parents:
1413
diff
changeset
|
14 } |
|
328f446d2016
Added getmaxint() so sys can initialize sys.maxint.
Guido van Rossum <guido@python.org>
parents:
1413
diff
changeset
|
15 |
| 86 | 16 /* Integers are quite normal objects, to make object handling uniform. |
| 17 (Using odd pointers to represent integers would save much space | |
| 18 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
|
19 Since a typical Python program spends much of its time allocating |
| 86 | 20 and deallocating integers, these operations should be very fast. |
| 21 Therefore we use a dedicated allocation scheme with a much lower | |
| 22 overhead (in space and time) than straight malloc(): a simple | |
| 23 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
|
24 |
|
01478a132908
Just added comments, and cleared some XXX questions, related to int
Tim Peters <tim.peters@gmail.com>
parents:
23279
diff
changeset
|
25 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
|
26 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
|
27 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
|
28 |
|
01478a132908
Just added comments, and cleared some XXX questions, related to int
Tim Peters <tim.peters@gmail.com>
parents:
23279
diff
changeset
|
29 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
|
30 via abuse of their ob_type members. |
| 86 | 31 */ |
| 32 | |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
33 #define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
34 #define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
35 #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
|
36 |
|
10391
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 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
38 struct _intblock *next; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
39 PyIntObject objects[N_INTOBJECTS]; |
|
10391
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 |
|
7b810aa35b5c
Vladimir has restructured his code somewhat so that the blocks are now
Guido van Rossum <guido@python.org>
parents:
10373
diff
changeset
|
42 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
|
43 |
|
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 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
|
45 static PyIntObject *free_list = NULL; |
| 86 | 46 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
47 static PyIntObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
48 fill_free_list(void) |
| 86 | 49 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
50 PyIntObject *p, *q; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
51 /* Python's object allocator isn't appropriate for large blocks. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
52 p = (PyIntObject *) PyMem_MALLOC(sizeof(PyIntBlock)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
53 if (p == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
54 return (PyIntObject *) PyErr_NoMemory(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
55 ((PyIntBlock *)p)->next = block_list; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
56 block_list = (PyIntBlock *)p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
57 /* Link the int objects together, from rear to front, then return |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
58 the address of the last int object in the block. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
59 p = &((PyIntBlock *)p)->objects[0]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
60 q = p + N_INTOBJECTS; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
61 while (--q > p) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
62 Py_TYPE(q) = (struct _typeobject *)(q-1); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
63 Py_TYPE(q) = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
64 return p + N_INTOBJECTS - 1; |
| 86 | 65 } |
| 66 | |
|
1352
4d1a15fc4748
intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
67 #ifndef NSMALLPOSINTS |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
68 #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
|
69 #endif |
|
4d1a15fc4748
intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
70 #ifndef NSMALLNEGINTS |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
71 #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
|
72 #endif |
|
4d1a15fc4748
intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
73 #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
|
74 /* 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
|
75 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
|
76 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
|
77 -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
|
78 */ |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
79 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
|
80 #endif |
|
4d1a15fc4748
intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
81 #ifdef COUNT_ALLOCS |
|
50627
f0e0c3536e22
Issue #4850: Change COUNT_ALLOCS variables to Py_ssize_t.
Martin v. Löwis <martin@v.loewis.de>
parents:
50205
diff
changeset
|
82 Py_ssize_t quick_int_allocs; |
|
f0e0c3536e22
Issue #4850: Change COUNT_ALLOCS variables to Py_ssize_t.
Martin v. Löwis <martin@v.loewis.de>
parents:
50205
diff
changeset
|
83 Py_ssize_t quick_neg_int_allocs; |
|
1352
4d1a15fc4748
intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
84 #endif |
| 86 | 85 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
86 PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
87 PyInt_FromLong(long ival) |
| 6 | 88 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
89 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
|
90 #if NSMALLNEGINTS + NSMALLPOSINTS > 0 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
91 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
92 v = small_ints[ival + NSMALLNEGINTS]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
93 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
|
94 #ifdef COUNT_ALLOCS |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
95 if (ival >= 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
96 quick_int_allocs++; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
97 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
98 quick_neg_int_allocs++; |
|
1352
4d1a15fc4748
intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
99 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
100 return (PyObject *) v; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
101 } |
|
1352
4d1a15fc4748
intobject.c: Save references to small integers, so that they can be
Sjoerd Mullender <sjoerd@acm.org>
parents:
1347
diff
changeset
|
102 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
103 if (free_list == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
104 if ((free_list = fill_free_list()) == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
105 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
106 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
107 /* Inline PyObject_New */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
108 v = free_list; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
109 free_list = (PyIntObject *)Py_TYPE(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
110 PyObject_INIT(v, &PyInt_Type); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
111 v->ob_ival = ival; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
112 return (PyObject *) v; |
| 86 | 113 } |
| 114 | |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
115 PyObject * |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
116 PyInt_FromSize_t(size_t ival) |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
117 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
118 if (ival <= LONG_MAX) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
119 return PyInt_FromLong((long)ival); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
120 return _PyLong_FromSize_t(ival); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
121 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
122 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
123 PyObject * |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
124 PyInt_FromSsize_t(Py_ssize_t ival) |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
125 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
126 if (ival >= LONG_MIN && ival <= LONG_MAX) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
127 return PyInt_FromLong((long)ival); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
128 return _PyLong_FromSsize_t(ival); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
129 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
130 |
| 86 | 131 static void |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
132 int_dealloc(PyIntObject *v) |
| 86 | 133 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
134 if (PyInt_CheckExact(v)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
135 Py_TYPE(v) = (struct _typeobject *)free_list; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
136 free_list = v; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
137 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
138 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
139 Py_TYPE(v)->tp_free((PyObject *)v); |
| 6 | 140 } |
| 141 | |
|
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
|
142 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
|
143 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
|
144 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
145 Py_TYPE(v) = (struct _typeobject *)free_list; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
146 free_list = v; |
|
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
|
147 } |
|
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
|
148 |
| 6 | 149 long |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
150 PyInt_AsLong(register PyObject *op) |
| 6 | 151 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
152 PyNumberMethods *nb; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
153 PyIntObject *io; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
154 long val; |
|
21206
81928c9d7011
SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents:
21124
diff
changeset
|
155 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
156 if (op && PyInt_Check(op)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
157 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
|
158 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
159 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
160 nb->nb_int == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
161 PyErr_SetString(PyExc_TypeError, "an integer is required"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
162 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
163 } |
|
21206
81928c9d7011
SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents:
21124
diff
changeset
|
164 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
165 io = (PyIntObject*) (*nb->nb_int) (op); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
166 if (io == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
167 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
168 if (!PyInt_Check(io)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
169 if (PyLong_Check(io)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
170 /* got a long? => retry int conversion */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
171 val = PyLong_AsLong((PyObject *)io); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
172 Py_DECREF(io); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
173 if ((val == -1) && PyErr_Occurred()) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
174 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
175 return val; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
176 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
177 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
178 { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
179 Py_DECREF(io); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
180 PyErr_SetString(PyExc_TypeError, |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
181 "__int__ method should return an integer"); |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
182 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
183 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
184 } |
|
21206
81928c9d7011
SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents:
21124
diff
changeset
|
185 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
186 val = PyInt_AS_LONG(io); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
187 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
|
188 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
189 return val; |
| 6 | 190 } |
| 191 | |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
192 Py_ssize_t |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
193 PyInt_AsSsize_t(register PyObject *op) |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
194 { |
|
36505
5825c6ace28b
Avoid unused variables when SIZEOF_SIZE_T == SIZEOF_LONG. Also normalize
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
195 #if SIZEOF_SIZE_T != SIZEOF_LONG |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
196 PyNumberMethods *nb; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
197 PyIntObject *io; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
198 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
|
199 #endif |
|
39463
6cafdc81cfde
Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents:
37815
diff
changeset
|
200 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
201 if (op == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
202 PyErr_SetString(PyExc_TypeError, "an integer is required"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
203 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
204 } |
|
39463
6cafdc81cfde
Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents:
37815
diff
changeset
|
205 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
206 if (PyInt_Check(op)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
207 return PyInt_AS_LONG((PyIntObject*) op); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
208 if (PyLong_Check(op)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
209 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
|
210 #if SIZEOF_SIZE_T == SIZEOF_LONG |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
211 return PyInt_AsLong(op); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
212 #else |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
213 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
214 if ((nb = Py_TYPE(op)->tp_as_number) == NULL || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
215 (nb->nb_int == NULL && nb->nb_long == 0)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
216 PyErr_SetString(PyExc_TypeError, "an integer is required"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
217 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
218 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
219 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
220 if (nb->nb_long != 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
221 io = (PyIntObject*) (*nb->nb_long) (op); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
222 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
223 io = (PyIntObject*) (*nb->nb_int) (op); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
224 if (io == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
225 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
226 if (!PyInt_Check(io)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
227 if (PyLong_Check(io)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
228 /* got a long? => retry int conversion */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
229 val = _PyLong_AsSsize_t((PyObject *)io); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
230 Py_DECREF(io); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
231 if ((val == -1) && PyErr_Occurred()) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
232 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
233 return val; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
234 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
235 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
236 { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
237 Py_DECREF(io); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
238 PyErr_SetString(PyExc_TypeError, |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
239 "__int__ method should return an integer"); |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
240 return -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
241 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
242 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
243 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
244 val = PyInt_AS_LONG(io); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
245 Py_DECREF(io); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
246 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
247 return val; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
248 #endif |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
249 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
250 |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
251 unsigned long |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
252 PyInt_AsUnsignedLongMask(register PyObject *op) |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
253 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
254 PyNumberMethods *nb; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
255 PyIntObject *io; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
256 unsigned long val; |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
257 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
258 if (op && PyInt_Check(op)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
259 return PyInt_AS_LONG((PyIntObject*) op); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
260 if (op && PyLong_Check(op)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
261 return PyLong_AsUnsignedLongMask(op); |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
262 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
263 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
264 nb->nb_int == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
265 PyErr_SetString(PyExc_TypeError, "an integer is required"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
266 return (unsigned long)-1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
267 } |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
268 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
269 io = (PyIntObject*) (*nb->nb_int) (op); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
270 if (io == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
271 return (unsigned long)-1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
272 if (!PyInt_Check(io)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
273 if (PyLong_Check(io)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
274 val = PyLong_AsUnsignedLongMask((PyObject *)io); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
275 Py_DECREF(io); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
276 if (PyErr_Occurred()) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
277 return (unsigned long)-1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
278 return val; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
279 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
280 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
281 { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
282 Py_DECREF(io); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
283 PyErr_SetString(PyExc_TypeError, |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
284 "__int__ method should return an integer"); |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
285 return (unsigned long)-1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
286 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
287 } |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
288 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
289 val = PyInt_AS_LONG(io); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
290 Py_DECREF(io); |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
291 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
292 return val; |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
293 } |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
294 |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
295 #ifdef HAVE_LONG_LONG |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
296 unsigned PY_LONG_LONG |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
297 PyInt_AsUnsignedLongLongMask(register PyObject *op) |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
298 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
299 PyNumberMethods *nb; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
300 PyIntObject *io; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
301 unsigned PY_LONG_LONG val; |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
302 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
303 if (op && PyInt_Check(op)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
304 return PyInt_AS_LONG((PyIntObject*) op); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
305 if (op && PyLong_Check(op)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
306 return PyLong_AsUnsignedLongLongMask(op); |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
307 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
308 if (op == NULL || (nb = Py_TYPE(op)->tp_as_number) == NULL || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
309 nb->nb_int == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
310 PyErr_SetString(PyExc_TypeError, "an integer is required"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
311 return (unsigned PY_LONG_LONG)-1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
312 } |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
313 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
314 io = (PyIntObject*) (*nb->nb_int) (op); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
315 if (io == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
316 return (unsigned PY_LONG_LONG)-1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
317 if (!PyInt_Check(io)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
318 if (PyLong_Check(io)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
319 val = PyLong_AsUnsignedLongLongMask((PyObject *)io); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
320 Py_DECREF(io); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
321 if (PyErr_Occurred()) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
322 return (unsigned PY_LONG_LONG)-1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
323 return val; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
324 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
325 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
326 { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
327 Py_DECREF(io); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
328 PyErr_SetString(PyExc_TypeError, |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
329 "__int__ method should return an integer"); |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
330 return (unsigned PY_LONG_LONG)-1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
331 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
332 } |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
333 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
334 val = PyInt_AS_LONG(io); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
335 Py_DECREF(io); |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
336 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
337 return val; |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
338 } |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
339 #endif |
|
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
27993
diff
changeset
|
340 |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
11332
diff
changeset
|
341 PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
342 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
|
343 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
344 char *end; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
345 long x; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
346 Py_ssize_t slen; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
347 PyObject *sobj, *srepr; |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
11332
diff
changeset
|
348 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
349 if ((base != 0 && base < 2) || base > 36) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
350 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
351 "int() base must be >= 2 and <= 36"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
352 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
353 } |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
11332
diff
changeset
|
354 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
355 while (*s && isspace(Py_CHARMASK(*s))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
356 s++; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
357 errno = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
358 if (base == 0 && s[0] == '0') { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
359 x = (long) PyOS_strtoul(s, &end, base); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
360 if (x < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
361 return PyLong_FromString(s, pend, base); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
362 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
363 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
364 x = PyOS_strtol(s, &end, base); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
365 if (end == s || !isalnum(Py_CHARMASK(end[-1]))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
366 goto bad; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
367 while (*end && isspace(Py_CHARMASK(*end))) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
368 end++; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
369 if (*end != '\0') { |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
11332
diff
changeset
|
370 bad: |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
371 slen = strlen(s) < 200 ? strlen(s) : 200; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
372 sobj = PyString_FromStringAndSize(s, slen); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
373 if (sobj == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
374 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
375 srepr = PyObject_Repr(sobj); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
376 Py_DECREF(sobj); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
377 if (srepr == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
378 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
379 PyErr_Format(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
380 "invalid literal for int() with base %d: %s", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
381 base, PyString_AS_STRING(srepr)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
382 Py_DECREF(srepr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
383 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
384 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
385 else if (errno != 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
386 return PyLong_FromString(s, pend, base); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
387 if (pend) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
388 *pend = end; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
389 return PyInt_FromLong(x); |
|
11383
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
11332
diff
changeset
|
390 } |
|
aca7b5eaf5e8
Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents:
11332
diff
changeset
|
391 |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
19051
diff
changeset
|
392 #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
|
393 PyObject * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
394 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
|
395 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
396 PyObject *result; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
397 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
|
398 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
399 if (buffer == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
400 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
|
401 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
402 if (PyUnicode_EncodeDecimal(s, length, buffer, NULL)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
403 PyMem_FREE(buffer); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
404 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
405 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
406 result = PyInt_FromString(buffer, NULL, base); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
407 PyMem_FREE(buffer); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
408 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
|
409 } |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
19051
diff
changeset
|
410 #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
|
411 |
| 6 | 412 /* Methods */ |
| 413 | |
|
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
|
414 /* 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
|
415 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
|
416 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
|
417 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
418 #define CONVERT_TO_LONG(obj, lng) \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
419 if (PyInt_Check(obj)) { \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
420 lng = PyInt_AS_LONG(obj); \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
421 } \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
422 else { \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
423 Py_INCREF(Py_NotImplemented); \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
424 return Py_NotImplemented; \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
425 } |
|
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
|
426 |
| 750 | 427 /* ARGSUSED */ |
|
284
6ac402023cac
printobject now returns an error code
Guido van Rossum <guido@python.org>
parents:
240
diff
changeset
|
428 static int |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
429 int_print(PyIntObject *v, FILE *fp, int flags) |
|
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
430 /* flags -- not used but required by interface */ |
| 6 | 431 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
432 long int_val = v->ob_ival; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
433 Py_BEGIN_ALLOW_THREADS |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
434 fprintf(fp, "%ld", int_val); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
435 Py_END_ALLOW_THREADS |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
436 return 0; |
| 6 | 437 } |
| 438 | |
| 439 static int | |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
440 int_compare(PyIntObject *v, PyIntObject *w) |
| 6 | 441 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
442 register long i = v->ob_ival; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
443 register long j = w->ob_ival; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
444 return (i < j) ? -1 : (i > j) ? 1 : 0; |
| 6 | 445 } |
| 446 | |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1252
diff
changeset
|
447 static long |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
448 int_hash(PyIntObject *v) |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1252
diff
changeset
|
449 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
450 /* XXX If this is changed, you also need to change the way |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
451 Python's long, float and complex types are hashed. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
452 long x = v -> ob_ival; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
453 if (x == -1) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
454 x = -2; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
455 return x; |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1252
diff
changeset
|
456 } |
|
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1252
diff
changeset
|
457 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
458 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
459 int_add(PyIntObject *v, PyIntObject *w) |
| 6 | 460 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
461 register long a, b, x; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
462 CONVERT_TO_LONG(v, a); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
463 CONVERT_TO_LONG(w, b); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
464 /* casts in the line below avoid undefined behaviour on overflow */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
465 x = (long)((unsigned long)a + b); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
466 if ((x^a) >= 0 || (x^b) >= 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
467 return PyInt_FromLong(x); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
468 return PyLong_Type.tp_as_number->nb_add((PyObject *)v, (PyObject *)w); |
| 6 | 469 } |
| 470 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
471 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
472 int_sub(PyIntObject *v, PyIntObject *w) |
| 6 | 473 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
474 register long a, b, x; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
475 CONVERT_TO_LONG(v, a); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
476 CONVERT_TO_LONG(w, b); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
477 /* casts in the line below avoid undefined behaviour on overflow */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
478 x = (long)((unsigned long)a - b); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
479 if ((x^a) >= 0 || (x^~b) >= 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
480 return PyInt_FromLong(x); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
481 return PyLong_Type.tp_as_number->nb_subtract((PyObject *)v, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
482 (PyObject *)w); |
| 6 | 483 } |
| 484 | |
|
1838
5f6acd1ab5c5
mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents:
1448
diff
changeset
|
485 /* |
|
21206
81928c9d7011
SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents:
21124
diff
changeset
|
486 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
|
487 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
|
488 -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
|
489 |
|
21206
81928c9d7011
SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents:
21124
diff
changeset
|
490 Here's another way: |
|
1838
5f6acd1ab5c5
mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents:
1448
diff
changeset
|
491 |
|
21206
81928c9d7011
SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents:
21124
diff
changeset
|
492 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
|
493 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
|
494 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
|
495 some integer i). |
|
1838
5f6acd1ab5c5
mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents:
1448
diff
changeset
|
496 |
|
21206
81928c9d7011
SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents:
21124
diff
changeset
|
497 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
|
498 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
|
499 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
|
500 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
|
501 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
|
502 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
|
503 product are correct. |
|
1838
5f6acd1ab5c5
mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents:
1448
diff
changeset
|
504 |
|
21206
81928c9d7011
SF bug #488480: integer multiply to return -max_int-1.
Tim Peters <tim.peters@gmail.com>
parents:
21124
diff
changeset
|
505 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
|
506 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
|
507 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
|
508 product that must have overflowed. |
|
1838
5f6acd1ab5c5
mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents:
1448
diff
changeset
|
509 */ |
|
5f6acd1ab5c5
mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents:
1448
diff
changeset
|
510 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
511 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
|
512 int_mul(PyObject *v, PyObject *w) |
| 6 | 513 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
514 long a, b; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
515 long longprod; /* a*b in native long arithmetic */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
516 double doubled_longprod; /* (double)longprod */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
517 double doubleprod; /* (double)a * (double)b */ |
|
1838
5f6acd1ab5c5
mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents:
1448
diff
changeset
|
518 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
519 CONVERT_TO_LONG(v, a); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
520 CONVERT_TO_LONG(w, b); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
521 /* casts in the next line avoid undefined behaviour on overflow */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
522 longprod = (long)((unsigned long)a * b); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
523 doubleprod = (double)a * (double)b; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
524 doubled_longprod = (double)longprod; |
|
1838
5f6acd1ab5c5
mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents:
1448
diff
changeset
|
525 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
526 /* Fast path for normal case: small multiplicands, and no info |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
527 is lost in either method. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
528 if (doubled_longprod == doubleprod) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
529 return PyInt_FromLong(longprod); |
|
1838
5f6acd1ab5c5
mods by Andrew Kuchling to implement
Guido van Rossum <guido@python.org>
parents:
1448
diff
changeset
|
530 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
531 /* Somebody somewhere lost info. Close enough, or way off? Note |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
532 that a != 0 and b != 0 (else doubled_longprod == doubleprod == 0). |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
533 The difference either is or isn't significant compared to the |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
534 true value (of which doubleprod is a good approximation). |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
535 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
536 { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
537 const double diff = doubled_longprod - doubleprod; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
538 const double absdiff = diff >= 0.0 ? diff : -diff; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
539 const double absprod = doubleprod >= 0.0 ? doubleprod : |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
540 -doubleprod; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
541 /* absdiff/absprod <= 1/32 iff |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
542 32 * absdiff <= absprod -- 5 good bits is "close enough" */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
543 if (32.0 * absdiff <= absprod) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
544 return PyInt_FromLong(longprod); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
545 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
546 return PyLong_Type.tp_as_number->nb_multiply(v, w); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
547 } |
| 6 | 548 } |
| 549 | |
|
39994
798935e1295e
Forward-port of r52136: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents:
39985
diff
changeset
|
550 /* Integer overflow checking for unary negation: on a 2's-complement |
|
798935e1295e
Forward-port of r52136: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents:
39985
diff
changeset
|
551 * box, -x overflows iff x is the most negative long. In this case we |
|
798935e1295e
Forward-port of r52136: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents:
39985
diff
changeset
|
552 * get -x == x. However, -x is undefined (by C) if x /is/ the most |
|
798935e1295e
Forward-port of r52136: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents:
39985
diff
changeset
|
553 * negative long (it's a signed overflow case), and some compilers care. |
|
798935e1295e
Forward-port of r52136: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents:
39985
diff
changeset
|
554 * So we cast x to unsigned long first. However, then other compilers |
|
798935e1295e
Forward-port of r52136: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents:
39985
diff
changeset
|
555 * warn about applying unary minus to an unsigned operand. Hence the |
|
798935e1295e
Forward-port of r52136: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents:
39985
diff
changeset
|
556 * weird "0-". |
|
798935e1295e
Forward-port of r52136: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents:
39985
diff
changeset
|
557 */ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
558 #define UNARY_NEG_WOULD_OVERFLOW(x) \ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
559 ((x) < 0 && (unsigned long)(x) == 0-(unsigned long)(x)) |
|
39994
798935e1295e
Forward-port of r52136: a review of overflow-detecting code.
Armin Rigo <arigo@tunes.org>
parents:
39985
diff
changeset
|
560 |
|
19435
dad3209ce973
Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents:
19343
diff
changeset
|
561 /* 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
|
562 enum divmod_result { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
563 DIVMOD_OK, /* Correct result */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
564 DIVMOD_OVERFLOW, /* Overflow, try again using longs */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
565 DIVMOD_ERROR /* Exception raised */ |
|
19435
dad3209ce973
Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents:
19343
diff
changeset
|
566 }; |
|
dad3209ce973
Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents:
19343
diff
changeset
|
567 |
|
dad3209ce973
Change all case where we used to raise OverflowError to issue a
Guido van Rossum <guido@python.org>
parents:
19343
diff
changeset
|
568 static enum divmod_result |
|
18146
b51b4c2bf5f9
SF bug 434186: 0x80000000/2 != 0x80000000>>1
Tim Peters <tim.peters@gmail.com>
parents:
16997
diff
changeset
|
569 i_divmod(register long x, register long y, |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
570 long *p_xdivy, long *p_xmody) |
| 6 | 571 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
572 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
|
573 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
574 if (y == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
575 PyErr_SetString(PyExc_ZeroDivisionError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
576 "integer division or modulo by zero"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
577 return DIVMOD_ERROR; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
578 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
579 /* (-sys.maxint-1)/-1 is the only overflow case. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
580 if (y == -1 && UNARY_NEG_WOULD_OVERFLOW(x)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
581 return DIVMOD_OVERFLOW; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
582 xdivy = x / y; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
583 /* xdiv*y can overflow on platforms where x/y gives floor(x/y) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
584 * for x and y with differing signs. (This is unusual |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
585 * behaviour, and C99 prohibits it, but it's allowed by C89; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
586 * for an example of overflow, take x = LONG_MIN, y = 5 or x = |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
587 * LONG_MAX, y = -5.) However, x - xdivy*y is always |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
588 * representable as a long, since it lies strictly between |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
589 * -abs(y) and abs(y). We add casts to avoid intermediate |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
590 * overflow. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
591 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
592 xmody = (long)(x - (unsigned long)xdivy * y); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
593 /* If the signs of x and y differ, and the remainder is non-0, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
594 * C89 doesn't define whether xdivy is now the floor or the |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
595 * ceiling of the infinitely precise quotient. We want the floor, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
596 * and we have it iff the remainder's sign matches y's. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
597 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
598 if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
599 xmody += y; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
600 --xdivy; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
601 assert(xmody && ((y ^ xmody) >= 0)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
602 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
603 *p_xdivy = xdivy; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
604 *p_xmody = xmody; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
605 return DIVMOD_OK; |
|
610
dcc6de1c37a4
Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents:
589
diff
changeset
|
606 } |
|
dcc6de1c37a4
Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents:
589
diff
changeset
|
607 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
608 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
609 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
|
610 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
611 long xi, yi; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
612 long d, m; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
613 CONVERT_TO_LONG(x, xi); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
614 CONVERT_TO_LONG(y, yi); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
615 switch (i_divmod(xi, yi, &d, &m)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
616 case DIVMOD_OK: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
617 return PyInt_FromLong(d); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
618 case DIVMOD_OVERFLOW: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
619 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
620 (PyObject *)y); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
621 default: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
622 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
623 } |
|
610
dcc6de1c37a4
Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents:
589
diff
changeset
|
624 } |
|
dcc6de1c37a4
Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents:
589
diff
changeset
|
625 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
626 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
|
627 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
|
628 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
629 long xi, yi; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
630 long d, m; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
631 CONVERT_TO_LONG(x, xi); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
632 CONVERT_TO_LONG(y, yi); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
633 if (Py_DivisionWarningFlag && |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
634 PyErr_Warn(PyExc_DeprecationWarning, "classic int division") < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
635 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
636 switch (i_divmod(xi, yi, &d, &m)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
637 case DIVMOD_OK: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
638 return PyInt_FromLong(d); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
639 case DIVMOD_OVERFLOW: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
640 return PyLong_Type.tp_as_number->nb_divide((PyObject *)x, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
641 (PyObject *)y); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
642 default: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
643 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
644 } |
|
19633
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
645 } |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
646 |
|
c0a44829bcd5
Add warning mode for classic division, almost exactly as specified in
Guido van Rossum <guido@python.org>
parents:
19590
diff
changeset
|
647 static PyObject * |
|
57941
c4e60988834d
Issue #1811: Improve accuracy and consistency of true division for integers.
Mark Dickinson <dickinsm@gmail.com>
parents:
57567
diff
changeset
|
648 int_true_divide(PyIntObject *x, PyIntObject *y) |
|
19676
c768d3191df1
Move int_true_divide next to the other division routines.
Tim Peters <tim.peters@gmail.com>
parents:
19666
diff
changeset
|
649 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
650 long xi, yi; |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
651 /* If they aren't both ints, give someone else a chance. In |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
652 particular, this lets int/long get handled by longs, which |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
653 underflows to 0 gracefully if the long is too big to convert |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
654 to float. */ |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
655 CONVERT_TO_LONG(x, xi); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
656 CONVERT_TO_LONG(y, yi); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
657 if (yi == 0) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
658 PyErr_SetString(PyExc_ZeroDivisionError, |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
659 "division by zero"); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
660 return NULL; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
661 } |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
662 if (xi == 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
663 return PyFloat_FromDouble(yi < 0 ? -0.0 : 0.0); |
|
57941
c4e60988834d
Issue #1811: Improve accuracy and consistency of true division for integers.
Mark Dickinson <dickinsm@gmail.com>
parents:
57567
diff
changeset
|
664 |
|
c4e60988834d
Issue #1811: Improve accuracy and consistency of true division for integers.
Mark Dickinson <dickinsm@gmail.com>
parents:
57567
diff
changeset
|
665 #define WIDTH_OF_ULONG (CHAR_BIT*SIZEOF_LONG) |
|
c4e60988834d
Issue #1811: Improve accuracy and consistency of true division for integers.
Mark Dickinson <dickinsm@gmail.com>
parents:
57567
diff
changeset
|
666 #if DBL_MANT_DIG < WIDTH_OF_ULONG |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
667 if ((xi >= 0 ? 0UL + xi : 0UL - xi) >> DBL_MANT_DIG || |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
668 (yi >= 0 ? 0UL + yi : 0UL - yi) >> DBL_MANT_DIG) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
669 /* Large x or y. Use long integer arithmetic. */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
670 return PyLong_Type.tp_as_number->nb_true_divide( |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
671 (PyObject *)x, (PyObject *)y); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
672 else |
|
57941
c4e60988834d
Issue #1811: Improve accuracy and consistency of true division for integers.
Mark Dickinson <dickinsm@gmail.com>
parents:
57567
diff
changeset
|
673 #endif |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
674 /* Both ints can be exactly represented as doubles. Do a |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
675 floating-point division. */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
676 return PyFloat_FromDouble((double)xi / (double)yi); |
|
19676
c768d3191df1
Move int_true_divide next to the other division routines.
Tim Peters <tim.peters@gmail.com>
parents:
19666
diff
changeset
|
677 } |
|
c768d3191df1
Move int_true_divide next to the other division routines.
Tim Peters <tim.peters@gmail.com>
parents:
19666
diff
changeset
|
678 |
|
c768d3191df1
Move int_true_divide next to the other division routines.
Tim Peters <tim.peters@gmail.com>
parents:
19666
diff
changeset
|
679 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
680 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
|
681 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
682 long xi, yi; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
683 long d, m; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
684 CONVERT_TO_LONG(x, xi); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
685 CONVERT_TO_LONG(y, yi); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
686 switch (i_divmod(xi, yi, &d, &m)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
687 case DIVMOD_OK: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
688 return PyInt_FromLong(m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
689 case DIVMOD_OVERFLOW: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
690 return PyLong_Type.tp_as_number->nb_remainder((PyObject *)x, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
691 (PyObject *)y); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
692 default: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
693 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
694 } |
|
610
dcc6de1c37a4
Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents:
589
diff
changeset
|
695 } |
|
dcc6de1c37a4
Make / and % do the same as divmod.
Guido van Rossum <guido@python.org>
parents:
589
diff
changeset
|
696 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
697 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
698 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
|
699 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
700 long xi, yi; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
701 long d, m; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
702 CONVERT_TO_LONG(x, xi); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
703 CONVERT_TO_LONG(y, yi); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
704 switch (i_divmod(xi, yi, &d, &m)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
705 case DIVMOD_OK: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
706 return Py_BuildValue("(ll)", d, m); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
707 case DIVMOD_OVERFLOW: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
708 return PyLong_Type.tp_as_number->nb_divmod((PyObject *)x, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
709 (PyObject *)y); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
710 default: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
711 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
712 } |
|
229
08597e2b63d3
Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
713 } |
|
08597e2b63d3
Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
714 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
715 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
716 int_pow(PyIntObject *v, PyIntObject *w, PyIntObject *z) |
| 6 | 717 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
718 register long iv, iw, iz=0, ix, temp, prev; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
719 CONVERT_TO_LONG(v, iv); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
720 CONVERT_TO_LONG(w, iw); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
721 if (iw < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
722 if ((PyObject *)z != Py_None) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
723 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument " |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
724 "cannot be negative when 3rd argument specified"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
725 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
726 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
727 /* Return a float. This works because we know that |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
728 this calls float_pow() which converts its |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
729 arguments to double. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
730 return PyFloat_Type.tp_as_number->nb_power( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
731 (PyObject *)v, (PyObject *)w, (PyObject *)z); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
732 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
733 if ((PyObject *)z != Py_None) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
734 CONVERT_TO_LONG(z, iz); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
735 if (iz == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
736 PyErr_SetString(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
737 "pow() 3rd argument cannot be 0"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
738 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
739 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
740 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
741 /* |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
742 * XXX: The original exponentiation code stopped looping |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
743 * when temp hit zero; this code will continue onwards |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
744 * unnecessarily, but at least it won't cause any errors. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
745 * Hopefully the speed improvement from the fast exponentiation |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
746 * will compensate for the slight inefficiency. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
747 * XXX: Better handling of overflows is desperately needed. |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
748 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
749 temp = iv; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
750 ix = 1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
751 while (iw > 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
752 prev = ix; /* Save value for overflow check */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
753 if (iw & 1) { |
|
72416
07efe83795b0
Issue #12973: Fix int.__pow__ overflow checks that invoked undefined behaviour, thereby producing incorrect results on Clang.
Mark Dickinson <mdickinson@enthought.com>
parents:
68256
diff
changeset
|
754 /* |
|
07efe83795b0
Issue #12973: Fix int.__pow__ overflow checks that invoked undefined behaviour, thereby producing incorrect results on Clang.
Mark Dickinson <mdickinson@enthought.com>
parents:
68256
diff
changeset
|
755 * The (unsigned long) cast below ensures that the multiplication |
|
07efe83795b0
Issue #12973: Fix int.__pow__ overflow checks that invoked undefined behaviour, thereby producing incorrect results on Clang.
Mark Dickinson <mdickinson@enthought.com>
parents:
68256
diff
changeset
|
756 * is interpreted as an unsigned operation rather than a signed one |
|
07efe83795b0
Issue #12973: Fix int.__pow__ overflow checks that invoked undefined behaviour, thereby producing incorrect results on Clang.
Mark Dickinson <mdickinson@enthought.com>
parents:
68256
diff
changeset
|
757 * (C99 6.3.1.8p1), thus avoiding the perils of undefined behaviour |
|
07efe83795b0
Issue #12973: Fix int.__pow__ overflow checks that invoked undefined behaviour, thereby producing incorrect results on Clang.
Mark Dickinson <mdickinson@enthought.com>
parents:
68256
diff
changeset
|
758 * from signed arithmetic overflow (C99 6.5p5). See issue #12973. |
|
07efe83795b0
Issue #12973: Fix int.__pow__ overflow checks that invoked undefined behaviour, thereby producing incorrect results on Clang.
Mark Dickinson <mdickinson@enthought.com>
parents:
68256
diff
changeset
|
759 */ |
|
07efe83795b0
Issue #12973: Fix int.__pow__ overflow checks that invoked undefined behaviour, thereby producing incorrect results on Clang.
Mark Dickinson <mdickinson@enthought.com>
parents:
68256
diff
changeset
|
760 ix = (unsigned long)ix * temp; |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
761 if (temp == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
762 break; /* Avoid ix / 0 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
763 if (ix / temp != prev) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
764 return PyLong_Type.tp_as_number->nb_power( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
765 (PyObject *)v, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
766 (PyObject *)w, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
767 (PyObject *)z); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
768 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
769 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
770 iw >>= 1; /* Shift exponent down by 1 bit */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
771 if (iw==0) break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
772 prev = temp; |
|
72416
07efe83795b0
Issue #12973: Fix int.__pow__ overflow checks that invoked undefined behaviour, thereby producing incorrect results on Clang.
Mark Dickinson <mdickinson@enthought.com>
parents:
68256
diff
changeset
|
773 temp = (unsigned long)temp * temp; /* Square the value of temp */ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
774 if (prev != 0 && temp / prev != prev) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
775 return PyLong_Type.tp_as_number->nb_power( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
776 (PyObject *)v, (PyObject *)w, (PyObject *)z); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
777 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
778 if (iz) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
779 /* If we did a multiplication, perform a modulo */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
780 ix = ix % iz; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
781 temp = temp % iz; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
782 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
783 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
784 if (iz) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
785 long div, mod; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
786 switch (i_divmod(ix, iz, &div, &mod)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
787 case DIVMOD_OK: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
788 ix = mod; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
789 break; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
790 case DIVMOD_OVERFLOW: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
791 return PyLong_Type.tp_as_number->nb_power( |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
792 (PyObject *)v, (PyObject *)w, (PyObject *)z); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
793 default: |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
794 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
795 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
796 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
797 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
|
798 } |
| 6 | 799 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
800 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
801 int_neg(PyIntObject *v) |
| 6 | 802 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
803 register long a; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
804 a = v->ob_ival; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
805 /* check for overflow */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
806 if (UNARY_NEG_WOULD_OVERFLOW(a)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
807 PyObject *o = PyLong_FromLong(a); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
808 if (o != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
809 PyObject *result = PyNumber_Negative(o); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
810 Py_DECREF(o); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
811 return result; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
812 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
813 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
814 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
815 return PyInt_FromLong(-a); |
| 6 | 816 } |
| 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_abs(PyIntObject *v) |
|
229
08597e2b63d3
Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
820 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
821 if (v->ob_ival >= 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
822 return int_int(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
823 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
824 return int_neg(v); |
|
229
08597e2b63d3
Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
825 } |
|
08597e2b63d3
Added divmod and abs, fixed negative powers
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
826 |
| 240 | 827 static int |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
828 int_nonzero(PyIntObject *v) |
| 240 | 829 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
830 return v->ob_ival != 0; |
| 240 | 831 } |
| 832 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
833 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
834 int_invert(PyIntObject *v) |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
835 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
836 return PyInt_FromLong(~v->ob_ival); |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
837 } |
|
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
838 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
839 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
840 int_lshift(PyIntObject *v, PyIntObject *w) |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
841 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
842 long a, b, c; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
843 PyObject *vv, *ww, *result; |
|
32418
255a71f2d215
SF bug #980419: int left-shift causes memory leak
Raymond Hettinger <python@rcn.com>
parents:
32269
diff
changeset
|
844 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
845 CONVERT_TO_LONG(v, a); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
846 CONVERT_TO_LONG(w, b); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
847 if (b < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
848 PyErr_SetString(PyExc_ValueError, "negative shift count"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
849 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
850 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
851 if (a == 0 || b == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
852 return int_int(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
853 if (b >= LONG_BIT) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
854 vv = PyLong_FromLong(PyInt_AS_LONG(v)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
855 if (vv == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
856 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
857 ww = PyLong_FromLong(PyInt_AS_LONG(w)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
858 if (ww == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
859 Py_DECREF(vv); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
860 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
861 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
862 result = PyNumber_Lshift(vv, ww); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
863 Py_DECREF(vv); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
864 Py_DECREF(ww); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
865 return result; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
866 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
867 c = a << b; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
868 if (a != Py_ARITHMETIC_RIGHT_SHIFT(long, c, b)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
869 vv = PyLong_FromLong(PyInt_AS_LONG(v)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
870 if (vv == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
871 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
872 ww = PyLong_FromLong(PyInt_AS_LONG(w)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
873 if (ww == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
874 Py_DECREF(vv); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
875 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
876 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
877 result = PyNumber_Lshift(vv, ww); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
878 Py_DECREF(vv); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
879 Py_DECREF(ww); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
880 return result; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
881 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
882 return PyInt_FromLong(c); |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
883 } |
|
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
884 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
885 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
886 int_rshift(PyIntObject *v, PyIntObject *w) |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
887 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
888 register long a, b; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
889 CONVERT_TO_LONG(v, a); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
890 CONVERT_TO_LONG(w, b); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
891 if (b < 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
892 PyErr_SetString(PyExc_ValueError, "negative shift count"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
893 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
894 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
895 if (a == 0 || b == 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
896 return int_int(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
897 if (b >= LONG_BIT) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
898 if (a < 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
899 a = -1; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
900 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
901 a = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
902 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
903 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
904 a = Py_ARITHMETIC_RIGHT_SHIFT(long, a, b); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
905 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
906 return PyInt_FromLong(a); |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
907 } |
|
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
908 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
909 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
910 int_and(PyIntObject *v, PyIntObject *w) |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
911 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
912 register long a, b; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
913 CONVERT_TO_LONG(v, a); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
914 CONVERT_TO_LONG(w, b); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
915 return PyInt_FromLong(a & b); |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
916 } |
|
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
917 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
918 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
919 int_xor(PyIntObject *v, PyIntObject *w) |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
920 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
921 register long a, b; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
922 CONVERT_TO_LONG(v, a); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
923 CONVERT_TO_LONG(w, b); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
924 return PyInt_FromLong(a ^ b); |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
925 } |
|
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
926 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
927 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
928 int_or(PyIntObject *v, PyIntObject *w) |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
929 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
930 register long a, b; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
931 CONVERT_TO_LONG(v, a); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
932 CONVERT_TO_LONG(w, b); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
933 return PyInt_FromLong(a | b); |
|
409
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
934 } |
|
b5fe6482072f
Added shift and mask ops.
Guido van Rossum <guido@python.org>
parents:
284
diff
changeset
|
935 |
|
19976
da00188d5270
Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents:
19925
diff
changeset
|
936 static int |
|
da00188d5270
Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents:
19925
diff
changeset
|
937 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
|
938 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
939 if (PyInt_Check(*pw)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
940 Py_INCREF(*pv); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
941 Py_INCREF(*pw); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
942 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
943 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
944 return 1; /* Can't do it */ |
|
19976
da00188d5270
Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents:
19925
diff
changeset
|
945 } |
|
da00188d5270
Add additional coercion support for "self subtypes" to int, long,
Guido van Rossum <guido@python.org>
parents:
19925
diff
changeset
|
946 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
947 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
948 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
|
949 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
950 if (PyInt_CheckExact(v)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
951 Py_INCREF(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
952 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
953 v = (PyIntObject *)PyInt_FromLong(v->ob_ival); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
954 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
|
955 } |
|
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
956 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
957 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
958 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
|
959 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
960 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
|
961 } |
|
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
962 |
|
53289
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
963 static const unsigned char BitLengthTable[32] = { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
964 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
965 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 |
|
53289
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
966 }; |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
967 |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
968 static int |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
969 bits_in_ulong(unsigned long d) |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
970 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
971 int d_bits = 0; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
972 while (d >= 32) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
973 d_bits += 6; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
974 d >>= 6; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
975 } |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
976 d_bits += (int)BitLengthTable[d]; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
977 return d_bits; |
|
53289
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
978 } |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
979 |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
980 #if 8*SIZEOF_LONG-1 <= DBL_MANT_DIG |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
981 /* Every Python int can be exactly represented as a float. */ |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
982 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
983 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
984 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
|
985 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
986 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
|
987 } |
|
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
988 |
|
53289
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
989 #else |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
990 /* Here not all Python ints are exactly representable as floats, so we may |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
991 have to round. We do this manually, since the C standards don't specify |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
992 whether converting an integer to a float rounds up or down */ |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
993 |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
994 static PyObject * |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
995 int_float(PyIntObject *v) |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
996 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
997 unsigned long abs_ival, lsb; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
998 int round_up; |
|
53289
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
999 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1000 if (v->ob_ival < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1001 abs_ival = 0U-(unsigned long)v->ob_ival; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1002 else |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1003 abs_ival = (unsigned long)v->ob_ival; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1004 if (abs_ival < (1L << DBL_MANT_DIG)) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1005 /* small integer; no need to round */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1006 return PyFloat_FromDouble((double)v->ob_ival); |
|
53289
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
1007 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1008 /* Round abs_ival to MANT_DIG significant bits, using the |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1009 round-half-to-even rule. abs_ival & lsb picks out the 'rounding' |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1010 bit: the first bit after the most significant MANT_DIG bits of |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1011 abs_ival. We round up if this bit is set, provided that either: |
|
53289
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
1012 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1013 (1) abs_ival isn't exactly halfway between two floats, in which |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1014 case at least one of the bits following the rounding bit must be |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1015 set; i.e., abs_ival & lsb-1 != 0, or: |
|
53289
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
1016 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1017 (2) the resulting rounded value has least significant bit 0; or |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1018 in other words the bit above the rounding bit is set (this is the |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1019 'to-even' bit of round-half-to-even); i.e., abs_ival & 2*lsb != 0 |
|
53289
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
1020 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1021 The condition "(1) or (2)" equates to abs_ival & 3*lsb-1 != 0. */ |
|
53289
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
1022 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1023 lsb = 1L << (bits_in_ulong(abs_ival)-DBL_MANT_DIG-1); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1024 round_up = (abs_ival & lsb) && (abs_ival & (3*lsb-1)); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1025 abs_ival &= -2*lsb; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1026 if (round_up) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1027 abs_ival += 2*lsb; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1028 return PyFloat_FromDouble(v->ob_ival < 0 ? |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1029 -(double)abs_ival : |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1030 (double)abs_ival); |
|
53289
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
1031 } |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
1032 |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
1033 #endif |
|
8f28ce7b8e69
Issue #3166: Make long -> float (and int -> float) conversions
Mark Dickinson <dickinsm@gmail.com>
parents:
50627
diff
changeset
|
1034 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
1035 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
1036 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
|
1037 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1038 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
|
1039 } |
|
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1040 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
1041 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
1042 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
|
1043 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1044 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
|
1045 } |
|
2ed511171809
Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1046 |
|
24280
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23832
diff
changeset
|
1047 static PyObject * |
|
19552
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19455
diff
changeset
|
1048 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
|
1049 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18755
diff
changeset
|
1050 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18755
diff
changeset
|
1051 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
|
1052 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1053 PyObject *x = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1054 int base = -909; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1055 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
|
1056 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1057 if (type != &PyInt_Type) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1058 return int_subtype_new(type, args, kwds); /* Wimp out */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1059 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1060 &x, &base)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1061 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1062 if (x == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1063 return PyInt_FromLong(0L); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1064 if (base == -909) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1065 return PyNumber_Int(x); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1066 if (PyString_Check(x)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1067 /* Since PyInt_FromString doesn't have a length parameter, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1068 * check here for possible NULs in the string. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1069 char *string = PyString_AS_STRING(x); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1070 if (strlen(string) != PyString_Size(x)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1071 /* create a repr() of the input string, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1072 * just like PyInt_FromString does */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1073 PyObject *srepr; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1074 srepr = PyObject_Repr(x); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1075 if (srepr == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1076 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1077 PyErr_Format(PyExc_ValueError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1078 "invalid literal for int() with base %d: %s", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1079 base, PyString_AS_STRING(srepr)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1080 Py_DECREF(srepr); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1081 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1082 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1083 return PyInt_FromString(string, NULL, base); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1084 } |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
19051
diff
changeset
|
1085 #ifdef Py_USING_UNICODE |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1086 if (PyUnicode_Check(x)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1087 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(x), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1088 PyUnicode_GET_SIZE(x), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1089 base); |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
19051
diff
changeset
|
1090 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1091 PyErr_SetString(PyExc_TypeError, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1092 "int() can't convert non-string with explicit base"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1093 return NULL; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18755
diff
changeset
|
1094 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18755
diff
changeset
|
1095 |
|
19552
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19455
diff
changeset
|
1096 /* 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
|
1097 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
|
1098 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
|
1099 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
|
1100 */ |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19455
diff
changeset
|
1101 static PyObject * |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19455
diff
changeset
|
1102 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
|
1103 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1104 PyObject *tmp, *newobj; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1105 long ival; |
|
19552
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19455
diff
changeset
|
1106 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1107 assert(PyType_IsSubtype(type, &PyInt_Type)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1108 tmp = int_new(&PyInt_Type, args, kwds); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1109 if (tmp == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1110 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1111 if (!PyInt_Check(tmp)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1112 ival = PyLong_AsLong(tmp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1113 if (ival == -1 && PyErr_Occurred()) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1114 Py_DECREF(tmp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1115 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1116 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1117 } else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1118 ival = ((PyIntObject *)tmp)->ob_ival; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1119 } |
|
27779
fc5a60a61e32
Fix SF bug #683467, 'int' ability to generate longs not inherited
Neal Norwitz <nnorwitz@gmail.com>
parents:
27521
diff
changeset
|
1120 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1121 newobj = type->tp_alloc(type, 0); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1122 if (newobj == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1123 Py_DECREF(tmp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1124 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1125 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1126 ((PyIntObject *)newobj)->ob_ival = ival; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1127 Py_DECREF(tmp); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1128 return newobj; |
|
19552
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19455
diff
changeset
|
1129 } |
|
6c30d20d27f2
Make int, long and float subclassable.
Guido van Rossum <guido@python.org>
parents:
19455
diff
changeset
|
1130 |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27301
diff
changeset
|
1131 static PyObject * |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27301
diff
changeset
|
1132 int_getnewargs(PyIntObject *v) |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27301
diff
changeset
|
1133 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1134 return Py_BuildValue("(l)", v->ob_ival); |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27301
diff
changeset
|
1135 } |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27301
diff
changeset
|
1136 |
|
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
|
1137 static PyObject * |
|
53709
63ddce9faf4a
Remove unnecessary uses of context in PyGetSetDef. See issue #5880.
Mark Dickinson <dickinsm@gmail.com>
parents:
53289
diff
changeset
|
1138 int_get0(PyIntObject *v, void *context) { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1139 return PyInt_FromLong(0L); |
|
53709
63ddce9faf4a
Remove unnecessary uses of context in PyGetSetDef. See issue #5880.
Mark Dickinson <dickinsm@gmail.com>
parents:
53289
diff
changeset
|
1140 } |
|
63ddce9faf4a
Remove unnecessary uses of context in PyGetSetDef. See issue #5880.
Mark Dickinson <dickinsm@gmail.com>
parents:
53289
diff
changeset
|
1141 |
|
63ddce9faf4a
Remove unnecessary uses of context in PyGetSetDef. See issue #5880.
Mark Dickinson <dickinsm@gmail.com>
parents:
53289
diff
changeset
|
1142 static PyObject * |
|
63ddce9faf4a
Remove unnecessary uses of context in PyGetSetDef. See issue #5880.
Mark Dickinson <dickinsm@gmail.com>
parents:
53289
diff
changeset
|
1143 int_get1(PyIntObject *v, void *context) { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1144 return PyInt_FromLong(1L); |
|
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
|
1145 } |
|
4f9723d9ca32
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
44350
diff
changeset
|
1146 |
|
56240
546101a6677c
Issue #6713: Improve decimal int -> string conversions. Thanks Gawain
Mark Dickinson <dickinsm@gmail.com>
parents:
53709
diff
changeset
|
1147 /* Convert an integer to a decimal string. On many platforms, this |
|
546101a6677c
Issue #6713: Improve decimal int -> string conversions. Thanks Gawain
Mark Dickinson <dickinsm@gmail.com>
parents:
53709
diff
changeset
|
1148 will be significantly faster than the general arbitrary-base |
|
546101a6677c
Issue #6713: Improve decimal int -> string conversions. Thanks Gawain
Mark Dickinson <dickinsm@gmail.com>
parents:
53709
diff
changeset
|
1149 conversion machinery in _PyInt_Format, thanks to optimization |
|
546101a6677c
Issue #6713: Improve decimal int -> string conversions. Thanks Gawain
Mark Dickinson <dickinsm@gmail.com>
parents:
53709
diff
changeset
|
1150 opportunities offered by division by a compile-time constant. */ |
|
546101a6677c
Issue #6713: Improve decimal int -> string conversions. Thanks Gawain
Mark Dickinson <dickinsm@gmail.com>
parents:
53709
diff
changeset
|
1151 static PyObject * |
|
546101a6677c
Issue #6713: Improve decimal int -> string conversions. Thanks Gawain
Mark Dickinson <dickinsm@gmail.com>
parents:
53709
diff
changeset
|
1152 int_to_decimal_string(PyIntObject *v) { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1153 char buf[sizeof(long)*CHAR_BIT/3+6], *p, *bufend; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1154 long n = v->ob_ival; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1155 unsigned long absn; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1156 p = bufend = buf + sizeof(buf); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1157 absn = n < 0 ? 0UL - n : n; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1158 do { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1159 *--p = '0' + (char)(absn % 10); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1160 absn /= 10; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1161 } while (absn); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1162 if (n < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1163 *--p = '-'; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1164 return PyString_FromStringAndSize(p, bufend - p); |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27301
diff
changeset
|
1165 } |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27301
diff
changeset
|
1166 |
|
45262
86906a5ceca6
Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1167 /* 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
|
1168 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
|
1169 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
|
1170 a leading "0" */ |
|
86906a5ceca6
Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1171 PyAPI_FUNC(PyObject*) |
|
86906a5ceca6
Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1172 _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
|
1173 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1174 /* There are no doubt many, many ways to optimize this, using code |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1175 similar to _PyLong_Format */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1176 long n = v->ob_ival; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1177 int negative = n < 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1178 int is_zero = n == 0; |
|
45262
86906a5ceca6
Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1179 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1180 /* For the reasoning behind this size, see |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1181 http://c-faq.com/misc/hexio.html. Then, add a few bytes for |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1182 the possible sign and prefix "0[box]" */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1183 char buf[sizeof(n)*CHAR_BIT+6]; |
|
45262
86906a5ceca6
Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1184 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1185 /* Start by pointing to the end of the buffer. We fill in from |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1186 the back forward. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1187 char* p = &buf[sizeof(buf)]; |
|
45262
86906a5ceca6
Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1188 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1189 assert(base >= 2 && base <= 36); |
|
45262
86906a5ceca6
Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1190 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1191 /* Special case base 10, for speed */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1192 if (base == 10) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1193 return int_to_decimal_string(v); |
|
56240
546101a6677c
Issue #6713: Improve decimal int -> string conversions. Thanks Gawain
Mark Dickinson <dickinsm@gmail.com>
parents:
53709
diff
changeset
|
1194 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1195 do { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1196 /* I'd use i_divmod, except it doesn't produce the results |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1197 I want when n is negative. So just duplicate the salient |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1198 part here. */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1199 long div = n / base; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1200 long mod = n - div * base; |
|
45262
86906a5ceca6
Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1201 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1202 /* convert abs(mod) to the right character in [0-9, a-z] */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1203 char cdigit = (char)(mod < 0 ? -mod : mod); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1204 cdigit += (cdigit < 10) ? '0' : 'a'-10; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1205 *--p = cdigit; |
|
45262
86906a5ceca6
Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1206 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1207 n = div; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1208 } while(n); |
|
45262
86906a5ceca6
Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1209 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1210 if (base == 2) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1211 *--p = 'b'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1212 *--p = '0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1213 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1214 else if (base == 8) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1215 if (newstyle) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1216 *--p = 'o'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1217 *--p = '0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1218 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1219 else |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1220 if (!is_zero) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1221 *--p = '0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1222 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1223 else if (base == 16) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1224 *--p = 'x'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1225 *--p = '0'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1226 } |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1227 else { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1228 *--p = '#'; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1229 *--p = '0' + base%10; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1230 if (base > 10) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1231 *--p = '0' + base/10; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1232 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1233 if (negative) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1234 *--p = '-'; |
|
45262
86906a5ceca6
Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1235 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1236 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
|
1237 } |
|
86906a5ceca6
Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents:
45143
diff
changeset
|
1238 |
|
45381
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45262
diff
changeset
|
1239 static PyObject * |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45262
diff
changeset
|
1240 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
|
1241 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1242 PyObject *format_spec; |
|
45381
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45262
diff
changeset
|
1243 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1244 if (!PyArg_ParseTuple(args, "O:__format__", &format_spec)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1245 return NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1246 if (PyBytes_Check(format_spec)) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1247 return _PyInt_FormatAdvanced(self, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1248 PyBytes_AS_STRING(format_spec), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1249 PyBytes_GET_SIZE(format_spec)); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1250 if (PyUnicode_Check(format_spec)) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1251 /* Convert format_spec to a str */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1252 PyObject *result; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1253 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
|
1254 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1255 if (str_spec == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1256 return NULL; |
|
45381
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45262
diff
changeset
|
1257 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1258 result = _PyInt_FormatAdvanced(self, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1259 PyBytes_AS_STRING(str_spec), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1260 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
|
1261 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1262 Py_DECREF(str_spec); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1263 return result; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1264 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1265 PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1266 return NULL; |
|
45381
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45262
diff
changeset
|
1267 } |
|
b7231bf6bfb7
Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents:
45262
diff
changeset
|
1268 |
|
50205
f0db06f49a4e
Issue #3439: add bit_length method to int and long.
Mark Dickinson <dickinsm@gmail.com>
parents:
47897
diff
changeset
|
1269 static PyObject * |
|
f0db06f49a4e
Issue #3439: add bit_length method to int and long.
Mark Dickinson <dickinsm@gmail.com>
parents:
47897
diff
changeset
|
1270 int_bit_length(PyIntObject *v) |
|
f0db06f49a4e
Issue #3439: add bit_length method to int and long.
Mark Dickinson <dickinsm@gmail.com>
parents:
47897
diff
changeset
|
1271 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1272 unsigned long n; |
|
50205
f0db06f49a4e
Issue #3439: add bit_length method to int and long.
Mark Dickinson <dickinsm@gmail.com>
parents:
47897
diff
changeset
|
1273 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1274 if (v->ob_ival < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1275 /* avoid undefined behaviour when v->ob_ival == -LONG_MAX-1 */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1276 n = 0U-(unsigned long)v->ob_ival; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1277 else |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1278 n = (unsigned long)v->ob_ival; |
|
50205
f0db06f49a4e
Issue #3439: add bit_length method to int and long.
Mark Dickinson <dickinsm@gmail.com>
parents:
47897
diff
changeset
|
1279 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1280 return PyInt_FromLong(bits_in_ulong(n)); |
|
50205
f0db06f49a4e
Issue #3439: add bit_length method to int and long.
Mark Dickinson <dickinsm@gmail.com>
parents:
47897
diff
changeset
|
1281 } |
|
f0db06f49a4e
Issue #3439: add bit_length method to int and long.
Mark Dickinson <dickinsm@gmail.com>
parents:
47897
diff
changeset
|
1282 |
|
f0db06f49a4e
Issue #3439: add bit_length method to int and long.
Mark Dickinson <dickinsm@gmail.com>
parents:
47897
diff
changeset
|
1283 PyDoc_STRVAR(int_bit_length_doc, |
|
f0db06f49a4e
Issue #3439: add bit_length method to int and long.
Mark Dickinson <dickinsm@gmail.com>
parents:
47897
diff
changeset
|
1284 "int.bit_length() -> int\n\ |
|
f0db06f49a4e
Issue #3439: add bit_length method to int and long.
Mark Dickinson <dickinsm@gmail.com>
parents:
47897
diff
changeset
|
1285 \n\ |
|
f0db06f49a4e
Issue #3439: add bit_length method to int and long.
Mark Dickinson <dickinsm@gmail.com>
parents:
47897
diff
changeset
|
1286 Number of bits necessary to represent self in binary.\n\ |
|
f0db06f49a4e
Issue #3439: add bit_length method to int and long.
Mark Dickinson <dickinsm@gmail.com>
parents:
47897
diff
changeset
|
1287 >>> bin(37)\n\ |
|
f0db06f49a4e
Issue #3439: add bit_length method to int and long.
Mark Dickinson <dickinsm@gmail.com>
parents:
47897
diff
changeset
|
1288 '0b100101'\n\ |
|
f0db06f49a4e
Issue #3439: add bit_length method to int and long.
Mark Dickinson <dickinsm@gmail.com>
parents:
47897
diff
changeset
|
1289 >>> (37).bit_length()\n\ |
|
f0db06f49a4e
Issue #3439: add bit_length method to int and long.
Mark Dickinson <dickinsm@gmail.com>
parents:
47897
diff
changeset
|
1290 6"); |
|
f0db06f49a4e
Issue #3439: add bit_length method to int and long.
Mark Dickinson <dickinsm@gmail.com>
parents:
47897
diff
changeset
|
1291 |
|
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
|
1292 #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
|
1293 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
|
1294 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
|
1295 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1296 Py_RETURN_TRUE; |
|
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
|
1297 } |
|
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
|
1298 #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
|
1299 |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27301
diff
changeset
|
1300 static PyMethodDef int_methods[] = { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1301 {"conjugate", (PyCFunction)int_int, METH_NOARGS, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1302 "Returns self, the complex conjugate of any int."}, |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1303 {"bit_length", (PyCFunction)int_bit_length, METH_NOARGS, |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1304 int_bit_length_doc}, |
|
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
|
1305 #if 0 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1306 {"is_finite", (PyCFunction)int_is_finite, METH_NOARGS, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1307 "Returns always True."}, |
|
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
|
1308 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1309 {"__trunc__", (PyCFunction)int_int, METH_NOARGS, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1310 "Truncating an Integral returns itself."}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1311 {"__getnewargs__", (PyCFunction)int_getnewargs, METH_NOARGS}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1312 {"__format__", (PyCFunction)int__format__, METH_VARARGS}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1313 {NULL, NULL} /* sentinel */ |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27301
diff
changeset
|
1314 }; |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27301
diff
changeset
|
1315 |
|
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
|
1316 static PyGetSetDef int_getset[] = { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1317 {"real", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1318 (getter)int_int, (setter)NULL, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1319 "the real part of a complex number", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1320 NULL}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1321 {"imag", |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1322 (getter)int_get0, (setter)NULL, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1323 "the imaginary part of a complex number", |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1324 NULL}, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1325 {"numerator", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1326 (getter)int_int, (setter)NULL, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1327 "the numerator of a rational number in lowest terms", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1328 NULL}, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1329 {"denominator", |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1330 (getter)int_get1, (setter)NULL, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1331 "the denominator of a rational number in lowest terms", |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1332 NULL}, |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1333 {NULL} /* Sentinel */ |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27301
diff
changeset
|
1334 }; |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
27301
diff
changeset
|
1335 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23299
diff
changeset
|
1336 PyDoc_STRVAR(int_doc, |
|
79590
3b484f53f91b
Issue #14783: Backport changes from 3.2.
Chris Jerdonek <chris.jerdonek@gmail.com>
parents:
72416
diff
changeset
|
1337 "int(x=0) -> int or long\n\ |
|
3b484f53f91b
Issue #14783: Backport changes from 3.2.
Chris Jerdonek <chris.jerdonek@gmail.com>
parents:
72416
diff
changeset
|
1338 int(x, base=10) -> int or long\n\ |
|
3b484f53f91b
Issue #14783: Backport changes from 3.2.
Chris Jerdonek <chris.jerdonek@gmail.com>
parents:
72416
diff
changeset
|
1339 \n\ |
|
3b484f53f91b
Issue #14783: Backport changes from 3.2.
Chris Jerdonek <chris.jerdonek@gmail.com>
parents:
72416
diff
changeset
|
1340 Convert a number or string to an integer, or return 0 if no arguments\n\ |
|
3b484f53f91b
Issue #14783: Backport changes from 3.2.
Chris Jerdonek <chris.jerdonek@gmail.com>
parents:
72416
diff
changeset
|
1341 are given. If x is floating point, the conversion truncates towards zero.\n\ |
|
3b484f53f91b
Issue #14783: Backport changes from 3.2.
Chris Jerdonek <chris.jerdonek@gmail.com>
parents:
72416
diff
changeset
|
1342 If x is outside the integer range, the function returns a long instead.\n\ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18755
diff
changeset
|
1343 \n\ |
|
79590
3b484f53f91b
Issue #14783: Backport changes from 3.2.
Chris Jerdonek <chris.jerdonek@gmail.com>
parents:
72416
diff
changeset
|
1344 If x is not a number or if base is given, then x must be a string or\n\ |
|
3b484f53f91b
Issue #14783: Backport changes from 3.2.
Chris Jerdonek <chris.jerdonek@gmail.com>
parents:
72416
diff
changeset
|
1345 Unicode object representing an integer literal in the given base. The\n\ |
|
3b484f53f91b
Issue #14783: Backport changes from 3.2.
Chris Jerdonek <chris.jerdonek@gmail.com>
parents:
72416
diff
changeset
|
1346 literal can be preceded by '+' or '-' and be surrounded by whitespace.\n\ |
|
3b484f53f91b
Issue #14783: Backport changes from 3.2.
Chris Jerdonek <chris.jerdonek@gmail.com>
parents:
72416
diff
changeset
|
1347 The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to\n\ |
|
3b484f53f91b
Issue #14783: Backport changes from 3.2.
Chris Jerdonek <chris.jerdonek@gmail.com>
parents:
72416
diff
changeset
|
1348 interpret the base from the string as an integer literal.\n\ |
|
3b484f53f91b
Issue #14783: Backport changes from 3.2.
Chris Jerdonek <chris.jerdonek@gmail.com>
parents:
72416
diff
changeset
|
1349 >>> int('0b100', base=0)\n\ |
|
3b484f53f91b
Issue #14783: Backport changes from 3.2.
Chris Jerdonek <chris.jerdonek@gmail.com>
parents:
72416
diff
changeset
|
1350 4"); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18755
diff
changeset
|
1351 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
1352 static PyNumberMethods int_as_number = { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1353 (binaryfunc)int_add, /*nb_add*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1354 (binaryfunc)int_sub, /*nb_subtract*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1355 (binaryfunc)int_mul, /*nb_multiply*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1356 (binaryfunc)int_classic_div, /*nb_divide*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1357 (binaryfunc)int_mod, /*nb_remainder*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1358 (binaryfunc)int_divmod, /*nb_divmod*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1359 (ternaryfunc)int_pow, /*nb_power*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1360 (unaryfunc)int_neg, /*nb_negative*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1361 (unaryfunc)int_int, /*nb_positive*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1362 (unaryfunc)int_abs, /*nb_absolute*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1363 (inquiry)int_nonzero, /*nb_nonzero*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1364 (unaryfunc)int_invert, /*nb_invert*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1365 (binaryfunc)int_lshift, /*nb_lshift*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1366 (binaryfunc)int_rshift, /*nb_rshift*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1367 (binaryfunc)int_and, /*nb_and*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1368 (binaryfunc)int_xor, /*nb_xor*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1369 (binaryfunc)int_or, /*nb_or*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1370 int_coerce, /*nb_coerce*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1371 (unaryfunc)int_int, /*nb_int*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1372 (unaryfunc)int_long, /*nb_long*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1373 (unaryfunc)int_float, /*nb_float*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1374 (unaryfunc)int_oct, /*nb_oct*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1375 (unaryfunc)int_hex, /*nb_hex*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1376 0, /*nb_inplace_add*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1377 0, /*nb_inplace_subtract*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1378 0, /*nb_inplace_multiply*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1379 0, /*nb_inplace_divide*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1380 0, /*nb_inplace_remainder*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1381 0, /*nb_inplace_power*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1382 0, /*nb_inplace_lshift*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1383 0, /*nb_inplace_rshift*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1384 0, /*nb_inplace_and*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1385 0, /*nb_inplace_xor*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1386 0, /*nb_inplace_or*/ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1387 (binaryfunc)int_div, /* nb_floor_divide */ |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1388 (binaryfunc)int_true_divide, /* nb_true_divide */ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1389 0, /* nb_inplace_floor_divide */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1390 0, /* nb_inplace_true_divide */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1391 (unaryfunc)int_int, /* nb_index */ |
| 6 | 1392 }; |
| 1393 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4952
diff
changeset
|
1394 PyTypeObject PyInt_Type = { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1395 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1396 "int", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1397 sizeof(PyIntObject), |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1398 0, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1399 (destructor)int_dealloc, /* tp_dealloc */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1400 (printfunc)int_print, /* tp_print */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1401 0, /* tp_getattr */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1402 0, /* tp_setattr */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1403 (cmpfunc)int_compare, /* tp_compare */ |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1404 (reprfunc)int_to_decimal_string, /* tp_repr */ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1405 &int_as_number, /* tp_as_number */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1406 0, /* tp_as_sequence */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1407 0, /* tp_as_mapping */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1408 (hashfunc)int_hash, /* tp_hash */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1409 0, /* tp_call */ |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
61155
diff
changeset
|
1410 (reprfunc)int_to_decimal_string, /* tp_str */ |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1411 PyObject_GenericGetAttr, /* tp_getattro */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1412 0, /* tp_setattro */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1413 0, /* tp_as_buffer */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1414 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES | |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1415 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_INT_SUBCLASS, /* tp_flags */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1416 int_doc, /* tp_doc */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1417 0, /* tp_traverse */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1418 0, /* tp_clear */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1419 0, /* tp_richcompare */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1420 0, /* tp_weaklistoffset */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1421 0, /* tp_iter */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1422 0, /* tp_iternext */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1423 int_methods, /* tp_methods */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1424 0, /* tp_members */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1425 int_getset, /* tp_getset */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1426 0, /* tp_base */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1427 0, /* tp_dict */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1428 0, /* tp_descr_get */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1429 0, /* tp_descr_set */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1430 0, /* tp_dictoffset */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1431 0, /* tp_init */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1432 0, /* tp_alloc */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1433 int_new, /* tp_new */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1434 (freefunc)int_free, /* tp_free */ |
| 6 | 1435 }; |
|
5936
80d24364b932
Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
1436 |
|
26889
12753e7b15f7
SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents:
26867
diff
changeset
|
1437 int |
|
26923
dbfc3ef7d003
Since the *_Init() are private, prefix with _, suggested by Skip
Neal Norwitz <nnorwitz@gmail.com>
parents:
26889
diff
changeset
|
1438 _PyInt_Init(void) |
|
26889
12753e7b15f7
SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents:
26867
diff
changeset
|
1439 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1440 PyIntObject *v; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1441 int ival; |
|
26889
12753e7b15f7
SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents:
26867
diff
changeset
|
1442 #if NSMALLNEGINTS + NSMALLPOSINTS > 0 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1443 for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1444 if (!free_list && (free_list = fill_free_list()) == NULL) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1445 return 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1446 /* PyObject_New is inlined */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1447 v = free_list; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1448 free_list = (PyIntObject *)Py_TYPE(v); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1449 PyObject_INIT(v, &PyInt_Type); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1450 v->ob_ival = ival; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1451 small_ints[ival + NSMALLNEGINTS] = v; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1452 } |
|
26889
12753e7b15f7
SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents:
26867
diff
changeset
|
1453 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1454 return 1; |
|
26889
12753e7b15f7
SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents:
26867
diff
changeset
|
1455 } |
|
12753e7b15f7
SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents:
26867
diff
changeset
|
1456 |
|
47897
0738119c1ef8
- Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents:
47822
diff
changeset
|
1457 int |
|
0738119c1ef8
- Issue #2862: Make int and float freelist management consistent with other
Gregory P. Smith <greg@mad-scientist.com>
parents:
47822
diff
changeset
|
1458 PyInt_ClearFreeList(void) |
|
5936
80d24364b932
Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
1459 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1460 PyIntObject *p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1461 PyIntBlock *list, *next; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1462 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1463 int u; /* remaining unfreed ints per block */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1464 int freelist_size = 0; |
|
5936
80d24364b932
Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
1465 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1466 list = block_list; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1467 block_list = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1468 free_list = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1469 while (list != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1470 u = 0; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1471 for (i = 0, p = &list->objects[0]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1472 i < N_INTOBJECTS; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1473 i++, p++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1474 if (PyInt_CheckExact(p) && p->ob_refcnt != 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1475 u++; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1476 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1477 next = list->next; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1478 if (u) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1479 list->next = block_list; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1480 block_list = list; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1481 for (i = 0, p = &list->objects[0]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1482 i < N_INTOBJECTS; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1483 i++, p++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1484 if (!PyInt_CheckExact(p) || |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1485 p->ob_refcnt == 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1486 Py_TYPE(p) = (struct _typeobject *) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1487 free_list; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1488 free_list = p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1489 } |
|
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
|
1490 #if NSMALLNEGINTS + NSMALLPOSINTS > 0 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1491 else if (-NSMALLNEGINTS <= p->ob_ival && |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1492 p->ob_ival < NSMALLPOSINTS && |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1493 small_ints[p->ob_ival + |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1494 NSMALLNEGINTS] == NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1495 Py_INCREF(p); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1496 small_ints[p->ob_ival + |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1497 NSMALLNEGINTS] = p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1498 } |
|
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
|
1499 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1500 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1501 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1502 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1503 PyMem_FREE(list); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1504 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1505 freelist_size += u; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1506 list = next; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1507 } |
| 45143 | 1508 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1509 return freelist_size; |
|
26889
12753e7b15f7
SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents:
26867
diff
changeset
|
1510 } |
|
12753e7b15f7
SF #561244, Micro optimizations
Neal Norwitz <nnorwitz@gmail.com>
parents:
26867
diff
changeset
|
1511 |
|
5936
80d24364b932
Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
1512 void |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13423
diff
changeset
|
1513 PyInt_Fini(void) |
|
5936
80d24364b932
Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
1514 { |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1515 PyIntObject *p; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1516 PyIntBlock *list; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1517 int i; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1518 int u; /* total unfreed ints per block */ |
|
10373
07ee795774d8
Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents:
5936
diff
changeset
|
1519 |
|
07ee795774d8
Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents:
5936
diff
changeset
|
1520 #if NSMALLNEGINTS + NSMALLPOSINTS > 0 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1521 PyIntObject **q; |
|
5936
80d24364b932
Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
1522 |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1523 i = NSMALLNEGINTS + NSMALLPOSINTS; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1524 q = small_ints; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1525 while (--i >= 0) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1526 Py_XDECREF(*q); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1527 *q++ = NULL; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1528 } |
|
10373
07ee795774d8
Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
Guido van Rossum <guido@python.org>
parents:
5936
diff
changeset
|
1529 #endif |
|
61465
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1530 u = PyInt_ClearFreeList(); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1531 if (!Py_VerboseFlag) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1532 return; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1533 fprintf(stderr, "# cleanup ints"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1534 if (!u) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1535 fprintf(stderr, "\n"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1536 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1537 else { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1538 fprintf(stderr, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1539 ": %d unfreed int%s\n", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1540 u, u == 1 ? "" : "s"); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1541 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1542 if (Py_VerboseFlag > 1) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1543 list = block_list; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1544 while (list != NULL) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1545 for (i = 0, p = &list->objects[0]; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1546 i < N_INTOBJECTS; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1547 i++, p++) { |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1548 if (PyInt_CheckExact(p) && p->ob_refcnt != 0) |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1549 /* XXX(twouters) cast refcount to |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1550 long until %zd is universally |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1551 available |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1552 */ |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1553 fprintf(stderr, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1554 "# <int at %p, refcnt=%ld, val=%ld>\n", |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1555 p, (long)p->ob_refcnt, |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1556 p->ob_ival); |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1557 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1558 list = list->next; |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1559 } |
|
e38335d4df91
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57568
diff
changeset
|
1560 } |
|
5936
80d24364b932
Added _Fini() routines to free up some memory
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
1561 } |
