blob: 8655daa1fc5e0efe4b7edf41aacad8daea5606f3 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Module support implementation */
3
Guido van Rossum79f25d91997-04-29 20:08:16 +00004#include "Python.h"
Victor Stinnera15e2602020-04-08 02:01:56 +02005#include "pycore_abstract.h" // _PyIndex_Check()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007#define FLAG_SIZE_T 1
Guido van Rossum1d5735e1994-08-30 08:27:36 +00008typedef double va_double;
Guido van Rossum1d5735e1994-08-30 08:27:36 +00009
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000010static PyObject *va_build_value(const char *, va_list, int);
Victor Stinnere9abde42016-12-09 00:29:49 +010011static PyObject **va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len, const char *, va_list, int, Py_ssize_t*);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000012
Guido van Rossum2e58ff31997-11-19 18:53:33 +000013/* Package context -- the full module name for package imports */
Serhiy Storchakab57d9ea2016-11-21 10:25:54 +020014const char *_Py_PackageContext = NULL;
Guido van Rossum2e58ff31997-11-19 18:53:33 +000015
Serhiy Storchaka762bf402017-03-30 09:15:31 +030016
17int
18_Py_convert_optional_to_ssize_t(PyObject *obj, void *result)
19{
20 Py_ssize_t limit;
21 if (obj == Py_None) {
22 return 1;
23 }
Victor Stinnera15e2602020-04-08 02:01:56 +020024 else if (_PyIndex_Check(obj)) {
Serhiy Storchaka762bf402017-03-30 09:15:31 +030025 limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError);
26 if (limit == -1 && PyErr_Occurred()) {
27 return 0;
28 }
29 }
30 else {
31 PyErr_Format(PyExc_TypeError,
32 "argument should be integer or None, not '%.200s'",
33 Py_TYPE(obj)->tp_name);
34 return 0;
35 }
36 *((Py_ssize_t *)result) = limit;
37 return 1;
38}
39
40
Guido van Rossumbf80e541993-02-08 15:49:17 +000041/* Helper for mkvalue() to scan the length of a format */
Guido van Rossumfc61adb1992-04-13 15:53:41 +000042
Victor Stinnere9aae2d2016-12-09 00:24:47 +010043static Py_ssize_t
Victor Stinnerb551b6c2016-12-09 00:27:22 +010044countformat(const char *format, char endchar)
Guido van Rossumfc61adb1992-04-13 15:53:41 +000045{
Victor Stinnere9aae2d2016-12-09 00:24:47 +010046 Py_ssize_t count = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000047 int level = 0;
48 while (level > 0 || *format != endchar) {
49 switch (*format) {
50 case '\0':
51 /* Premature end */
52 PyErr_SetString(PyExc_SystemError,
53 "unmatched paren in format");
54 return -1;
55 case '(':
56 case '[':
57 case '{':
Victor Stinnere9aae2d2016-12-09 00:24:47 +010058 if (level == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 count++;
Victor Stinnere9aae2d2016-12-09 00:24:47 +010060 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 level++;
62 break;
63 case ')':
64 case ']':
65 case '}':
66 level--;
67 break;
68 case '#':
69 case '&':
70 case ',':
71 case ':':
72 case ' ':
73 case '\t':
74 break;
75 default:
Victor Stinnere9aae2d2016-12-09 00:24:47 +010076 if (level == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000077 count++;
Victor Stinnere9aae2d2016-12-09 00:24:47 +010078 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000079 }
80 format++;
81 }
82 return count;
Guido van Rossumfc61adb1992-04-13 15:53:41 +000083}
84
85
Guido van Rossumfc61adb1992-04-13 15:53:41 +000086/* Generic function to create a value -- the inverse of getargs() */
87/* After an original idea and first implementation by Steven Miale */
88
Victor Stinnerb551b6c2016-12-09 00:27:22 +010089static PyObject *do_mktuple(const char**, va_list *, char, Py_ssize_t, int);
Victor Stinnere9abde42016-12-09 00:29:49 +010090static int do_mkstack(PyObject **, const char**, va_list *, char, Py_ssize_t, int);
Victor Stinnerb551b6c2016-12-09 00:27:22 +010091static PyObject *do_mklist(const char**, va_list *, char, Py_ssize_t, int);
92static PyObject *do_mkdict(const char**, va_list *, char, Py_ssize_t, int);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000093static PyObject *do_mkvalue(const char**, va_list *, int);
Guido van Rossumfc61adb1992-04-13 15:53:41 +000094
Guido van Rossum1ae940a1995-01-02 19:04:15 +000095
Serhiy Storchaka13e602e2016-05-20 22:31:14 +030096static void
Victor Stinnerb551b6c2016-12-09 00:27:22 +010097do_ignore(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
Serhiy Storchaka13e602e2016-05-20 22:31:14 +030098{
99 PyObject *v;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100100 Py_ssize_t i;
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300101 assert(PyErr_Occurred());
102 v = PyTuple_New(n);
103 for (i = 0; i < n; i++) {
104 PyObject *exception, *value, *tb, *w;
105
106 PyErr_Fetch(&exception, &value, &tb);
107 w = do_mkvalue(p_format, p_va, flags);
108 PyErr_Restore(exception, value, tb);
109 if (w != NULL) {
110 if (v != NULL) {
111 PyTuple_SET_ITEM(v, i, w);
112 }
113 else {
114 Py_DECREF(w);
115 }
116 }
117 }
118 Py_XDECREF(v);
119 if (**p_format != endchar) {
120 PyErr_SetString(PyExc_SystemError,
121 "Unmatched paren in format");
122 return;
123 }
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100124 if (endchar) {
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300125 ++*p_format;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100126 }
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300127}
128
Guido van Rossum79f25d91997-04-29 20:08:16 +0000129static PyObject *
Victor Stinnerb551b6c2016-12-09 00:27:22 +0100130do_mkdict(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000131{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 PyObject *d;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100133 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 if (n < 0)
135 return NULL;
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300136 if (n % 2) {
137 PyErr_SetString(PyExc_SystemError,
138 "Bad dict format");
139 do_ignore(p_format, p_va, endchar, n, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 return NULL;
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300141 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 /* Note that we can't bail immediately on error as this will leak
143 refcounts on any 'N' arguments. */
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300144 if ((d = PyDict_New()) == NULL) {
145 do_ignore(p_format, p_va, endchar, n, flags);
146 return NULL;
147 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 for (i = 0; i < n; i+= 2) {
149 PyObject *k, *v;
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 k = do_mkvalue(p_format, p_va, flags);
152 if (k == NULL) {
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300153 do_ignore(p_format, p_va, endchar, n - i - 1, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 Py_DECREF(d);
155 return NULL;
156 }
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300157 v = do_mkvalue(p_format, p_va, flags);
158 if (v == NULL || PyDict_SetItem(d, k, v) < 0) {
159 do_ignore(p_format, p_va, endchar, n - i - 2, flags);
160 Py_DECREF(k);
161 Py_XDECREF(v);
162 Py_DECREF(d);
163 return NULL;
164 }
165 Py_DECREF(k);
166 Py_DECREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 }
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300168 if (**p_format != endchar) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000169 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000170 PyErr_SetString(PyExc_SystemError,
171 "Unmatched paren in format");
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300172 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 }
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300174 if (endchar)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 ++*p_format;
176 return d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000177}
178
Guido van Rossum79f25d91997-04-29 20:08:16 +0000179static PyObject *
Victor Stinnerb551b6c2016-12-09 00:27:22 +0100180do_mklist(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 PyObject *v;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100183 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 if (n < 0)
185 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 /* Note that we can't bail immediately on error as this will leak
187 refcounts on any 'N' arguments. */
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300188 v = PyList_New(n);
189 if (v == NULL) {
190 do_ignore(p_format, p_va, endchar, n, flags);
191 return NULL;
192 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000193 for (i = 0; i < n; i++) {
194 PyObject *w = do_mkvalue(p_format, p_va, flags);
195 if (w == NULL) {
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300196 do_ignore(p_format, p_va, endchar, n - i - 1, flags);
197 Py_DECREF(v);
198 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000199 }
200 PyList_SET_ITEM(v, i, w);
201 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 if (**p_format != endchar) {
203 Py_DECREF(v);
204 PyErr_SetString(PyExc_SystemError,
205 "Unmatched paren in format");
206 return NULL;
207 }
208 if (endchar)
209 ++*p_format;
210 return v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000211}
212
Victor Stinnere9abde42016-12-09 00:29:49 +0100213static int
214do_mkstack(PyObject **stack, const char **p_format, va_list *p_va,
215 char endchar, Py_ssize_t n, int flags)
216{
217 Py_ssize_t i;
218
219 if (n < 0) {
220 return -1;
221 }
222 /* Note that we can't bail immediately on error as this will leak
223 refcounts on any 'N' arguments. */
224 for (i = 0; i < n; i++) {
225 PyObject *w = do_mkvalue(p_format, p_va, flags);
226 if (w == NULL) {
227 do_ignore(p_format, p_va, endchar, n - i - 1, flags);
228 goto error;
229 }
230 stack[i] = w;
231 }
232 if (**p_format != endchar) {
233 PyErr_SetString(PyExc_SystemError,
234 "Unmatched paren in format");
235 goto error;
236 }
237 if (endchar) {
238 ++*p_format;
239 }
240 return 0;
241
242error:
243 n = i;
244 for (i=0; i < n; i++) {
245 Py_DECREF(stack[i]);
246 }
247 return -1;
248}
249
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250static PyObject *
Victor Stinnerb551b6c2016-12-09 00:27:22 +0100251do_mktuple(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000252{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000253 PyObject *v;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100254 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 if (n < 0)
256 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 /* Note that we can't bail immediately on error as this will leak
258 refcounts on any 'N' arguments. */
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300259 if ((v = PyTuple_New(n)) == NULL) {
260 do_ignore(p_format, p_va, endchar, n, flags);
261 return NULL;
262 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 for (i = 0; i < n; i++) {
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300264 PyObject *w = do_mkvalue(p_format, p_va, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000265 if (w == NULL) {
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300266 do_ignore(p_format, p_va, endchar, n - i - 1, flags);
267 Py_DECREF(v);
268 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 }
270 PyTuple_SET_ITEM(v, i, w);
271 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 if (**p_format != endchar) {
273 Py_DECREF(v);
274 PyErr_SetString(PyExc_SystemError,
275 "Unmatched paren in format");
276 return NULL;
277 }
278 if (endchar)
279 ++*p_format;
280 return v;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000281}
282
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000284do_mkvalue(const char **p_format, va_list *p_va, int flags)
Guido van Rossum899dcf31992-05-15 11:04:59 +0000285{
Victor Stinner37bb2892020-06-19 11:45:31 +0200286#define ERROR_NEED_PY_SSIZE_T_CLEAN \
287 { \
288 PyErr_SetString(PyExc_SystemError, \
289 "PY_SSIZE_T_CLEAN macro must be defined for '#' formats"); \
290 return NULL; \
291 }
292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000293 for (;;) {
294 switch (*(*p_format)++) {
295 case '(':
296 return do_mktuple(p_format, p_va, ')',
297 countformat(*p_format, ')'), flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 case '[':
300 return do_mklist(p_format, p_va, ']',
301 countformat(*p_format, ']'), flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000303 case '{':
304 return do_mkdict(p_format, p_va, '}',
305 countformat(*p_format, '}'), flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 case 'b':
308 case 'B':
309 case 'h':
310 case 'i':
311 return PyLong_FromLong((long)va_arg(*p_va, int));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 case 'H':
314 return PyLong_FromLong((long)va_arg(*p_va, unsigned int));
315
316 case 'I':
317 {
318 unsigned int n;
319 n = va_arg(*p_va, unsigned int);
320 return PyLong_FromUnsignedLong(n);
321 }
322
323 case 'n':
Martin v. Löwis18e16552006-02-15 17:27:45 +0000324#if SIZEOF_SIZE_T!=SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 return PyLong_FromSsize_t(va_arg(*p_va, Py_ssize_t));
Martin v. Löwis18e16552006-02-15 17:27:45 +0000326#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 /* Fall through from 'n' to 'l' if Py_ssize_t is long */
328 case 'l':
329 return PyLong_FromLong(va_arg(*p_va, long));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 case 'k':
332 {
333 unsigned long n;
334 n = va_arg(*p_va, unsigned long);
335 return PyLong_FromUnsignedLong(n);
336 }
Jack Jansendbd65032003-04-17 22:01:10 +0000337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 case 'L':
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700339 return PyLong_FromLongLong((long long)va_arg(*p_va, long long));
Jack Jansendbd65032003-04-17 22:01:10 +0000340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 case 'K':
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700342 return PyLong_FromUnsignedLongLong((long long)va_arg(*p_va, unsigned long long));
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 case 'u':
345 {
346 PyObject *v;
347 Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);
348 Py_ssize_t n;
349 if (**p_format == '#') {
350 ++*p_format;
Victor Stinner37bb2892020-06-19 11:45:31 +0200351 if (flags & FLAG_SIZE_T) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 n = va_arg(*p_va, Py_ssize_t);
Victor Stinner37bb2892020-06-19 11:45:31 +0200353 }
Inada Naokid3c72a22019-03-23 21:04:40 +0900354 else {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +0200355 n = va_arg(*p_va, int);
Victor Stinner37bb2892020-06-19 11:45:31 +0200356 ERROR_NEED_PY_SSIZE_T_CLEAN;
Inada Naokid3c72a22019-03-23 21:04:40 +0900357 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 }
359 else
360 n = -1;
361 if (u == NULL) {
362 v = Py_None;
363 Py_INCREF(v);
364 }
365 else {
366 if (n < 0)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200367 n = wcslen(u);
368 v = PyUnicode_FromWideChar(u, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 }
370 return v;
371 }
372 case 'f':
373 case 'd':
374 return PyFloat_FromDouble(
375 (double)va_arg(*p_va, va_double));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 case 'D':
378 return PyComplex_FromCComplex(
379 *((Py_complex *)va_arg(*p_va, Py_complex *)));
Fred Drakeaec79242001-03-12 21:03:26 +0000380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000381 case 'c':
382 {
383 char p[1];
384 p[0] = (char)va_arg(*p_va, int);
385 return PyBytes_FromStringAndSize(p, 1);
386 }
387 case 'C':
388 {
389 int i = va_arg(*p_va, int);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 return PyUnicode_FromOrdinal(i);
391 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 case 's':
394 case 'z':
Victor Stinner7eeb5b52010-06-07 19:57:46 +0000395 case 'U': /* XXX deprecated alias */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 {
397 PyObject *v;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200398 const char *str = va_arg(*p_va, const char *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 Py_ssize_t n;
400 if (**p_format == '#') {
401 ++*p_format;
Victor Stinner37bb2892020-06-19 11:45:31 +0200402 if (flags & FLAG_SIZE_T) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 n = va_arg(*p_va, Py_ssize_t);
Victor Stinner37bb2892020-06-19 11:45:31 +0200404 }
Inada Naokid3c72a22019-03-23 21:04:40 +0900405 else {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +0200406 n = va_arg(*p_va, int);
Victor Stinner37bb2892020-06-19 11:45:31 +0200407 ERROR_NEED_PY_SSIZE_T_CLEAN;
Inada Naokid3c72a22019-03-23 21:04:40 +0900408 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 }
410 else
411 n = -1;
412 if (str == NULL) {
413 v = Py_None;
414 Py_INCREF(v);
415 }
416 else {
417 if (n < 0) {
418 size_t m = strlen(str);
419 if (m > PY_SSIZE_T_MAX) {
420 PyErr_SetString(PyExc_OverflowError,
421 "string too long for Python string");
422 return NULL;
423 }
424 n = (Py_ssize_t)m;
425 }
426 v = PyUnicode_FromStringAndSize(str, n);
427 }
428 return v;
429 }
Walter Dörwaldd2034312007-05-18 16:29:38 +0000430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 case 'y':
432 {
433 PyObject *v;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200434 const char *str = va_arg(*p_va, const char *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 Py_ssize_t n;
436 if (**p_format == '#') {
437 ++*p_format;
Victor Stinner37bb2892020-06-19 11:45:31 +0200438 if (flags & FLAG_SIZE_T) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 n = va_arg(*p_va, Py_ssize_t);
Victor Stinner37bb2892020-06-19 11:45:31 +0200440 }
Inada Naokid3c72a22019-03-23 21:04:40 +0900441 else {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +0200442 n = va_arg(*p_va, int);
Victor Stinner37bb2892020-06-19 11:45:31 +0200443 ERROR_NEED_PY_SSIZE_T_CLEAN;
Inada Naokid3c72a22019-03-23 21:04:40 +0900444 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 }
446 else
447 n = -1;
448 if (str == NULL) {
449 v = Py_None;
450 Py_INCREF(v);
451 }
452 else {
453 if (n < 0) {
454 size_t m = strlen(str);
455 if (m > PY_SSIZE_T_MAX) {
456 PyErr_SetString(PyExc_OverflowError,
457 "string too long for Python bytes");
458 return NULL;
459 }
460 n = (Py_ssize_t)m;
461 }
462 v = PyBytes_FromStringAndSize(str, n);
463 }
464 return v;
465 }
Walter Dörwald612344f2007-05-04 19:28:21 +0000466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 case 'N':
468 case 'S':
469 case 'O':
470 if (**p_format == '&') {
471 typedef PyObject *(*converter)(void *);
472 converter func = va_arg(*p_va, converter);
473 void *arg = va_arg(*p_va, void *);
474 ++*p_format;
475 return (*func)(arg);
476 }
477 else {
478 PyObject *v;
479 v = va_arg(*p_va, PyObject *);
480 if (v != NULL) {
481 if (*(*p_format - 1) != 'N')
482 Py_INCREF(v);
483 }
484 else if (!PyErr_Occurred())
485 /* If a NULL was passed
486 * because a call that should
487 * have constructed a value
488 * failed, that's OK, and we
489 * pass the error on; but if
490 * no error occurred it's not
491 * clear that the caller knew
492 * what she was doing. */
493 PyErr_SetString(PyExc_SystemError,
494 "NULL object passed to Py_BuildValue");
495 return v;
496 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 case ':':
499 case ',':
500 case ' ':
501 case '\t':
502 break;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 default:
505 PyErr_SetString(PyExc_SystemError,
506 "bad format char passed to Py_BuildValue");
507 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 }
510 }
Victor Stinner37bb2892020-06-19 11:45:31 +0200511
512#undef ERROR_NEED_PY_SSIZE_T_CLEAN
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000513}
514
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000515
Fred Drakeceead6d2003-01-30 15:08:25 +0000516PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000517Py_BuildValue(const char *format, ...)
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000518{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 va_list va;
520 PyObject* retval;
521 va_start(va, format);
522 retval = va_build_value(format, va, 0);
523 va_end(va);
524 return retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000525}
526
527PyObject *
528_Py_BuildValue_SizeT(const char *format, ...)
529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 va_list va;
531 PyObject* retval;
532 va_start(va, format);
533 retval = va_build_value(format, va, FLAG_SIZE_T);
534 va_end(va);
535 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000536}
Guido van Rossume5372401993-03-16 12:15:04 +0000537
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000539Py_VaBuildValue(const char *format, va_list va)
Guido van Rossume5372401993-03-16 12:15:04 +0000540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 return va_build_value(format, va, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000542}
543
544PyObject *
545_Py_VaBuildValue_SizeT(const char *format, va_list va)
546{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 return va_build_value(format, va, FLAG_SIZE_T);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000548}
549
550static PyObject *
551va_build_value(const char *format, va_list va, int flags)
552{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 const char *f = format;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100554 Py_ssize_t n = countformat(f, '\0');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 va_list lva;
Christian Heimes2f2fee12016-09-21 11:37:27 +0200556 PyObject *retval;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 if (n < 0)
559 return NULL;
560 if (n == 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200561 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 }
Christian Heimes2f2fee12016-09-21 11:37:27 +0200563 va_copy(lva, va);
564 if (n == 1) {
565 retval = do_mkvalue(&f, &lva, flags);
566 } else {
567 retval = do_mktuple(&f, &lva, '\0', n, flags);
568 }
569 va_end(lva);
570 return retval;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000571}
572
Victor Stinnere9abde42016-12-09 00:29:49 +0100573PyObject **
574_Py_VaBuildStack(PyObject **small_stack, Py_ssize_t small_stack_len,
575 const char *format, va_list va, Py_ssize_t *p_nargs)
576{
577 return va_build_stack(small_stack, small_stack_len, format, va, 0, p_nargs);
578}
579
580PyObject **
581_Py_VaBuildStack_SizeT(PyObject **small_stack, Py_ssize_t small_stack_len,
582 const char *format, va_list va, Py_ssize_t *p_nargs)
583{
584 return va_build_stack(small_stack, small_stack_len, format, va, FLAG_SIZE_T, p_nargs);
585}
586
587static PyObject **
588va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len,
589 const char *format, va_list va, int flags, Py_ssize_t *p_nargs)
590{
591 const char *f;
592 Py_ssize_t n;
593 va_list lva;
594 PyObject **stack;
595 int res;
596
597 n = countformat(format, '\0');
598 if (n < 0) {
599 *p_nargs = 0;
600 return NULL;
601 }
602
603 if (n == 0) {
604 *p_nargs = 0;
605 return small_stack;
606 }
607
608 if (n <= small_stack_len) {
609 stack = small_stack;
610 }
611 else {
612 stack = PyMem_Malloc(n * sizeof(stack[0]));
613 if (stack == NULL) {
614 PyErr_NoMemory();
615 return NULL;
616 }
617 }
618
619 va_copy(lva, va);
620 f = format;
621 res = do_mkstack(stack, &f, &lva, '\0', n, flags);
622 va_end(lva);
623
624 if (res < 0) {
Tony Solomonik75c80b02020-08-30 07:53:08 +0300625 if (stack != small_stack) {
626 PyMem_Free(stack);
627 }
Victor Stinnere9abde42016-12-09 00:29:49 +0100628 return NULL;
629 }
630
631 *p_nargs = n;
632 return stack;
633}
634
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000635
Fred Drake9e285152000-09-23 03:24:27 +0000636int
Victor Stinner80218752020-11-04 13:59:15 +0100637PyModule_AddObjectRef(PyObject *mod, const char *name, PyObject *value)
Fred Drake9e285152000-09-23 03:24:27 +0000638{
Victor Stinner80218752020-11-04 13:59:15 +0100639 if (!PyModule_Check(mod)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 PyErr_SetString(PyExc_TypeError,
Victor Stinner80218752020-11-04 13:59:15 +0100641 "PyModule_AddObjectRef() first argument "
642 "must be a module");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 return -1;
644 }
Victor Stinner80218752020-11-04 13:59:15 +0100645 if (!value) {
646 if (!PyErr_Occurred()) {
647 PyErr_SetString(PyExc_SystemError,
648 "PyModule_AddObjectRef() must be called "
649 "with an exception raised if value is NULL");
650 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 return -1;
652 }
Jeremy Hyltonc44dbc42003-06-21 21:35:25 +0000653
Victor Stinner80218752020-11-04 13:59:15 +0100654 PyObject *dict = PyModule_GetDict(mod);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 if (dict == NULL) {
656 /* Internal error -- modules must have a dict! */
657 PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
Victor Stinner80218752020-11-04 13:59:15 +0100658 PyModule_GetName(mod));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 return -1;
660 }
Victor Stinner80218752020-11-04 13:59:15 +0100661
662 if (PyDict_SetItemString(dict, name, value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 return -1;
Victor Stinner80218752020-11-04 13:59:15 +0100664 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 return 0;
Fred Drake9e285152000-09-23 03:24:27 +0000666}
667
Victor Stinner80218752020-11-04 13:59:15 +0100668
669int
670PyModule_AddObject(PyObject *mod, const char *name, PyObject *value)
671{
672 int res = PyModule_AddObjectRef(mod, name, value);
673 if (res == 0) {
674 Py_DECREF(value);
675 }
676 return res;
677}
678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000680PyModule_AddIntConstant(PyObject *m, const char *name, long value)
Fred Drake9e285152000-09-23 03:24:27 +0000681{
Victor Stinner80218752020-11-04 13:59:15 +0100682 PyObject *obj = PyLong_FromLong(value);
683 if (!obj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 return -1;
Victor Stinner80218752020-11-04 13:59:15 +0100685 }
686 int res = PyModule_AddObjectRef(m, name, obj);
687 Py_DECREF(obj);
688 return res;
Fred Drake9e285152000-09-23 03:24:27 +0000689}
690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000692PyModule_AddStringConstant(PyObject *m, const char *name, const char *value)
Fred Drake9e285152000-09-23 03:24:27 +0000693{
Victor Stinner80218752020-11-04 13:59:15 +0100694 PyObject *obj = PyUnicode_FromString(value);
695 if (!obj) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 return -1;
Victor Stinner80218752020-11-04 13:59:15 +0100697 }
698 int res = PyModule_AddObjectRef(m, name, obj);
699 Py_DECREF(obj);
700 return res;
Fred Drake9e285152000-09-23 03:24:27 +0000701}
Dong-hee Na05e4a292020-03-23 01:17:34 +0900702
703int
704PyModule_AddType(PyObject *module, PyTypeObject *type)
705{
706 if (PyType_Ready(type) < 0) {
707 return -1;
708 }
709
710 const char *name = _PyType_Name(type);
711 assert(name != NULL);
712
Victor Stinner80218752020-11-04 13:59:15 +0100713 return PyModule_AddObjectRef(module, name, (PyObject *)type);
Dong-hee Na05e4a292020-03-23 01:17:34 +0900714}