blob: 62558221077468a7e9a7768b5e05dac1c88c916d [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"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006#define FLAG_SIZE_T 1
Guido van Rossum1d5735e1994-08-30 08:27:36 +00007typedef double va_double;
Guido van Rossum1d5735e1994-08-30 08:27:36 +00008
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00009static PyObject *va_build_value(const char *, va_list, int);
Victor Stinnere9abde42016-12-09 00:29:49 +010010static 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 +000011
Guido van Rossum2e58ff31997-11-19 18:53:33 +000012/* Package context -- the full module name for package imports */
Serhiy Storchakab57d9ea2016-11-21 10:25:54 +020013const char *_Py_PackageContext = NULL;
Guido van Rossum2e58ff31997-11-19 18:53:33 +000014
Serhiy Storchaka762bf402017-03-30 09:15:31 +030015
16int
17_Py_convert_optional_to_ssize_t(PyObject *obj, void *result)
18{
19 Py_ssize_t limit;
20 if (obj == Py_None) {
21 return 1;
22 }
23 else if (PyIndex_Check(obj)) {
24 limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError);
25 if (limit == -1 && PyErr_Occurred()) {
26 return 0;
27 }
28 }
29 else {
30 PyErr_Format(PyExc_TypeError,
31 "argument should be integer or None, not '%.200s'",
32 Py_TYPE(obj)->tp_name);
33 return 0;
34 }
35 *((Py_ssize_t *)result) = limit;
36 return 1;
37}
38
39
Guido van Rossumbf80e541993-02-08 15:49:17 +000040/* Helper for mkvalue() to scan the length of a format */
Guido van Rossumfc61adb1992-04-13 15:53:41 +000041
Victor Stinnere9aae2d2016-12-09 00:24:47 +010042static Py_ssize_t
Victor Stinnerb551b6c2016-12-09 00:27:22 +010043countformat(const char *format, char endchar)
Guido van Rossumfc61adb1992-04-13 15:53:41 +000044{
Victor Stinnere9aae2d2016-12-09 00:24:47 +010045 Py_ssize_t count = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000046 int level = 0;
47 while (level > 0 || *format != endchar) {
48 switch (*format) {
49 case '\0':
50 /* Premature end */
51 PyErr_SetString(PyExc_SystemError,
52 "unmatched paren in format");
53 return -1;
54 case '(':
55 case '[':
56 case '{':
Victor Stinnere9aae2d2016-12-09 00:24:47 +010057 if (level == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 count++;
Victor Stinnere9aae2d2016-12-09 00:24:47 +010059 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 level++;
61 break;
62 case ')':
63 case ']':
64 case '}':
65 level--;
66 break;
67 case '#':
68 case '&':
69 case ',':
70 case ':':
71 case ' ':
72 case '\t':
73 break;
74 default:
Victor Stinnere9aae2d2016-12-09 00:24:47 +010075 if (level == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000076 count++;
Victor Stinnere9aae2d2016-12-09 00:24:47 +010077 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000078 }
79 format++;
80 }
81 return count;
Guido van Rossumfc61adb1992-04-13 15:53:41 +000082}
83
84
Guido van Rossumfc61adb1992-04-13 15:53:41 +000085/* Generic function to create a value -- the inverse of getargs() */
86/* After an original idea and first implementation by Steven Miale */
87
Victor Stinnerb551b6c2016-12-09 00:27:22 +010088static PyObject *do_mktuple(const char**, va_list *, char, Py_ssize_t, int);
Victor Stinnere9abde42016-12-09 00:29:49 +010089static int do_mkstack(PyObject **, const char**, va_list *, char, Py_ssize_t, int);
Victor Stinnerb551b6c2016-12-09 00:27:22 +010090static PyObject *do_mklist(const char**, va_list *, char, Py_ssize_t, int);
91static PyObject *do_mkdict(const char**, va_list *, char, Py_ssize_t, int);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000092static PyObject *do_mkvalue(const char**, va_list *, int);
Guido van Rossumfc61adb1992-04-13 15:53:41 +000093
Guido van Rossum1ae940a1995-01-02 19:04:15 +000094
Serhiy Storchaka13e602e2016-05-20 22:31:14 +030095static void
Victor Stinnerb551b6c2016-12-09 00:27:22 +010096do_ignore(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
Serhiy Storchaka13e602e2016-05-20 22:31:14 +030097{
98 PyObject *v;
Victor Stinnere9aae2d2016-12-09 00:24:47 +010099 Py_ssize_t i;
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300100 assert(PyErr_Occurred());
101 v = PyTuple_New(n);
102 for (i = 0; i < n; i++) {
103 PyObject *exception, *value, *tb, *w;
104
105 PyErr_Fetch(&exception, &value, &tb);
106 w = do_mkvalue(p_format, p_va, flags);
107 PyErr_Restore(exception, value, tb);
108 if (w != NULL) {
109 if (v != NULL) {
110 PyTuple_SET_ITEM(v, i, w);
111 }
112 else {
113 Py_DECREF(w);
114 }
115 }
116 }
117 Py_XDECREF(v);
118 if (**p_format != endchar) {
119 PyErr_SetString(PyExc_SystemError,
120 "Unmatched paren in format");
121 return;
122 }
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100123 if (endchar) {
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300124 ++*p_format;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100125 }
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300126}
127
Guido van Rossum79f25d91997-04-29 20:08:16 +0000128static PyObject *
Victor Stinnerb551b6c2016-12-09 00:27:22 +0100129do_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 +0000130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 PyObject *d;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100132 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000133 if (n < 0)
134 return NULL;
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300135 if (n % 2) {
136 PyErr_SetString(PyExc_SystemError,
137 "Bad dict format");
138 do_ignore(p_format, p_va, endchar, n, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 return NULL;
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300140 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 /* Note that we can't bail immediately on error as this will leak
142 refcounts on any 'N' arguments. */
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300143 if ((d = PyDict_New()) == NULL) {
144 do_ignore(p_format, p_va, endchar, n, flags);
145 return NULL;
146 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 for (i = 0; i < n; i+= 2) {
148 PyObject *k, *v;
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000150 k = do_mkvalue(p_format, p_va, flags);
151 if (k == NULL) {
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300152 do_ignore(p_format, p_va, endchar, n - i - 1, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000153 Py_DECREF(d);
154 return NULL;
155 }
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300156 v = do_mkvalue(p_format, p_va, flags);
157 if (v == NULL || PyDict_SetItem(d, k, v) < 0) {
158 do_ignore(p_format, p_va, endchar, n - i - 2, flags);
159 Py_DECREF(k);
160 Py_XDECREF(v);
161 Py_DECREF(d);
162 return NULL;
163 }
164 Py_DECREF(k);
165 Py_DECREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 }
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300167 if (**p_format != endchar) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000168 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000169 PyErr_SetString(PyExc_SystemError,
170 "Unmatched paren in format");
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300171 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 }
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300173 if (endchar)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 ++*p_format;
175 return d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000176}
177
Guido van Rossum79f25d91997-04-29 20:08:16 +0000178static PyObject *
Victor Stinnerb551b6c2016-12-09 00:27:22 +0100179do_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 +0000180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 PyObject *v;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100182 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 if (n < 0)
184 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000185 /* Note that we can't bail immediately on error as this will leak
186 refcounts on any 'N' arguments. */
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300187 v = PyList_New(n);
188 if (v == NULL) {
189 do_ignore(p_format, p_va, endchar, n, flags);
190 return NULL;
191 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 for (i = 0; i < n; i++) {
193 PyObject *w = do_mkvalue(p_format, p_va, flags);
194 if (w == NULL) {
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300195 do_ignore(p_format, p_va, endchar, n - i - 1, flags);
196 Py_DECREF(v);
197 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000198 }
199 PyList_SET_ITEM(v, i, w);
200 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000201 if (**p_format != endchar) {
202 Py_DECREF(v);
203 PyErr_SetString(PyExc_SystemError,
204 "Unmatched paren in format");
205 return NULL;
206 }
207 if (endchar)
208 ++*p_format;
209 return v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000210}
211
Victor Stinnere9abde42016-12-09 00:29:49 +0100212static int
213do_mkstack(PyObject **stack, const char **p_format, va_list *p_va,
214 char endchar, Py_ssize_t n, int flags)
215{
216 Py_ssize_t i;
217
218 if (n < 0) {
219 return -1;
220 }
221 /* Note that we can't bail immediately on error as this will leak
222 refcounts on any 'N' arguments. */
223 for (i = 0; i < n; i++) {
224 PyObject *w = do_mkvalue(p_format, p_va, flags);
225 if (w == NULL) {
226 do_ignore(p_format, p_va, endchar, n - i - 1, flags);
227 goto error;
228 }
229 stack[i] = w;
230 }
231 if (**p_format != endchar) {
232 PyErr_SetString(PyExc_SystemError,
233 "Unmatched paren in format");
234 goto error;
235 }
236 if (endchar) {
237 ++*p_format;
238 }
239 return 0;
240
241error:
242 n = i;
243 for (i=0; i < n; i++) {
244 Py_DECREF(stack[i]);
245 }
246 return -1;
247}
248
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249static PyObject *
Victor Stinnerb551b6c2016-12-09 00:27:22 +0100250do_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 +0000251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000252 PyObject *v;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100253 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 if (n < 0)
255 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 /* Note that we can't bail immediately on error as this will leak
257 refcounts on any 'N' arguments. */
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300258 if ((v = PyTuple_New(n)) == NULL) {
259 do_ignore(p_format, p_va, endchar, n, flags);
260 return NULL;
261 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 for (i = 0; i < n; i++) {
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300263 PyObject *w = do_mkvalue(p_format, p_va, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 if (w == NULL) {
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300265 do_ignore(p_format, p_va, endchar, n - i - 1, flags);
266 Py_DECREF(v);
267 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 }
269 PyTuple_SET_ITEM(v, i, w);
270 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 if (**p_format != endchar) {
272 Py_DECREF(v);
273 PyErr_SetString(PyExc_SystemError,
274 "Unmatched paren in format");
275 return NULL;
276 }
277 if (endchar)
278 ++*p_format;
279 return v;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000280}
281
Guido van Rossum79f25d91997-04-29 20:08:16 +0000282static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000283do_mkvalue(const char **p_format, va_list *p_va, int flags)
Guido van Rossum899dcf31992-05-15 11:04:59 +0000284{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 for (;;) {
286 switch (*(*p_format)++) {
287 case '(':
288 return do_mktuple(p_format, p_va, ')',
289 countformat(*p_format, ')'), flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 case '[':
292 return do_mklist(p_format, p_va, ']',
293 countformat(*p_format, ']'), flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 case '{':
296 return do_mkdict(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 'b':
300 case 'B':
301 case 'h':
302 case 'i':
303 return PyLong_FromLong((long)va_arg(*p_va, int));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 case 'H':
306 return PyLong_FromLong((long)va_arg(*p_va, unsigned int));
307
308 case 'I':
309 {
310 unsigned int n;
311 n = va_arg(*p_va, unsigned int);
312 return PyLong_FromUnsignedLong(n);
313 }
314
315 case 'n':
Martin v. Löwis18e16552006-02-15 17:27:45 +0000316#if SIZEOF_SIZE_T!=SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000317 return PyLong_FromSsize_t(va_arg(*p_va, Py_ssize_t));
Martin v. Löwis18e16552006-02-15 17:27:45 +0000318#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000319 /* Fall through from 'n' to 'l' if Py_ssize_t is long */
320 case 'l':
321 return PyLong_FromLong(va_arg(*p_va, long));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000323 case 'k':
324 {
325 unsigned long n;
326 n = va_arg(*p_va, unsigned long);
327 return PyLong_FromUnsignedLong(n);
328 }
Jack Jansendbd65032003-04-17 22:01:10 +0000329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 case 'L':
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700331 return PyLong_FromLongLong((long long)va_arg(*p_va, long long));
Jack Jansendbd65032003-04-17 22:01:10 +0000332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000333 case 'K':
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700334 return PyLong_FromUnsignedLongLong((long long)va_arg(*p_va, unsigned long long));
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 case 'u':
337 {
338 PyObject *v;
339 Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);
340 Py_ssize_t n;
341 if (**p_format == '#') {
342 ++*p_format;
343 if (flags & FLAG_SIZE_T)
344 n = va_arg(*p_va, Py_ssize_t);
Inada Naokid3c72a22019-03-23 21:04:40 +0900345 else {
346 if (PyErr_WarnEx(PyExc_DeprecationWarning,
347 "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
348 return NULL;
349 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 n = va_arg(*p_va, int);
Inada Naokid3c72a22019-03-23 21:04:40 +0900351 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 }
353 else
354 n = -1;
355 if (u == NULL) {
356 v = Py_None;
357 Py_INCREF(v);
358 }
359 else {
360 if (n < 0)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200361 n = wcslen(u);
362 v = PyUnicode_FromWideChar(u, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 }
364 return v;
365 }
366 case 'f':
367 case 'd':
368 return PyFloat_FromDouble(
369 (double)va_arg(*p_va, va_double));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 case 'D':
372 return PyComplex_FromCComplex(
373 *((Py_complex *)va_arg(*p_va, Py_complex *)));
Fred Drakeaec79242001-03-12 21:03:26 +0000374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 case 'c':
376 {
377 char p[1];
378 p[0] = (char)va_arg(*p_va, int);
379 return PyBytes_FromStringAndSize(p, 1);
380 }
381 case 'C':
382 {
383 int i = va_arg(*p_va, int);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 return PyUnicode_FromOrdinal(i);
385 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 case 's':
388 case 'z':
Victor Stinner7eeb5b52010-06-07 19:57:46 +0000389 case 'U': /* XXX deprecated alias */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 {
391 PyObject *v;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200392 const char *str = va_arg(*p_va, const char *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 Py_ssize_t n;
394 if (**p_format == '#') {
395 ++*p_format;
396 if (flags & FLAG_SIZE_T)
397 n = va_arg(*p_va, Py_ssize_t);
Inada Naokid3c72a22019-03-23 21:04:40 +0900398 else {
399 if (PyErr_WarnEx(PyExc_DeprecationWarning,
400 "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
401 return NULL;
402 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 n = va_arg(*p_va, int);
Inada Naokid3c72a22019-03-23 21:04:40 +0900404 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 }
406 else
407 n = -1;
408 if (str == NULL) {
409 v = Py_None;
410 Py_INCREF(v);
411 }
412 else {
413 if (n < 0) {
414 size_t m = strlen(str);
415 if (m > PY_SSIZE_T_MAX) {
416 PyErr_SetString(PyExc_OverflowError,
417 "string too long for Python string");
418 return NULL;
419 }
420 n = (Py_ssize_t)m;
421 }
422 v = PyUnicode_FromStringAndSize(str, n);
423 }
424 return v;
425 }
Walter Dörwaldd2034312007-05-18 16:29:38 +0000426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 case 'y':
428 {
429 PyObject *v;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200430 const char *str = va_arg(*p_va, const char *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 Py_ssize_t n;
432 if (**p_format == '#') {
433 ++*p_format;
434 if (flags & FLAG_SIZE_T)
435 n = va_arg(*p_va, Py_ssize_t);
Inada Naokid3c72a22019-03-23 21:04:40 +0900436 else {
437 if (PyErr_WarnEx(PyExc_DeprecationWarning,
438 "PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
439 return NULL;
440 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 n = va_arg(*p_va, int);
Inada Naokid3c72a22019-03-23 21:04:40 +0900442 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 }
444 else
445 n = -1;
446 if (str == NULL) {
447 v = Py_None;
448 Py_INCREF(v);
449 }
450 else {
451 if (n < 0) {
452 size_t m = strlen(str);
453 if (m > PY_SSIZE_T_MAX) {
454 PyErr_SetString(PyExc_OverflowError,
455 "string too long for Python bytes");
456 return NULL;
457 }
458 n = (Py_ssize_t)m;
459 }
460 v = PyBytes_FromStringAndSize(str, n);
461 }
462 return v;
463 }
Walter Dörwald612344f2007-05-04 19:28:21 +0000464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 case 'N':
466 case 'S':
467 case 'O':
468 if (**p_format == '&') {
469 typedef PyObject *(*converter)(void *);
470 converter func = va_arg(*p_va, converter);
471 void *arg = va_arg(*p_va, void *);
472 ++*p_format;
473 return (*func)(arg);
474 }
475 else {
476 PyObject *v;
477 v = va_arg(*p_va, PyObject *);
478 if (v != NULL) {
479 if (*(*p_format - 1) != 'N')
480 Py_INCREF(v);
481 }
482 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 PyErr_SetString(PyExc_SystemError,
492 "NULL object passed to Py_BuildValue");
493 return v;
494 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 case ':':
497 case ',':
498 case ' ':
499 case '\t':
500 break;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 default:
503 PyErr_SetString(PyExc_SystemError,
504 "bad format char passed to Py_BuildValue");
505 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 }
508 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000509}
510
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000511
Fred Drakeceead6d2003-01-30 15:08:25 +0000512PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000513Py_BuildValue(const char *format, ...)
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000514{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 va_list va;
516 PyObject* retval;
517 va_start(va, format);
518 retval = va_build_value(format, va, 0);
519 va_end(va);
520 return retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000521}
522
523PyObject *
524_Py_BuildValue_SizeT(const char *format, ...)
525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 va_list va;
527 PyObject* retval;
528 va_start(va, format);
529 retval = va_build_value(format, va, FLAG_SIZE_T);
530 va_end(va);
531 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000532}
Guido van Rossume5372401993-03-16 12:15:04 +0000533
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000535Py_VaBuildValue(const char *format, va_list va)
Guido van Rossume5372401993-03-16 12:15:04 +0000536{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 return va_build_value(format, va, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000538}
539
540PyObject *
541_Py_VaBuildValue_SizeT(const char *format, va_list va)
542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 return va_build_value(format, va, FLAG_SIZE_T);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000544}
545
546static PyObject *
547va_build_value(const char *format, va_list va, int flags)
548{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 const char *f = format;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100550 Py_ssize_t n = countformat(f, '\0');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 va_list lva;
Christian Heimes2f2fee12016-09-21 11:37:27 +0200552 PyObject *retval;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 if (n < 0)
555 return NULL;
556 if (n == 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200557 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 }
Christian Heimes2f2fee12016-09-21 11:37:27 +0200559 va_copy(lva, va);
560 if (n == 1) {
561 retval = do_mkvalue(&f, &lva, flags);
562 } else {
563 retval = do_mktuple(&f, &lva, '\0', n, flags);
564 }
565 va_end(lva);
566 return retval;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000567}
568
Victor Stinnere9abde42016-12-09 00:29:49 +0100569PyObject **
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{
573 return va_build_stack(small_stack, small_stack_len, format, va, 0, p_nargs);
574}
575
576PyObject **
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{
580 return va_build_stack(small_stack, small_stack_len, format, va, FLAG_SIZE_T, p_nargs);
581}
582
583static PyObject **
584va_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{
587 const char *f;
588 Py_ssize_t n;
589 va_list lva;
590 PyObject **stack;
591 int res;
592
593 n = countformat(format, '\0');
594 if (n < 0) {
595 *p_nargs = 0;
596 return NULL;
597 }
598
599 if (n == 0) {
600 *p_nargs = 0;
601 return small_stack;
602 }
603
604 if (n <= small_stack_len) {
605 stack = small_stack;
606 }
607 else {
608 stack = PyMem_Malloc(n * sizeof(stack[0]));
609 if (stack == NULL) {
610 PyErr_NoMemory();
611 return NULL;
612 }
613 }
614
615 va_copy(lva, va);
616 f = format;
617 res = do_mkstack(stack, &f, &lva, '\0', n, flags);
618 va_end(lva);
619
620 if (res < 0) {
621 return NULL;
622 }
623
624 *p_nargs = n;
625 return stack;
626}
627
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000628
Fred Drake9e285152000-09-23 03:24:27 +0000629int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000630PyModule_AddObject(PyObject *m, const char *name, PyObject *o)
Fred Drake9e285152000-09-23 03:24:27 +0000631{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 PyObject *dict;
633 if (!PyModule_Check(m)) {
634 PyErr_SetString(PyExc_TypeError,
635 "PyModule_AddObject() needs module as first arg");
636 return -1;
637 }
638 if (!o) {
639 if (!PyErr_Occurred())
640 PyErr_SetString(PyExc_TypeError,
641 "PyModule_AddObject() needs non-NULL value");
642 return -1;
643 }
Jeremy Hyltonc44dbc42003-06-21 21:35:25 +0000644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 dict = PyModule_GetDict(m);
646 if (dict == NULL) {
647 /* Internal error -- modules must have a dict! */
648 PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
649 PyModule_GetName(m));
650 return -1;
651 }
652 if (PyDict_SetItemString(dict, name, o))
653 return -1;
654 Py_DECREF(o);
655 return 0;
Fred Drake9e285152000-09-23 03:24:27 +0000656}
657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000659PyModule_AddIntConstant(PyObject *m, const char *name, long value)
Fred Drake9e285152000-09-23 03:24:27 +0000660{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 PyObject *o = PyLong_FromLong(value);
662 if (!o)
663 return -1;
664 if (PyModule_AddObject(m, name, o) == 0)
665 return 0;
666 Py_DECREF(o);
667 return -1;
Fred Drake9e285152000-09-23 03:24:27 +0000668}
669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000671PyModule_AddStringConstant(PyObject *m, const char *name, const char *value)
Fred Drake9e285152000-09-23 03:24:27 +0000672{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 PyObject *o = PyUnicode_FromString(value);
674 if (!o)
675 return -1;
676 if (PyModule_AddObject(m, name, o) == 0)
677 return 0;
678 Py_DECREF(o);
679 return -1;
Fred Drake9e285152000-09-23 03:24:27 +0000680}