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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }