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