blob: 845bdcb2b6f1b3dfa531bd9d24e2f469a7398fdc [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{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 for (;;) {
287 switch (*(*p_format)++) {
288 case '(':
289 return do_mktuple(p_format, p_va, ')',
290 countformat(*p_format, ')'), flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 case '[':
293 return do_mklist(p_format, p_va, ']',
294 countformat(*p_format, ']'), flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 case '{':
297 return do_mkdict(p_format, p_va, '}',
298 countformat(*p_format, '}'), flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000300 case 'b':
301 case 'B':
302 case 'h':
303 case 'i':
304 return PyLong_FromLong((long)va_arg(*p_va, int));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 case 'H':
307 return PyLong_FromLong((long)va_arg(*p_va, unsigned int));
308
309 case 'I':
310 {
311 unsigned int n;
312 n = va_arg(*p_va, unsigned int);
313 return PyLong_FromUnsignedLong(n);
314 }
315
316 case 'n':
Martin v. Löwis18e16552006-02-15 17:27:45 +0000317#if SIZEOF_SIZE_T!=SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 return PyLong_FromSsize_t(va_arg(*p_va, Py_ssize_t));
Martin v. Löwis18e16552006-02-15 17:27:45 +0000319#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000320 /* Fall through from 'n' to 'l' if Py_ssize_t is long */
321 case 'l':
322 return PyLong_FromLong(va_arg(*p_va, long));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 case 'k':
325 {
326 unsigned long n;
327 n = va_arg(*p_va, unsigned long);
328 return PyLong_FromUnsignedLong(n);
329 }
Jack Jansendbd65032003-04-17 22:01:10 +0000330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 case 'L':
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700332 return PyLong_FromLongLong((long long)va_arg(*p_va, long long));
Jack Jansendbd65032003-04-17 22:01:10 +0000333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 case 'K':
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700335 return PyLong_FromUnsignedLongLong((long long)va_arg(*p_va, unsigned long long));
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 case 'u':
338 {
339 PyObject *v;
340 Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);
341 Py_ssize_t n;
342 if (**p_format == '#') {
343 ++*p_format;
344 if (flags & FLAG_SIZE_T)
345 n = va_arg(*p_va, Py_ssize_t);
Inada Naokid3c72a22019-03-23 21:04:40 +0900346 else {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +0200347 n = va_arg(*p_va, int);
Inada Naokid3c72a22019-03-23 21:04:40 +0900348 if (PyErr_WarnEx(PyExc_DeprecationWarning,
349 "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
350 return NULL;
351 }
Inada Naokid3c72a22019-03-23 21:04:40 +0900352 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 }
354 else
355 n = -1;
356 if (u == NULL) {
357 v = Py_None;
358 Py_INCREF(v);
359 }
360 else {
361 if (n < 0)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200362 n = wcslen(u);
363 v = PyUnicode_FromWideChar(u, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 }
365 return v;
366 }
367 case 'f':
368 case 'd':
369 return PyFloat_FromDouble(
370 (double)va_arg(*p_va, va_double));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 case 'D':
373 return PyComplex_FromCComplex(
374 *((Py_complex *)va_arg(*p_va, Py_complex *)));
Fred Drakeaec79242001-03-12 21:03:26 +0000375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 case 'c':
377 {
378 char p[1];
379 p[0] = (char)va_arg(*p_va, int);
380 return PyBytes_FromStringAndSize(p, 1);
381 }
382 case 'C':
383 {
384 int i = va_arg(*p_va, int);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 return PyUnicode_FromOrdinal(i);
386 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 case 's':
389 case 'z':
Victor Stinner7eeb5b52010-06-07 19:57:46 +0000390 case 'U': /* XXX deprecated alias */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391 {
392 PyObject *v;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200393 const char *str = va_arg(*p_va, const char *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 Py_ssize_t n;
395 if (**p_format == '#') {
396 ++*p_format;
397 if (flags & FLAG_SIZE_T)
398 n = va_arg(*p_va, Py_ssize_t);
Inada Naokid3c72a22019-03-23 21:04:40 +0900399 else {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +0200400 n = va_arg(*p_va, int);
Inada Naokid3c72a22019-03-23 21:04:40 +0900401 if (PyErr_WarnEx(PyExc_DeprecationWarning,
402 "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
403 return NULL;
404 }
Inada Naokid3c72a22019-03-23 21:04:40 +0900405 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 }
407 else
408 n = -1;
409 if (str == NULL) {
410 v = Py_None;
411 Py_INCREF(v);
412 }
413 else {
414 if (n < 0) {
415 size_t m = strlen(str);
416 if (m > PY_SSIZE_T_MAX) {
417 PyErr_SetString(PyExc_OverflowError,
418 "string too long for Python string");
419 return NULL;
420 }
421 n = (Py_ssize_t)m;
422 }
423 v = PyUnicode_FromStringAndSize(str, n);
424 }
425 return v;
426 }
Walter Dörwaldd2034312007-05-18 16:29:38 +0000427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 case 'y':
429 {
430 PyObject *v;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200431 const char *str = va_arg(*p_va, const char *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 Py_ssize_t n;
433 if (**p_format == '#') {
434 ++*p_format;
435 if (flags & FLAG_SIZE_T)
436 n = va_arg(*p_va, Py_ssize_t);
Inada Naokid3c72a22019-03-23 21:04:40 +0900437 else {
Serhiy Storchaka28d0bca2020-03-02 08:42:39 +0200438 n = va_arg(*p_va, int);
Inada Naokid3c72a22019-03-23 21:04:40 +0900439 if (PyErr_WarnEx(PyExc_DeprecationWarning,
440 "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
441 return NULL;
442 }
Inada Naokid3c72a22019-03-23 21:04:40 +0900443 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 }
445 else
446 n = -1;
447 if (str == NULL) {
448 v = Py_None;
449 Py_INCREF(v);
450 }
451 else {
452 if (n < 0) {
453 size_t m = strlen(str);
454 if (m > PY_SSIZE_T_MAX) {
455 PyErr_SetString(PyExc_OverflowError,
456 "string too long for Python bytes");
457 return NULL;
458 }
459 n = (Py_ssize_t)m;
460 }
461 v = PyBytes_FromStringAndSize(str, n);
462 }
463 return v;
464 }
Walter Dörwald612344f2007-05-04 19:28:21 +0000465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 case 'N':
467 case 'S':
468 case 'O':
469 if (**p_format == '&') {
470 typedef PyObject *(*converter)(void *);
471 converter func = va_arg(*p_va, converter);
472 void *arg = va_arg(*p_va, void *);
473 ++*p_format;
474 return (*func)(arg);
475 }
476 else {
477 PyObject *v;
478 v = va_arg(*p_va, PyObject *);
479 if (v != NULL) {
480 if (*(*p_format - 1) != 'N')
481 Py_INCREF(v);
482 }
483 else if (!PyErr_Occurred())
484 /* If a NULL was passed
485 * because a call that should
486 * have constructed a value
487 * failed, that's OK, and we
488 * pass the error on; but if
489 * no error occurred it's not
490 * clear that the caller knew
491 * what she was doing. */
492 PyErr_SetString(PyExc_SystemError,
493 "NULL object passed to Py_BuildValue");
494 return v;
495 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 case ':':
498 case ',':
499 case ' ':
500 case '\t':
501 break;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 default:
504 PyErr_SetString(PyExc_SystemError,
505 "bad format char passed to Py_BuildValue");
506 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 }
509 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000510}
511
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000512
Fred Drakeceead6d2003-01-30 15:08:25 +0000513PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000514Py_BuildValue(const char *format, ...)
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000515{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 va_list va;
517 PyObject* retval;
518 va_start(va, format);
519 retval = va_build_value(format, va, 0);
520 va_end(va);
521 return retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000522}
523
524PyObject *
525_Py_BuildValue_SizeT(const char *format, ...)
526{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 va_list va;
528 PyObject* retval;
529 va_start(va, format);
530 retval = va_build_value(format, va, FLAG_SIZE_T);
531 va_end(va);
532 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000533}
Guido van Rossume5372401993-03-16 12:15:04 +0000534
Guido van Rossum79f25d91997-04-29 20:08:16 +0000535PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000536Py_VaBuildValue(const char *format, va_list va)
Guido van Rossume5372401993-03-16 12:15:04 +0000537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 return va_build_value(format, va, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000539}
540
541PyObject *
542_Py_VaBuildValue_SizeT(const char *format, va_list va)
543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 return va_build_value(format, va, FLAG_SIZE_T);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000545}
546
547static PyObject *
548va_build_value(const char *format, va_list va, int flags)
549{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 const char *f = format;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100551 Py_ssize_t n = countformat(f, '\0');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 va_list lva;
Christian Heimes2f2fee12016-09-21 11:37:27 +0200553 PyObject *retval;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 if (n < 0)
556 return NULL;
557 if (n == 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200558 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 }
Christian Heimes2f2fee12016-09-21 11:37:27 +0200560 va_copy(lva, va);
561 if (n == 1) {
562 retval = do_mkvalue(&f, &lva, flags);
563 } else {
564 retval = do_mktuple(&f, &lva, '\0', n, flags);
565 }
566 va_end(lva);
567 return retval;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000568}
569
Victor Stinnere9abde42016-12-09 00:29:49 +0100570PyObject **
571_Py_VaBuildStack(PyObject **small_stack, Py_ssize_t small_stack_len,
572 const char *format, va_list va, Py_ssize_t *p_nargs)
573{
574 return va_build_stack(small_stack, small_stack_len, format, va, 0, p_nargs);
575}
576
577PyObject **
578_Py_VaBuildStack_SizeT(PyObject **small_stack, Py_ssize_t small_stack_len,
579 const char *format, va_list va, Py_ssize_t *p_nargs)
580{
581 return va_build_stack(small_stack, small_stack_len, format, va, FLAG_SIZE_T, p_nargs);
582}
583
584static PyObject **
585va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len,
586 const char *format, va_list va, int flags, Py_ssize_t *p_nargs)
587{
588 const char *f;
589 Py_ssize_t n;
590 va_list lva;
591 PyObject **stack;
592 int res;
593
594 n = countformat(format, '\0');
595 if (n < 0) {
596 *p_nargs = 0;
597 return NULL;
598 }
599
600 if (n == 0) {
601 *p_nargs = 0;
602 return small_stack;
603 }
604
605 if (n <= small_stack_len) {
606 stack = small_stack;
607 }
608 else {
609 stack = PyMem_Malloc(n * sizeof(stack[0]));
610 if (stack == NULL) {
611 PyErr_NoMemory();
612 return NULL;
613 }
614 }
615
616 va_copy(lva, va);
617 f = format;
618 res = do_mkstack(stack, &f, &lva, '\0', n, flags);
619 va_end(lva);
620
621 if (res < 0) {
622 return NULL;
623 }
624
625 *p_nargs = n;
626 return stack;
627}
628
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000629
Fred Drake9e285152000-09-23 03:24:27 +0000630int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000631PyModule_AddObject(PyObject *m, const char *name, PyObject *o)
Fred Drake9e285152000-09-23 03:24:27 +0000632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 PyObject *dict;
634 if (!PyModule_Check(m)) {
635 PyErr_SetString(PyExc_TypeError,
636 "PyModule_AddObject() needs module as first arg");
637 return -1;
638 }
639 if (!o) {
640 if (!PyErr_Occurred())
641 PyErr_SetString(PyExc_TypeError,
642 "PyModule_AddObject() needs non-NULL value");
643 return -1;
644 }
Jeremy Hyltonc44dbc42003-06-21 21:35:25 +0000645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 dict = PyModule_GetDict(m);
647 if (dict == NULL) {
648 /* Internal error -- modules must have a dict! */
649 PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
650 PyModule_GetName(m));
651 return -1;
652 }
653 if (PyDict_SetItemString(dict, name, o))
654 return -1;
655 Py_DECREF(o);
656 return 0;
Fred Drake9e285152000-09-23 03:24:27 +0000657}
658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000660PyModule_AddIntConstant(PyObject *m, const char *name, long value)
Fred Drake9e285152000-09-23 03:24:27 +0000661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 PyObject *o = PyLong_FromLong(value);
663 if (!o)
664 return -1;
665 if (PyModule_AddObject(m, name, o) == 0)
666 return 0;
667 Py_DECREF(o);
668 return -1;
Fred Drake9e285152000-09-23 03:24:27 +0000669}
670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000672PyModule_AddStringConstant(PyObject *m, const char *name, const char *value)
Fred Drake9e285152000-09-23 03:24:27 +0000673{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 PyObject *o = PyUnicode_FromString(value);
675 if (!o)
676 return -1;
677 if (PyModule_AddObject(m, name, o) == 0)
678 return 0;
679 Py_DECREF(o);
680 return -1;
Fred Drake9e285152000-09-23 03:24:27 +0000681}
Dong-hee Na05e4a292020-03-23 01:17:34 +0900682
683int
684PyModule_AddType(PyObject *module, PyTypeObject *type)
685{
686 if (PyType_Ready(type) < 0) {
687 return -1;
688 }
689
690 const char *name = _PyType_Name(type);
691 assert(name != NULL);
692
693 Py_INCREF(type);
694 if (PyModule_AddObject(module, name, (PyObject *)type) < 0) {
695 Py_DECREF(type);
696 return -1;
697 }
698
699 return 0;
700}