]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Modules/testcapi_long.h
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Modules / testcapi_long.h
CommitLineData
4710c53d 1/* Poor-man's template. Macros used:\r
2 TESTNAME name of the test (like test_long_api_inner)\r
3 TYPENAME the signed type (like long)\r
4 F_S_TO_PY convert signed to pylong; TYPENAME -> PyObject*\r
5 F_PY_TO_S convert pylong to signed; PyObject* -> TYPENAME\r
6 F_U_TO_PY convert unsigned to pylong; unsigned TYPENAME -> PyObject*\r
7 F_PY_TO_U convert pylong to unsigned; PyObject* -> unsigned TYPENAME\r
8*/\r
9\r
10static PyObject *\r
11TESTNAME(PyObject *error(const char*))\r
12{\r
13 const int NBITS = sizeof(TYPENAME) * 8;\r
14 unsigned TYPENAME base;\r
15 PyObject *pyresult;\r
16 int i;\r
17\r
18 /* Note: This test lets PyObjects leak if an error is raised. Since\r
19 an error should never be raised, leaks are impossible <wink>. */\r
20\r
21 /* Test native -> PyLong -> native roundtrip identity.\r
22 * Generate all powers of 2, and test them and their negations,\r
23 * plus the numbers +-1 off from them.\r
24 */\r
25 base = 1;\r
26 for (i = 0;\r
27 i < NBITS + 1; /* on last, base overflows to 0 */\r
28 ++i, base <<= 1)\r
29 {\r
30 int j;\r
31 for (j = 0; j < 6; ++j) {\r
32 TYPENAME in, out;\r
33 unsigned TYPENAME uin, uout;\r
34\r
35 /* For 0, 1, 2 use base; for 3, 4, 5 use -base */\r
36 uin = j < 3 ? base\r
37 : (unsigned TYPENAME)(-(TYPENAME)base);\r
38\r
39 /* For 0 & 3, subtract 1.\r
40 * For 1 & 4, leave alone.\r
41 * For 2 & 5, add 1.\r
42 */\r
43 uin += (unsigned TYPENAME)(TYPENAME)(j % 3 - 1);\r
44\r
45 pyresult = F_U_TO_PY(uin);\r
46 if (pyresult == NULL)\r
47 return error(\r
48 "unsigned unexpected null result");\r
49\r
50 uout = F_PY_TO_U(pyresult);\r
51 if (uout == (unsigned TYPENAME)-1 && PyErr_Occurred())\r
52 return error(\r
53 "unsigned unexpected -1 result");\r
54 if (uout != uin)\r
55 return error(\r
56 "unsigned output != input");\r
57 UNBIND(pyresult);\r
58\r
59 in = (TYPENAME)uin;\r
60 pyresult = F_S_TO_PY(in);\r
61 if (pyresult == NULL)\r
62 return error(\r
63 "signed unexpected null result");\r
64\r
65 out = F_PY_TO_S(pyresult);\r
66 if (out == (TYPENAME)-1 && PyErr_Occurred())\r
67 return error(\r
68 "signed unexpected -1 result");\r
69 if (out != in)\r
70 return error(\r
71 "signed output != input");\r
72 UNBIND(pyresult);\r
73 }\r
74 }\r
75\r
76 /* Overflow tests. The loop above ensured that all limit cases that\r
77 * should not overflow don't overflow, so all we need to do here is\r
78 * provoke one-over-the-limit cases (not exhaustive, but sharp).\r
79 */\r
80 {\r
81 PyObject *one, *x, *y;\r
82 TYPENAME out;\r
83 unsigned TYPENAME uout;\r
84\r
85 one = PyLong_FromLong(1);\r
86 if (one == NULL)\r
87 return error(\r
88 "unexpected NULL from PyLong_FromLong");\r
89\r
90 /* Unsigned complains about -1? */\r
91 x = PyNumber_Negative(one);\r
92 if (x == NULL)\r
93 return error(\r
94 "unexpected NULL from PyNumber_Negative");\r
95\r
96 uout = F_PY_TO_U(x);\r
97 if (uout != (unsigned TYPENAME)-1 || !PyErr_Occurred())\r
98 return error(\r
99 "PyLong_AsUnsignedXXX(-1) didn't complain");\r
100 if (!PyErr_ExceptionMatches(PyExc_OverflowError))\r
101 return error(\r
102 "PyLong_AsUnsignedXXX(-1) raised "\r
103 "something other than OverflowError");\r
104 PyErr_Clear();\r
105 UNBIND(x);\r
106\r
107 /* Unsigned complains about 2**NBITS? */\r
108 y = PyLong_FromLong((long)NBITS);\r
109 if (y == NULL)\r
110 return error(\r
111 "unexpected NULL from PyLong_FromLong");\r
112\r
113 x = PyNumber_Lshift(one, y); /* 1L << NBITS, == 2**NBITS */\r
114 UNBIND(y);\r
115 if (x == NULL)\r
116 return error(\r
117 "unexpected NULL from PyNumber_Lshift");\r
118\r
119 uout = F_PY_TO_U(x);\r
120 if (uout != (unsigned TYPENAME)-1 || !PyErr_Occurred())\r
121 return error(\r
122 "PyLong_AsUnsignedXXX(2**NBITS) didn't "\r
123 "complain");\r
124 if (!PyErr_ExceptionMatches(PyExc_OverflowError))\r
125 return error(\r
126 "PyLong_AsUnsignedXXX(2**NBITS) raised "\r
127 "something other than OverflowError");\r
128 PyErr_Clear();\r
129\r
130 /* Signed complains about 2**(NBITS-1)?\r
131 x still has 2**NBITS. */\r
132 y = PyNumber_Rshift(x, one); /* 2**(NBITS-1) */\r
133 UNBIND(x);\r
134 if (y == NULL)\r
135 return error(\r
136 "unexpected NULL from PyNumber_Rshift");\r
137\r
138 out = F_PY_TO_S(y);\r
139 if (out != (TYPENAME)-1 || !PyErr_Occurred())\r
140 return error(\r
141 "PyLong_AsXXX(2**(NBITS-1)) didn't "\r
142 "complain");\r
143 if (!PyErr_ExceptionMatches(PyExc_OverflowError))\r
144 return error(\r
145 "PyLong_AsXXX(2**(NBITS-1)) raised "\r
146 "something other than OverflowError");\r
147 PyErr_Clear();\r
148\r
149 /* Signed complains about -2**(NBITS-1)-1?;\r
150 y still has 2**(NBITS-1). */\r
151 x = PyNumber_Negative(y); /* -(2**(NBITS-1)) */\r
152 UNBIND(y);\r
153 if (x == NULL)\r
154 return error(\r
155 "unexpected NULL from PyNumber_Negative");\r
156\r
157 y = PyNumber_Subtract(x, one); /* -(2**(NBITS-1))-1 */\r
158 UNBIND(x);\r
159 if (y == NULL)\r
160 return error(\r
161 "unexpected NULL from PyNumber_Subtract");\r
162\r
163 out = F_PY_TO_S(y);\r
164 if (out != (TYPENAME)-1 || !PyErr_Occurred())\r
165 return error(\r
166 "PyLong_AsXXX(-2**(NBITS-1)-1) didn't "\r
167 "complain");\r
168 if (!PyErr_ExceptionMatches(PyExc_OverflowError))\r
169 return error(\r
170 "PyLong_AsXXX(-2**(NBITS-1)-1) raised "\r
171 "something other than OverflowError");\r
172 PyErr_Clear();\r
173 UNBIND(y);\r
174\r
175 Py_XDECREF(x);\r
176 Py_XDECREF(y);\r
177 Py_DECREF(one);\r
178 }\r
179\r
180 Py_INCREF(Py_None);\r
181 return Py_None;\r
182}\r