Mercurial > cpython-lru_cache-weakref
annotate Modules/testcapi_long.h @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | 71100ef4f7a2 |
| children |
| rev | line source |
|---|---|
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
1 /* Poor-man's template. Macros used: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
2 TESTNAME name of the test (like test_long_api_inner) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
3 TYPENAME the signed type (like long) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
4 F_S_TO_PY convert signed to pylong; TYPENAME -> PyObject* |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
5 F_PY_TO_S convert pylong to signed; PyObject* -> TYPENAME |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
6 F_U_TO_PY convert unsigned to pylong; unsigned TYPENAME -> PyObject* |
|
18132
e887d6862f77
Fix error in comment, and in test_long_api and test_longlong_api remove
Tim Peters <tim.peters@gmail.com>
parents:
18112
diff
changeset
|
7 F_PY_TO_U convert pylong to unsigned; PyObject* -> unsigned TYPENAME |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
8 */ |
|
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
9 |
|
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
10 static PyObject * |
|
18132
e887d6862f77
Fix error in comment, and in test_long_api and test_longlong_api remove
Tim Peters <tim.peters@gmail.com>
parents:
18112
diff
changeset
|
11 TESTNAME(PyObject *error(const char*)) |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
12 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
13 const int NBITS = sizeof(TYPENAME) * 8; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
14 unsigned TYPENAME base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
15 PyObject *pyresult; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
16 int i; |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
17 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
18 /* Note: This test lets PyObjects leak if an error is raised. Since |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
19 an error should never be raised, leaks are impossible <wink>. */ |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
20 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
21 /* Test native -> PyLong -> native roundtrip identity. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
22 * Generate all powers of 2, and test them and their negations, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
23 * plus the numbers +-1 off from them. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
24 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
25 base = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
26 for (i = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
27 i < NBITS + 1; /* on last, base overflows to 0 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
28 ++i, base <<= 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
29 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
30 int j; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
31 for (j = 0; j < 6; ++j) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
32 TYPENAME in, out; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
33 unsigned TYPENAME uin, uout; |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
34 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
35 /* For 0, 1, 2 use base; for 3, 4, 5 use -base */ |
|
73623
71100ef4f7a2
Issue #9530: Fix undefined behaviour due to signed overflow in testcapi_long.h.
Mark Dickinson <mdickinson@enthought.com>
parents:
72312
diff
changeset
|
36 uin = j < 3 ? base : 0U - base; |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
37 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
38 /* For 0 & 3, subtract 1. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
39 * For 1 & 4, leave alone. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
40 * For 2 & 5, add 1. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
41 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
42 uin += (unsigned TYPENAME)(TYPENAME)(j % 3 - 1); |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
43 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
44 pyresult = F_U_TO_PY(uin); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
45 if (pyresult == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
46 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
47 "unsigned unexpected null result"); |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
48 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
49 uout = F_PY_TO_U(pyresult); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
50 if (uout == (unsigned TYPENAME)-1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
51 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
52 "unsigned unexpected -1 result"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
53 if (uout != uin) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
54 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
55 "unsigned output != input"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
56 UNBIND(pyresult); |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
57 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
58 in = (TYPENAME)uin; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
59 pyresult = F_S_TO_PY(in); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
60 if (pyresult == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
61 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
62 "signed unexpected null result"); |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
63 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
64 out = F_PY_TO_S(pyresult); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
65 if (out == (TYPENAME)-1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
66 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
67 "signed unexpected -1 result"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
68 if (out != in) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
69 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
70 "signed output != input"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
71 UNBIND(pyresult); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
72 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
73 } |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
74 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
75 /* Overflow tests. The loop above ensured that all limit cases that |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
76 * should not overflow don't overflow, so all we need to do here is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
77 * provoke one-over-the-limit cases (not exhaustive, but sharp). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
78 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
79 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
80 PyObject *one, *x, *y; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
81 TYPENAME out; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
82 unsigned TYPENAME uout; |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
83 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
84 one = PyLong_FromLong(1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
85 if (one == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
86 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
87 "unexpected NULL from PyLong_FromLong"); |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
88 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
89 /* Unsigned complains about -1? */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
90 x = PyNumber_Negative(one); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
91 if (x == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
92 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
93 "unexpected NULL from PyNumber_Negative"); |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
94 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
95 uout = F_PY_TO_U(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
96 if (uout != (unsigned TYPENAME)-1 || !PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
97 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
98 "PyLong_AsUnsignedXXX(-1) didn't complain"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
99 if (!PyErr_ExceptionMatches(PyExc_OverflowError)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
100 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
101 "PyLong_AsUnsignedXXX(-1) raised " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
102 "something other than OverflowError"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
103 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
104 UNBIND(x); |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
105 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
106 /* Unsigned complains about 2**NBITS? */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
107 y = PyLong_FromLong((long)NBITS); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
108 if (y == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
109 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
110 "unexpected NULL from PyLong_FromLong"); |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
111 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
112 x = PyNumber_Lshift(one, y); /* 1L << NBITS, == 2**NBITS */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
113 UNBIND(y); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
114 if (x == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
115 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
116 "unexpected NULL from PyNumber_Lshift"); |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
117 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
118 uout = F_PY_TO_U(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
119 if (uout != (unsigned TYPENAME)-1 || !PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
120 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
121 "PyLong_AsUnsignedXXX(2**NBITS) didn't " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
122 "complain"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
123 if (!PyErr_ExceptionMatches(PyExc_OverflowError)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
124 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
125 "PyLong_AsUnsignedXXX(2**NBITS) raised " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
126 "something other than OverflowError"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
127 PyErr_Clear(); |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
128 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
129 /* Signed complains about 2**(NBITS-1)? |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
130 x still has 2**NBITS. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
131 y = PyNumber_Rshift(x, one); /* 2**(NBITS-1) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
132 UNBIND(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
133 if (y == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
134 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
135 "unexpected NULL from PyNumber_Rshift"); |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
136 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
137 out = F_PY_TO_S(y); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
138 if (out != (TYPENAME)-1 || !PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
139 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
140 "PyLong_AsXXX(2**(NBITS-1)) didn't " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
141 "complain"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
142 if (!PyErr_ExceptionMatches(PyExc_OverflowError)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
143 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
144 "PyLong_AsXXX(2**(NBITS-1)) raised " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
145 "something other than OverflowError"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
146 PyErr_Clear(); |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
147 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
148 /* Signed complains about -2**(NBITS-1)-1?; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
149 y still has 2**(NBITS-1). */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
150 x = PyNumber_Negative(y); /* -(2**(NBITS-1)) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
151 UNBIND(y); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
152 if (x == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
153 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
154 "unexpected NULL from PyNumber_Negative"); |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
155 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
156 y = PyNumber_Subtract(x, one); /* -(2**(NBITS-1))-1 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
157 UNBIND(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
158 if (y == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
159 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
160 "unexpected NULL from PyNumber_Subtract"); |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
161 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
162 out = F_PY_TO_S(y); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
163 if (out != (TYPENAME)-1 || !PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
164 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
165 "PyLong_AsXXX(-2**(NBITS-1)-1) didn't " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
166 "complain"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
167 if (!PyErr_ExceptionMatches(PyExc_OverflowError)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
168 return error( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
169 "PyLong_AsXXX(-2**(NBITS-1)-1) raised " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
170 "something other than OverflowError"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
171 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
172 UNBIND(y); |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
173 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
174 Py_XDECREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
175 Py_XDECREF(y); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
176 Py_DECREF(one); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
177 } |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
178 |
|
72312
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
179 /* Test F_PY_TO_{S,U} on non-pylong input. This should raise a TypeError. */ |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
180 { |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
181 TYPENAME out; |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
182 unsigned TYPENAME uout; |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
183 |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
184 Py_INCREF(Py_None); |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
185 |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
186 out = F_PY_TO_S(Py_None); |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
187 if (out != (TYPENAME)-1 || !PyErr_Occurred()) |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
188 return error("PyLong_AsXXX(None) didn't complain"); |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
189 if (!PyErr_ExceptionMatches(PyExc_TypeError)) |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
190 return error("PyLong_AsXXX(None) raised " |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
191 "something other than TypeError"); |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
192 PyErr_Clear(); |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
193 |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
194 uout = F_PY_TO_U(Py_None); |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
195 if (uout != (unsigned TYPENAME)-1 || !PyErr_Occurred()) |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
196 return error("PyLong_AsXXX(None) didn't complain"); |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
197 if (!PyErr_ExceptionMatches(PyExc_TypeError)) |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
198 return error("PyLong_AsXXX(None) raised " |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
199 "something other than TypeError"); |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
200 PyErr_Clear(); |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
201 |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
202 Py_DECREF(Py_None); |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
203 } |
|
4a66a35da3fd
Issue #12909: Make PyLong_As* functions consistent in their use of exceptions.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
61467
diff
changeset
|
204 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
205 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51518
diff
changeset
|
206 return Py_None; |
|
18112
9eb469a43144
Add tests of PyLong_{As,From}{Unsigned,}Long. These are very much like
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
207 } |
