/src/cpython/Python/modsupport.c
Line | Count | Source (jump to first uncovered line) |
1 | | |
2 | | /* Module support implementation */ |
3 | | |
4 | | #include "Python.h" |
5 | | #include "pycore_abstract.h" // _PyIndex_Check() |
6 | | #include "pycore_object.h" // _PyType_IsReady() |
7 | | |
8 | | typedef double va_double; |
9 | | |
10 | | static PyObject *va_build_value(const char *, va_list); |
11 | | |
12 | | |
13 | | int |
14 | | _Py_convert_optional_to_ssize_t(PyObject *obj, void *result) |
15 | 201k | { |
16 | 201k | Py_ssize_t limit; |
17 | 201k | if (obj == Py_None) { |
18 | 0 | return 1; |
19 | 0 | } |
20 | 201k | else if (_PyIndex_Check(obj)) { |
21 | 201k | limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError); |
22 | 201k | if (limit == -1 && PyErr_Occurred()) { |
23 | 0 | return 0; |
24 | 0 | } |
25 | 201k | } |
26 | 0 | else { |
27 | 0 | PyErr_Format(PyExc_TypeError, |
28 | 0 | "argument should be integer or None, not '%.200s'", |
29 | 0 | Py_TYPE(obj)->tp_name); |
30 | 0 | return 0; |
31 | 0 | } |
32 | 201k | *((Py_ssize_t *)result) = limit; |
33 | 201k | return 1; |
34 | 201k | } |
35 | | |
36 | | |
37 | | /* Helper for mkvalue() to scan the length of a format */ |
38 | | |
39 | | static Py_ssize_t |
40 | | countformat(const char *format, char endchar) |
41 | 1.55M | { |
42 | 1.55M | Py_ssize_t count = 0; |
43 | 1.55M | int level = 0; |
44 | 6.22M | while (level > 0 || *format != endchar) { |
45 | 4.67M | switch (*format) { |
46 | 0 | case '\0': |
47 | | /* Premature end */ |
48 | 0 | PyErr_SetString(PyExc_SystemError, |
49 | 0 | "unmatched paren in format"); |
50 | 0 | return -1; |
51 | 270k | case '(': |
52 | 270k | case '[': |
53 | 272k | case '{': |
54 | 272k | if (level == 0) { |
55 | 269k | count++; |
56 | 269k | } |
57 | 272k | level++; |
58 | 272k | break; |
59 | 270k | case ')': |
60 | 270k | case ']': |
61 | 272k | case '}': |
62 | 272k | level--; |
63 | 272k | break; |
64 | 66.9k | case '#': |
65 | 66.9k | case '&': |
66 | 66.9k | case ',': |
67 | 66.9k | case ':': |
68 | 66.9k | case ' ': |
69 | 66.9k | case '\t': |
70 | 66.9k | break; |
71 | 4.06M | default: |
72 | 4.06M | if (level == 0) { |
73 | 3.41M | count++; |
74 | 3.41M | } |
75 | 4.67M | } |
76 | 4.67M | format++; |
77 | 4.67M | } |
78 | 1.55M | return count; |
79 | 1.55M | } |
80 | | |
81 | | |
82 | | /* Generic function to create a value -- the inverse of getargs() */ |
83 | | /* After an original idea and first implementation by Steven Miale */ |
84 | | |
85 | | static PyObject *do_mktuple(const char**, va_list *, char, Py_ssize_t); |
86 | | static int do_mkstack(PyObject **, const char**, va_list *, char, Py_ssize_t); |
87 | | static PyObject *do_mklist(const char**, va_list *, char, Py_ssize_t); |
88 | | static PyObject *do_mkdict(const char**, va_list *, char, Py_ssize_t); |
89 | | static PyObject *do_mkvalue(const char**, va_list *); |
90 | | |
91 | | static int |
92 | | check_end(const char **p_format, char endchar) |
93 | 1.29M | { |
94 | 1.29M | const char *f = *p_format; |
95 | 1.29M | while (*f != endchar) { |
96 | 0 | if (*f != ' ' && *f != '\t' && *f != ',' && *f != ':') { |
97 | 0 | PyErr_SetString(PyExc_SystemError, |
98 | 0 | "Unmatched paren in format"); |
99 | 0 | return 0; |
100 | 0 | } |
101 | 0 | f++; |
102 | 0 | } |
103 | 1.29M | if (endchar) { |
104 | 269k | f++; |
105 | 269k | } |
106 | 1.29M | *p_format = f; |
107 | 1.29M | return 1; |
108 | 1.29M | } |
109 | | |
110 | | static void |
111 | | do_ignore(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n) |
112 | 0 | { |
113 | 0 | assert(PyErr_Occurred()); |
114 | 0 | PyObject *v = PyTuple_New(n); |
115 | 0 | for (Py_ssize_t i = 0; i < n; i++) { |
116 | 0 | PyObject *exc = PyErr_GetRaisedException(); |
117 | 0 | PyObject *w = do_mkvalue(p_format, p_va); |
118 | 0 | PyErr_SetRaisedException(exc); |
119 | 0 | if (w != NULL) { |
120 | 0 | if (v != NULL) { |
121 | 0 | PyTuple_SET_ITEM(v, i, w); |
122 | 0 | } |
123 | 0 | else { |
124 | 0 | Py_DECREF(w); |
125 | 0 | } |
126 | 0 | } |
127 | 0 | } |
128 | 0 | Py_XDECREF(v); |
129 | 0 | if (!check_end(p_format, endchar)) { |
130 | 0 | return; |
131 | 0 | } |
132 | 0 | } |
133 | | |
134 | | static PyObject * |
135 | | do_mkdict(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n) |
136 | 1.28k | { |
137 | 1.28k | PyObject *d; |
138 | 1.28k | Py_ssize_t i; |
139 | 1.28k | if (n < 0) |
140 | 0 | return NULL; |
141 | 1.28k | if (n % 2) { |
142 | 0 | PyErr_SetString(PyExc_SystemError, |
143 | 0 | "Bad dict format"); |
144 | 0 | do_ignore(p_format, p_va, endchar, n); |
145 | 0 | return NULL; |
146 | 0 | } |
147 | | /* Note that we can't bail immediately on error as this will leak |
148 | | refcounts on any 'N' arguments. */ |
149 | 1.28k | if ((d = PyDict_New()) == NULL) { |
150 | 0 | do_ignore(p_format, p_va, endchar, n); |
151 | 0 | return NULL; |
152 | 0 | } |
153 | 6.29k | for (i = 0; i < n; i+= 2) { |
154 | 5.01k | PyObject *k, *v; |
155 | | |
156 | 5.01k | k = do_mkvalue(p_format, p_va); |
157 | 5.01k | if (k == NULL) { |
158 | 0 | do_ignore(p_format, p_va, endchar, n - i - 1); |
159 | 0 | Py_DECREF(d); |
160 | 0 | return NULL; |
161 | 0 | } |
162 | 5.01k | v = do_mkvalue(p_format, p_va); |
163 | 5.01k | if (v == NULL || PyDict_SetItem(d, k, v) < 0) { |
164 | 0 | do_ignore(p_format, p_va, endchar, n - i - 2); |
165 | 0 | Py_DECREF(k); |
166 | 0 | Py_XDECREF(v); |
167 | 0 | Py_DECREF(d); |
168 | 0 | return NULL; |
169 | 0 | } |
170 | 5.01k | Py_DECREF(k); |
171 | 5.01k | Py_DECREF(v); |
172 | 5.01k | } |
173 | 1.28k | if (!check_end(p_format, endchar)) { |
174 | 0 | Py_DECREF(d); |
175 | 0 | return NULL; |
176 | 0 | } |
177 | 1.28k | return d; |
178 | 1.28k | } |
179 | | |
180 | | static PyObject * |
181 | | do_mklist(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n) |
182 | 0 | { |
183 | 0 | PyObject *v; |
184 | 0 | Py_ssize_t i; |
185 | 0 | if (n < 0) |
186 | 0 | return NULL; |
187 | | /* Note that we can't bail immediately on error as this will leak |
188 | | refcounts on any 'N' arguments. */ |
189 | 0 | v = PyList_New(n); |
190 | 0 | if (v == NULL) { |
191 | 0 | do_ignore(p_format, p_va, endchar, n); |
192 | 0 | return NULL; |
193 | 0 | } |
194 | 0 | for (i = 0; i < n; i++) { |
195 | 0 | PyObject *w = do_mkvalue(p_format, p_va); |
196 | 0 | if (w == NULL) { |
197 | 0 | do_ignore(p_format, p_va, endchar, n - i - 1); |
198 | 0 | Py_DECREF(v); |
199 | 0 | return NULL; |
200 | 0 | } |
201 | 0 | PyList_SET_ITEM(v, i, w); |
202 | 0 | } |
203 | 0 | if (!check_end(p_format, endchar)) { |
204 | 0 | Py_DECREF(v); |
205 | 0 | return NULL; |
206 | 0 | } |
207 | 0 | return v; |
208 | 0 | } |
209 | | |
210 | | static int |
211 | | do_mkstack(PyObject **stack, const char **p_format, va_list *p_va, |
212 | | char endchar, Py_ssize_t n) |
213 | 251k | { |
214 | 251k | Py_ssize_t i; |
215 | | |
216 | 251k | if (n < 0) { |
217 | 0 | return -1; |
218 | 0 | } |
219 | | /* Note that we can't bail immediately on error as this will leak |
220 | | refcounts on any 'N' arguments. */ |
221 | 1.49M | for (i = 0; i < n; i++) { |
222 | 1.24M | PyObject *w = do_mkvalue(p_format, p_va); |
223 | 1.24M | if (w == NULL) { |
224 | 0 | do_ignore(p_format, p_va, endchar, n - i - 1); |
225 | 0 | goto error; |
226 | 0 | } |
227 | 1.24M | stack[i] = w; |
228 | 1.24M | } |
229 | 251k | if (!check_end(p_format, endchar)) { |
230 | 0 | goto error; |
231 | 0 | } |
232 | 251k | return 0; |
233 | | |
234 | 0 | error: |
235 | 0 | n = i; |
236 | 0 | for (i=0; i < n; i++) { |
237 | 0 | Py_DECREF(stack[i]); |
238 | 0 | } |
239 | 0 | return -1; |
240 | 251k | } |
241 | | |
242 | | static PyObject * |
243 | | do_mktuple(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n) |
244 | 1.03M | { |
245 | 1.03M | PyObject *v; |
246 | 1.03M | Py_ssize_t i; |
247 | 1.03M | if (n < 0) |
248 | 0 | return NULL; |
249 | | /* Note that we can't bail immediately on error as this will leak |
250 | | refcounts on any 'N' arguments. */ |
251 | 1.03M | if ((v = PyTuple_New(n)) == NULL) { |
252 | 0 | do_ignore(p_format, p_va, endchar, n); |
253 | 0 | return NULL; |
254 | 0 | } |
255 | 3.20M | for (i = 0; i < n; i++) { |
256 | 2.16M | PyObject *w = do_mkvalue(p_format, p_va); |
257 | 2.16M | if (w == NULL) { |
258 | 0 | do_ignore(p_format, p_va, endchar, n - i - 1); |
259 | 0 | Py_DECREF(v); |
260 | 0 | return NULL; |
261 | 0 | } |
262 | 2.16M | PyTuple_SET_ITEM(v, i, w); |
263 | 2.16M | } |
264 | 1.03M | if (!check_end(p_format, endchar)) { |
265 | 0 | Py_DECREF(v); |
266 | 0 | return NULL; |
267 | 0 | } |
268 | 1.03M | return v; |
269 | 1.03M | } |
270 | | |
271 | | static PyObject * |
272 | | do_mkvalue(const char **p_format, va_list *p_va) |
273 | 3.68M | { |
274 | 3.68M | for (;;) { |
275 | 3.68M | switch (*(*p_format)++) { |
276 | 268k | case '(': |
277 | 268k | return do_mktuple(p_format, p_va, ')', |
278 | 268k | countformat(*p_format, ')')); |
279 | | |
280 | 0 | case '[': |
281 | 0 | return do_mklist(p_format, p_va, ']', |
282 | 0 | countformat(*p_format, ']')); |
283 | | |
284 | 1.28k | case '{': |
285 | 1.28k | return do_mkdict(p_format, p_va, '}', |
286 | 1.28k | countformat(*p_format, '}')); |
287 | | |
288 | 0 | case 'b': |
289 | 0 | case 'B': |
290 | 0 | case 'h': |
291 | 70.1k | case 'i': |
292 | 70.1k | return PyLong_FromLong((long)va_arg(*p_va, int)); |
293 | | |
294 | 0 | case 'H': |
295 | 0 | return PyLong_FromLong((long)va_arg(*p_va, unsigned int)); |
296 | | |
297 | 40 | case 'I': |
298 | 40 | { |
299 | 40 | unsigned int n; |
300 | 40 | n = va_arg(*p_va, unsigned int); |
301 | 40 | return PyLong_FromUnsignedLong(n); |
302 | 0 | } |
303 | | |
304 | 1.51M | case 'n': |
305 | | #if SIZEOF_SIZE_T!=SIZEOF_LONG |
306 | | return PyLong_FromSsize_t(va_arg(*p_va, Py_ssize_t)); |
307 | | #endif |
308 | | /* Fall through from 'n' to 'l' if Py_ssize_t is long */ |
309 | 1.51M | _Py_FALLTHROUGH; |
310 | 1.51M | case 'l': |
311 | 1.51M | return PyLong_FromLong(va_arg(*p_va, long)); |
312 | | |
313 | 0 | case 'k': |
314 | 0 | { |
315 | 0 | unsigned long n; |
316 | 0 | n = va_arg(*p_va, unsigned long); |
317 | 0 | return PyLong_FromUnsignedLong(n); |
318 | 1.51M | } |
319 | | |
320 | 0 | case 'L': |
321 | 0 | return PyLong_FromLongLong((long long)va_arg(*p_va, long long)); |
322 | | |
323 | 0 | case 'K': |
324 | 0 | return PyLong_FromUnsignedLongLong( |
325 | 0 | va_arg(*p_va, unsigned long long)); |
326 | | |
327 | 0 | case 'u': |
328 | 0 | { |
329 | 0 | PyObject *v; |
330 | 0 | const wchar_t *u = va_arg(*p_va, wchar_t*); |
331 | 0 | Py_ssize_t n; |
332 | 0 | if (**p_format == '#') { |
333 | 0 | ++*p_format; |
334 | 0 | n = va_arg(*p_va, Py_ssize_t); |
335 | 0 | } |
336 | 0 | else |
337 | 0 | n = -1; |
338 | 0 | if (u == NULL) { |
339 | 0 | v = Py_NewRef(Py_None); |
340 | 0 | } |
341 | 0 | else { |
342 | 0 | if (n < 0) |
343 | 0 | n = wcslen(u); |
344 | 0 | v = PyUnicode_FromWideChar(u, n); |
345 | 0 | } |
346 | 0 | return v; |
347 | 1.51M | } |
348 | 0 | case 'f': |
349 | 0 | case 'd': |
350 | 0 | return PyFloat_FromDouble( |
351 | 0 | (double)va_arg(*p_va, va_double)); |
352 | | |
353 | 0 | case 'D': |
354 | 0 | return PyComplex_FromCComplex( |
355 | 0 | *((Py_complex *)va_arg(*p_va, Py_complex *))); |
356 | | |
357 | 158 | case 'c': |
358 | 158 | { |
359 | 158 | char p[1]; |
360 | 158 | p[0] = (char)va_arg(*p_va, int); |
361 | 158 | return PyBytes_FromStringAndSize(p, 1); |
362 | 0 | } |
363 | 0 | case 'C': |
364 | 0 | { |
365 | 0 | int i = va_arg(*p_va, int); |
366 | 0 | return PyUnicode_FromOrdinal(i); |
367 | 0 | } |
368 | 0 | case 'p': |
369 | 0 | { |
370 | 0 | int i = va_arg(*p_va, int); |
371 | 0 | return PyBool_FromLong(i); |
372 | 0 | } |
373 | | |
374 | 484k | case 's': |
375 | 486k | case 'z': |
376 | 486k | case 'U': /* XXX deprecated alias */ |
377 | 486k | { |
378 | 486k | PyObject *v; |
379 | 486k | const char *str = va_arg(*p_va, const char *); |
380 | 486k | Py_ssize_t n; |
381 | 486k | if (**p_format == '#') { |
382 | 0 | ++*p_format; |
383 | 0 | n = va_arg(*p_va, Py_ssize_t); |
384 | 0 | } |
385 | 486k | else |
386 | 486k | n = -1; |
387 | 486k | if (str == NULL) { |
388 | 0 | v = Py_NewRef(Py_None); |
389 | 0 | } |
390 | 486k | else { |
391 | 486k | if (n < 0) { |
392 | 486k | size_t m = strlen(str); |
393 | 486k | if (m > PY_SSIZE_T_MAX) { |
394 | 0 | PyErr_SetString(PyExc_OverflowError, |
395 | 0 | "string too long for Python string"); |
396 | 0 | return NULL; |
397 | 0 | } |
398 | 486k | n = (Py_ssize_t)m; |
399 | 486k | } |
400 | 486k | v = PyUnicode_FromStringAndSize(str, n); |
401 | 486k | } |
402 | 486k | return v; |
403 | 486k | } |
404 | | |
405 | 66.9k | case 'y': |
406 | 66.9k | { |
407 | 66.9k | PyObject *v; |
408 | 66.9k | const char *str = va_arg(*p_va, const char *); |
409 | 66.9k | Py_ssize_t n; |
410 | 66.9k | if (**p_format == '#') { |
411 | 66.9k | ++*p_format; |
412 | 66.9k | n = va_arg(*p_va, Py_ssize_t); |
413 | 66.9k | } |
414 | 0 | else |
415 | 0 | n = -1; |
416 | 66.9k | if (str == NULL) { |
417 | 0 | v = Py_NewRef(Py_None); |
418 | 0 | } |
419 | 66.9k | else { |
420 | 66.9k | if (n < 0) { |
421 | 0 | size_t m = strlen(str); |
422 | 0 | if (m > PY_SSIZE_T_MAX) { |
423 | 0 | PyErr_SetString(PyExc_OverflowError, |
424 | 0 | "string too long for Python bytes"); |
425 | 0 | return NULL; |
426 | 0 | } |
427 | 0 | n = (Py_ssize_t)m; |
428 | 0 | } |
429 | 66.9k | v = PyBytes_FromStringAndSize(str, n); |
430 | 66.9k | } |
431 | 66.9k | return v; |
432 | 66.9k | } |
433 | | |
434 | 1.01M | case 'N': |
435 | 1.01M | case 'S': |
436 | 1.27M | case 'O': |
437 | 1.27M | if (**p_format == '&') { |
438 | 0 | typedef PyObject *(*converter)(void *); |
439 | 0 | converter func = va_arg(*p_va, converter); |
440 | 0 | void *arg = va_arg(*p_va, void *); |
441 | 0 | ++*p_format; |
442 | 0 | return (*func)(arg); |
443 | 0 | } |
444 | 1.27M | else { |
445 | 1.27M | PyObject *v; |
446 | 1.27M | v = va_arg(*p_va, PyObject *); |
447 | 1.27M | if (v != NULL) { |
448 | 1.27M | if (*(*p_format - 1) != 'N') |
449 | 256k | Py_INCREF(v); |
450 | 1.27M | } |
451 | 0 | else if (!PyErr_Occurred()) |
452 | | /* If a NULL was passed |
453 | | * because a call that should |
454 | | * have constructed a value |
455 | | * failed, that's OK, and we |
456 | | * pass the error on; but if |
457 | | * no error occurred it's not |
458 | | * clear that the caller knew |
459 | | * what she was doing. */ |
460 | 0 | PyErr_SetString(PyExc_SystemError, |
461 | 0 | "NULL object passed to Py_BuildValue"); |
462 | 1.27M | return v; |
463 | 1.27M | } |
464 | | |
465 | 0 | case ':': |
466 | 0 | case ',': |
467 | 0 | case ' ': |
468 | 0 | case '\t': |
469 | 0 | break; |
470 | | |
471 | 0 | default: |
472 | 0 | PyErr_SetString(PyExc_SystemError, |
473 | 0 | "bad format char passed to Py_BuildValue"); |
474 | 0 | return NULL; |
475 | | |
476 | 3.68M | } |
477 | 3.68M | } |
478 | 3.68M | } |
479 | | |
480 | | |
481 | | PyObject * |
482 | | Py_BuildValue(const char *format, ...) |
483 | 1.03M | { |
484 | 1.03M | va_list va; |
485 | 1.03M | PyObject* retval; |
486 | 1.03M | va_start(va, format); |
487 | 1.03M | retval = va_build_value(format, va); |
488 | 1.03M | va_end(va); |
489 | 1.03M | return retval; |
490 | 1.03M | } |
491 | | |
492 | | PyAPI_FUNC(PyObject *) /* abi only */ |
493 | | _Py_BuildValue_SizeT(const char *format, ...) |
494 | 0 | { |
495 | 0 | va_list va; |
496 | 0 | PyObject* retval; |
497 | 0 | va_start(va, format); |
498 | 0 | retval = va_build_value(format, va); |
499 | 0 | va_end(va); |
500 | 0 | return retval; |
501 | 0 | } |
502 | | |
503 | | PyObject * |
504 | | Py_VaBuildValue(const char *format, va_list va) |
505 | 0 | { |
506 | 0 | return va_build_value(format, va); |
507 | 0 | } |
508 | | |
509 | | PyAPI_FUNC(PyObject *) /* abi only */ |
510 | | _Py_VaBuildValue_SizeT(const char *format, va_list va) |
511 | 0 | { |
512 | 0 | return va_build_value(format, va); |
513 | 0 | } |
514 | | |
515 | | static PyObject * |
516 | | va_build_value(const char *format, va_list va) |
517 | 1.03M | { |
518 | 1.03M | const char *f = format; |
519 | 1.03M | Py_ssize_t n = countformat(f, '\0'); |
520 | 1.03M | va_list lva; |
521 | 1.03M | PyObject *retval; |
522 | | |
523 | 1.03M | if (n < 0) |
524 | 0 | return NULL; |
525 | 1.03M | if (n == 0) { |
526 | 0 | Py_RETURN_NONE; |
527 | 0 | } |
528 | 1.03M | va_copy(lva, va); |
529 | 1.03M | if (n == 1) { |
530 | 264k | retval = do_mkvalue(&f, &lva); |
531 | 771k | } else { |
532 | 771k | retval = do_mktuple(&f, &lva, '\0', n); |
533 | 771k | } |
534 | 1.03M | va_end(lva); |
535 | 1.03M | return retval; |
536 | 1.03M | } |
537 | | |
538 | | PyObject ** |
539 | | _Py_VaBuildStack(PyObject **small_stack, Py_ssize_t small_stack_len, |
540 | | const char *format, va_list va, Py_ssize_t *p_nargs) |
541 | 251k | { |
542 | 251k | const char *f; |
543 | 251k | Py_ssize_t n; |
544 | 251k | va_list lva; |
545 | 251k | PyObject **stack; |
546 | 251k | int res; |
547 | | |
548 | 251k | n = countformat(format, '\0'); |
549 | 251k | if (n < 0) { |
550 | 0 | *p_nargs = 0; |
551 | 0 | return NULL; |
552 | 0 | } |
553 | | |
554 | 251k | if (n == 0) { |
555 | 0 | *p_nargs = 0; |
556 | 0 | return small_stack; |
557 | 0 | } |
558 | | |
559 | 251k | if (n <= small_stack_len) { |
560 | 251k | stack = small_stack; |
561 | 251k | } |
562 | 96 | else { |
563 | 96 | stack = PyMem_Malloc(n * sizeof(stack[0])); |
564 | 96 | if (stack == NULL) { |
565 | 0 | PyErr_NoMemory(); |
566 | 0 | return NULL; |
567 | 0 | } |
568 | 96 | } |
569 | | |
570 | 251k | va_copy(lva, va); |
571 | 251k | f = format; |
572 | 251k | res = do_mkstack(stack, &f, &lva, '\0', n); |
573 | 251k | va_end(lva); |
574 | | |
575 | 251k | if (res < 0) { |
576 | 0 | if (stack != small_stack) { |
577 | 0 | PyMem_Free(stack); |
578 | 0 | } |
579 | 0 | return NULL; |
580 | 0 | } |
581 | | |
582 | 251k | *p_nargs = n; |
583 | 251k | return stack; |
584 | 251k | } |
585 | | |
586 | | |
587 | | int |
588 | | PyModule_AddObjectRef(PyObject *mod, const char *name, PyObject *value) |
589 | 8.66k | { |
590 | 8.66k | if (!PyModule_Check(mod)) { |
591 | 0 | PyErr_SetString(PyExc_TypeError, |
592 | 0 | "PyModule_AddObjectRef() first argument " |
593 | 0 | "must be a module"); |
594 | 0 | return -1; |
595 | 0 | } |
596 | 8.66k | if (!value) { |
597 | 0 | if (!PyErr_Occurred()) { |
598 | 0 | PyErr_SetString(PyExc_SystemError, |
599 | 0 | "PyModule_AddObjectRef() must be called " |
600 | 0 | "with an exception raised if value is NULL"); |
601 | 0 | } |
602 | 0 | return -1; |
603 | 0 | } |
604 | | |
605 | 8.66k | PyObject *dict = PyModule_GetDict(mod); |
606 | 8.66k | if (dict == NULL) { |
607 | | /* Internal error -- modules must have a dict! */ |
608 | 0 | PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", |
609 | 0 | PyModule_GetName(mod)); |
610 | 0 | return -1; |
611 | 0 | } |
612 | 8.66k | return PyDict_SetItemString(dict, name, value); |
613 | 8.66k | } |
614 | | |
615 | | int |
616 | | PyModule_Add(PyObject *mod, const char *name, PyObject *value) |
617 | 6.71k | { |
618 | 6.71k | int res = PyModule_AddObjectRef(mod, name, value); |
619 | 6.71k | Py_XDECREF(value); |
620 | 6.71k | return res; |
621 | 6.71k | } |
622 | | |
623 | | int |
624 | | PyModule_AddObject(PyObject *mod, const char *name, PyObject *value) |
625 | 0 | { |
626 | 0 | int res = PyModule_AddObjectRef(mod, name, value); |
627 | 0 | if (res == 0) { |
628 | 0 | Py_DECREF(value); |
629 | 0 | } |
630 | 0 | return res; |
631 | 0 | } |
632 | | |
633 | | int |
634 | | PyModule_AddIntConstant(PyObject *m, const char *name, long value) |
635 | 6.31k | { |
636 | 6.31k | return PyModule_Add(m, name, PyLong_FromLong(value)); |
637 | 6.31k | } |
638 | | |
639 | | int |
640 | | PyModule_AddStringConstant(PyObject *m, const char *name, const char *value) |
641 | 39 | { |
642 | 39 | return PyModule_Add(m, name, PyUnicode_FromString(value)); |
643 | 39 | } |
644 | | |
645 | | int |
646 | | PyModule_AddType(PyObject *module, PyTypeObject *type) |
647 | 816 | { |
648 | 816 | if (!_PyType_IsReady(type) && PyType_Ready(type) < 0) { |
649 | 0 | return -1; |
650 | 0 | } |
651 | | |
652 | 816 | const char *name = _PyType_Name(type); |
653 | 816 | assert(name != NULL); |
654 | | |
655 | 816 | return PyModule_AddObjectRef(module, name, (PyObject *)type); |
656 | 816 | } |
657 | | |
658 | | |
659 | | /* Exported functions for version helper macros */ |
660 | | |
661 | | #undef Py_PACK_FULL_VERSION |
662 | | uint32_t |
663 | | Py_PACK_FULL_VERSION(int x, int y, int z, int level, int serial) |
664 | 0 | { |
665 | 0 | return _Py_PACK_FULL_VERSION(x, y, z, level, serial); |
666 | 0 | } |
667 | | |
668 | | #undef Py_PACK_VERSION |
669 | | uint32_t |
670 | | Py_PACK_VERSION(int x, int y) |
671 | 0 | { |
672 | 0 | return _Py_PACK_VERSION(x, y); |
673 | 0 | } |