blob: e9e025bdb2ba63c85cfc9bc836328d4fc6c59693 [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
Guido van Rossumbf80e541993-02-08 15:49:17 +000015/* Helper for mkvalue() to scan the length of a format */
Guido van Rossumfc61adb1992-04-13 15:53:41 +000016
Victor Stinnere9aae2d2016-12-09 00:24:47 +010017static Py_ssize_t
Victor Stinnerb551b6c2016-12-09 00:27:22 +010018countformat(const char *format, char endchar)
Guido van Rossumfc61adb1992-04-13 15:53:41 +000019{
Victor Stinnere9aae2d2016-12-09 00:24:47 +010020 Py_ssize_t count = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000021 int level = 0;
22 while (level > 0 || *format != endchar) {
23 switch (*format) {
24 case '\0':
25 /* Premature end */
26 PyErr_SetString(PyExc_SystemError,
27 "unmatched paren in format");
28 return -1;
29 case '(':
30 case '[':
31 case '{':
Victor Stinnere9aae2d2016-12-09 00:24:47 +010032 if (level == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000033 count++;
Victor Stinnere9aae2d2016-12-09 00:24:47 +010034 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035 level++;
36 break;
37 case ')':
38 case ']':
39 case '}':
40 level--;
41 break;
42 case '#':
43 case '&':
44 case ',':
45 case ':':
46 case ' ':
47 case '\t':
48 break;
49 default:
Victor Stinnere9aae2d2016-12-09 00:24:47 +010050 if (level == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000051 count++;
Victor Stinnere9aae2d2016-12-09 00:24:47 +010052 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000053 }
54 format++;
55 }
56 return count;
Guido van Rossumfc61adb1992-04-13 15:53:41 +000057}
58
59
Guido van Rossumfc61adb1992-04-13 15:53:41 +000060/* Generic function to create a value -- the inverse of getargs() */
61/* After an original idea and first implementation by Steven Miale */
62
Victor Stinnerb551b6c2016-12-09 00:27:22 +010063static PyObject *do_mktuple(const char**, va_list *, char, Py_ssize_t, int);
Victor Stinnere9abde42016-12-09 00:29:49 +010064static int do_mkstack(PyObject **, const char**, va_list *, char, Py_ssize_t, int);
Victor Stinnerb551b6c2016-12-09 00:27:22 +010065static PyObject *do_mklist(const char**, va_list *, char, Py_ssize_t, int);
66static PyObject *do_mkdict(const char**, va_list *, char, Py_ssize_t, int);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000067static PyObject *do_mkvalue(const char**, va_list *, int);
Guido van Rossumfc61adb1992-04-13 15:53:41 +000068
Guido van Rossum1ae940a1995-01-02 19:04:15 +000069
Serhiy Storchaka13e602e2016-05-20 22:31:14 +030070static void
Victor Stinnerb551b6c2016-12-09 00:27:22 +010071do_ignore(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int flags)
Serhiy Storchaka13e602e2016-05-20 22:31:14 +030072{
73 PyObject *v;
Victor Stinnere9aae2d2016-12-09 00:24:47 +010074 Py_ssize_t i;
Serhiy Storchaka13e602e2016-05-20 22:31:14 +030075 assert(PyErr_Occurred());
76 v = PyTuple_New(n);
77 for (i = 0; i < n; i++) {
78 PyObject *exception, *value, *tb, *w;
79
80 PyErr_Fetch(&exception, &value, &tb);
81 w = do_mkvalue(p_format, p_va, flags);
82 PyErr_Restore(exception, value, tb);
83 if (w != NULL) {
84 if (v != NULL) {
85 PyTuple_SET_ITEM(v, i, w);
86 }
87 else {
88 Py_DECREF(w);
89 }
90 }
91 }
92 Py_XDECREF(v);
93 if (**p_format != endchar) {
94 PyErr_SetString(PyExc_SystemError,
95 "Unmatched paren in format");
96 return;
97 }
Victor Stinnere9aae2d2016-12-09 00:24:47 +010098 if (endchar) {
Serhiy Storchaka13e602e2016-05-20 22:31:14 +030099 ++*p_format;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100100 }
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300101}
102
Guido van Rossum79f25d91997-04-29 20:08:16 +0000103static PyObject *
Victor Stinnerb551b6c2016-12-09 00:27:22 +0100104do_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 +0000105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 PyObject *d;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100107 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 if (n < 0)
109 return NULL;
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300110 if (n % 2) {
111 PyErr_SetString(PyExc_SystemError,
112 "Bad dict format");
113 do_ignore(p_format, p_va, endchar, n, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000114 return NULL;
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300115 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 /* Note that we can't bail immediately on error as this will leak
117 refcounts on any 'N' arguments. */
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300118 if ((d = PyDict_New()) == NULL) {
119 do_ignore(p_format, p_va, endchar, n, flags);
120 return NULL;
121 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122 for (i = 0; i < n; i+= 2) {
123 PyObject *k, *v;
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 k = do_mkvalue(p_format, p_va, flags);
126 if (k == NULL) {
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300127 do_ignore(p_format, p_va, endchar, n - i - 1, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 Py_DECREF(d);
129 return NULL;
130 }
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300131 v = do_mkvalue(p_format, p_va, flags);
132 if (v == NULL || PyDict_SetItem(d, k, v) < 0) {
133 do_ignore(p_format, p_va, endchar, n - i - 2, flags);
134 Py_DECREF(k);
135 Py_XDECREF(v);
136 Py_DECREF(d);
137 return NULL;
138 }
139 Py_DECREF(k);
140 Py_DECREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 }
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300142 if (**p_format != endchar) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143 Py_DECREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 PyErr_SetString(PyExc_SystemError,
145 "Unmatched paren in format");
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300146 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 }
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300148 if (endchar)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 ++*p_format;
150 return d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000151}
152
Guido van Rossum79f25d91997-04-29 20:08:16 +0000153static PyObject *
Victor Stinnerb551b6c2016-12-09 00:27:22 +0100154do_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 +0000155{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 PyObject *v;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100157 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 if (n < 0)
159 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 /* Note that we can't bail immediately on error as this will leak
161 refcounts on any 'N' arguments. */
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300162 v = PyList_New(n);
163 if (v == NULL) {
164 do_ignore(p_format, p_va, endchar, n, flags);
165 return NULL;
166 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 for (i = 0; i < n; i++) {
168 PyObject *w = do_mkvalue(p_format, p_va, flags);
169 if (w == NULL) {
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300170 do_ignore(p_format, p_va, endchar, n - i - 1, flags);
171 Py_DECREF(v);
172 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 }
174 PyList_SET_ITEM(v, i, w);
175 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 if (**p_format != endchar) {
177 Py_DECREF(v);
178 PyErr_SetString(PyExc_SystemError,
179 "Unmatched paren in format");
180 return NULL;
181 }
182 if (endchar)
183 ++*p_format;
184 return v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000185}
186
Victor Stinnere9abde42016-12-09 00:29:49 +0100187static int
188do_mkstack(PyObject **stack, const char **p_format, va_list *p_va,
189 char endchar, Py_ssize_t n, int flags)
190{
191 Py_ssize_t i;
192
193 if (n < 0) {
194 return -1;
195 }
196 /* Note that we can't bail immediately on error as this will leak
197 refcounts on any 'N' arguments. */
198 for (i = 0; i < n; i++) {
199 PyObject *w = do_mkvalue(p_format, p_va, flags);
200 if (w == NULL) {
201 do_ignore(p_format, p_va, endchar, n - i - 1, flags);
202 goto error;
203 }
204 stack[i] = w;
205 }
206 if (**p_format != endchar) {
207 PyErr_SetString(PyExc_SystemError,
208 "Unmatched paren in format");
209 goto error;
210 }
211 if (endchar) {
212 ++*p_format;
213 }
214 return 0;
215
216error:
217 n = i;
218 for (i=0; i < n; i++) {
219 Py_DECREF(stack[i]);
220 }
221 return -1;
222}
223
Guido van Rossum79f25d91997-04-29 20:08:16 +0000224static PyObject *
Victor Stinnerb551b6c2016-12-09 00:27:22 +0100225do_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 +0000226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 PyObject *v;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100228 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 if (n < 0)
230 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 /* Note that we can't bail immediately on error as this will leak
232 refcounts on any 'N' arguments. */
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300233 if ((v = PyTuple_New(n)) == NULL) {
234 do_ignore(p_format, p_va, endchar, n, flags);
235 return NULL;
236 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 for (i = 0; i < n; i++) {
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300238 PyObject *w = do_mkvalue(p_format, p_va, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 if (w == NULL) {
Serhiy Storchaka13e602e2016-05-20 22:31:14 +0300240 do_ignore(p_format, p_va, endchar, n - i - 1, flags);
241 Py_DECREF(v);
242 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 }
244 PyTuple_SET_ITEM(v, i, w);
245 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 if (**p_format != endchar) {
247 Py_DECREF(v);
248 PyErr_SetString(PyExc_SystemError,
249 "Unmatched paren in format");
250 return NULL;
251 }
252 if (endchar)
253 ++*p_format;
254 return v;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000255}
256
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000258do_mkvalue(const char **p_format, va_list *p_va, int flags)
Guido van Rossum899dcf31992-05-15 11:04:59 +0000259{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 for (;;) {
261 switch (*(*p_format)++) {
262 case '(':
263 return do_mktuple(p_format, p_va, ')',
264 countformat(*p_format, ')'), flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 case '[':
267 return do_mklist(p_format, p_va, ']',
268 countformat(*p_format, ']'), flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000270 case '{':
271 return do_mkdict(p_format, p_va, '}',
272 countformat(*p_format, '}'), flags);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274 case 'b':
275 case 'B':
276 case 'h':
277 case 'i':
278 return PyLong_FromLong((long)va_arg(*p_va, int));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 case 'H':
281 return PyLong_FromLong((long)va_arg(*p_va, unsigned int));
282
283 case 'I':
284 {
285 unsigned int n;
286 n = va_arg(*p_va, unsigned int);
287 return PyLong_FromUnsignedLong(n);
288 }
289
290 case 'n':
Martin v. Löwis18e16552006-02-15 17:27:45 +0000291#if SIZEOF_SIZE_T!=SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 return PyLong_FromSsize_t(va_arg(*p_va, Py_ssize_t));
Martin v. Löwis18e16552006-02-15 17:27:45 +0000293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 /* Fall through from 'n' to 'l' if Py_ssize_t is long */
295 case 'l':
296 return PyLong_FromLong(va_arg(*p_va, long));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 case 'k':
299 {
300 unsigned long n;
301 n = va_arg(*p_va, unsigned long);
302 return PyLong_FromUnsignedLong(n);
303 }
Jack Jansendbd65032003-04-17 22:01:10 +0000304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 case 'L':
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700306 return PyLong_FromLongLong((long long)va_arg(*p_va, long long));
Jack Jansendbd65032003-04-17 22:01:10 +0000307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 case 'K':
Benjamin Petersonaf580df2016-09-06 10:46:49 -0700309 return PyLong_FromUnsignedLongLong((long long)va_arg(*p_va, unsigned long long));
Benjamin Petersoned4aa832016-09-05 17:44:18 -0700310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 case 'u':
312 {
313 PyObject *v;
314 Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);
315 Py_ssize_t n;
316 if (**p_format == '#') {
317 ++*p_format;
318 if (flags & FLAG_SIZE_T)
319 n = va_arg(*p_va, Py_ssize_t);
320 else
321 n = va_arg(*p_va, int);
322 }
323 else
324 n = -1;
325 if (u == NULL) {
326 v = Py_None;
327 Py_INCREF(v);
328 }
329 else {
330 if (n < 0)
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200331 n = wcslen(u);
332 v = PyUnicode_FromWideChar(u, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000333 }
334 return v;
335 }
336 case 'f':
337 case 'd':
338 return PyFloat_FromDouble(
339 (double)va_arg(*p_va, va_double));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 case 'D':
342 return PyComplex_FromCComplex(
343 *((Py_complex *)va_arg(*p_va, Py_complex *)));
Fred Drakeaec79242001-03-12 21:03:26 +0000344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 case 'c':
346 {
347 char p[1];
348 p[0] = (char)va_arg(*p_va, int);
349 return PyBytes_FromStringAndSize(p, 1);
350 }
351 case 'C':
352 {
353 int i = va_arg(*p_va, int);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 return PyUnicode_FromOrdinal(i);
355 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 case 's':
358 case 'z':
Victor Stinner7eeb5b52010-06-07 19:57:46 +0000359 case 'U': /* XXX deprecated alias */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 {
361 PyObject *v;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200362 const char *str = va_arg(*p_va, const char *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 Py_ssize_t n;
364 if (**p_format == '#') {
365 ++*p_format;
366 if (flags & FLAG_SIZE_T)
367 n = va_arg(*p_va, Py_ssize_t);
368 else
369 n = va_arg(*p_va, int);
370 }
371 else
372 n = -1;
373 if (str == NULL) {
374 v = Py_None;
375 Py_INCREF(v);
376 }
377 else {
378 if (n < 0) {
379 size_t m = strlen(str);
380 if (m > PY_SSIZE_T_MAX) {
381 PyErr_SetString(PyExc_OverflowError,
382 "string too long for Python string");
383 return NULL;
384 }
385 n = (Py_ssize_t)m;
386 }
387 v = PyUnicode_FromStringAndSize(str, n);
388 }
389 return v;
390 }
Walter Dörwaldd2034312007-05-18 16:29:38 +0000391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 case 'y':
393 {
394 PyObject *v;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200395 const char *str = va_arg(*p_va, const char *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 Py_ssize_t n;
397 if (**p_format == '#') {
398 ++*p_format;
399 if (flags & FLAG_SIZE_T)
400 n = va_arg(*p_va, Py_ssize_t);
401 else
402 n = va_arg(*p_va, int);
403 }
404 else
405 n = -1;
406 if (str == NULL) {
407 v = Py_None;
408 Py_INCREF(v);
409 }
410 else {
411 if (n < 0) {
412 size_t m = strlen(str);
413 if (m > PY_SSIZE_T_MAX) {
414 PyErr_SetString(PyExc_OverflowError,
415 "string too long for Python bytes");
416 return NULL;
417 }
418 n = (Py_ssize_t)m;
419 }
420 v = PyBytes_FromStringAndSize(str, n);
421 }
422 return v;
423 }
Walter Dörwald612344f2007-05-04 19:28:21 +0000424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 case 'N':
426 case 'S':
427 case 'O':
428 if (**p_format == '&') {
429 typedef PyObject *(*converter)(void *);
430 converter func = va_arg(*p_va, converter);
431 void *arg = va_arg(*p_va, void *);
432 ++*p_format;
433 return (*func)(arg);
434 }
435 else {
436 PyObject *v;
437 v = va_arg(*p_va, PyObject *);
438 if (v != NULL) {
439 if (*(*p_format - 1) != 'N')
440 Py_INCREF(v);
441 }
442 else if (!PyErr_Occurred())
443 /* If a NULL was passed
444 * because a call that should
445 * have constructed a value
446 * failed, that's OK, and we
447 * pass the error on; but if
448 * no error occurred it's not
449 * clear that the caller knew
450 * what she was doing. */
451 PyErr_SetString(PyExc_SystemError,
452 "NULL object passed to Py_BuildValue");
453 return v;
454 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 case ':':
457 case ',':
458 case ' ':
459 case '\t':
460 break;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 default:
463 PyErr_SetString(PyExc_SystemError,
464 "bad format char passed to Py_BuildValue");
465 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 }
468 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000469}
470
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000471
Fred Drakeceead6d2003-01-30 15:08:25 +0000472PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000473Py_BuildValue(const char *format, ...)
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000474{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 va_list va;
476 PyObject* retval;
477 va_start(va, format);
478 retval = va_build_value(format, va, 0);
479 va_end(va);
480 return retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000481}
482
483PyObject *
484_Py_BuildValue_SizeT(const char *format, ...)
485{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 va_list va;
487 PyObject* retval;
488 va_start(va, format);
489 retval = va_build_value(format, va, FLAG_SIZE_T);
490 va_end(va);
491 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000492}
Guido van Rossume5372401993-03-16 12:15:04 +0000493
Guido van Rossum79f25d91997-04-29 20:08:16 +0000494PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000495Py_VaBuildValue(const char *format, va_list va)
Guido van Rossume5372401993-03-16 12:15:04 +0000496{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 return va_build_value(format, va, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000498}
499
500PyObject *
501_Py_VaBuildValue_SizeT(const char *format, va_list va)
502{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 return va_build_value(format, va, FLAG_SIZE_T);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000504}
505
506static PyObject *
507va_build_value(const char *format, va_list va, int flags)
508{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 const char *f = format;
Victor Stinnere9aae2d2016-12-09 00:24:47 +0100510 Py_ssize_t n = countformat(f, '\0');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 va_list lva;
Christian Heimes2f2fee12016-09-21 11:37:27 +0200512 PyObject *retval;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 if (n < 0)
515 return NULL;
516 if (n == 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200517 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 }
Christian Heimes2f2fee12016-09-21 11:37:27 +0200519 va_copy(lva, va);
520 if (n == 1) {
521 retval = do_mkvalue(&f, &lva, flags);
522 } else {
523 retval = do_mktuple(&f, &lva, '\0', n, flags);
524 }
525 va_end(lva);
526 return retval;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000527}
528
Victor Stinnere9abde42016-12-09 00:29:49 +0100529PyObject **
530_Py_VaBuildStack(PyObject **small_stack, Py_ssize_t small_stack_len,
531 const char *format, va_list va, Py_ssize_t *p_nargs)
532{
533 return va_build_stack(small_stack, small_stack_len, format, va, 0, p_nargs);
534}
535
536PyObject **
537_Py_VaBuildStack_SizeT(PyObject **small_stack, Py_ssize_t small_stack_len,
538 const char *format, va_list va, Py_ssize_t *p_nargs)
539{
540 return va_build_stack(small_stack, small_stack_len, format, va, FLAG_SIZE_T, p_nargs);
541}
542
543static PyObject **
544va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len,
545 const char *format, va_list va, int flags, Py_ssize_t *p_nargs)
546{
547 const char *f;
548 Py_ssize_t n;
549 va_list lva;
550 PyObject **stack;
551 int res;
552
553 n = countformat(format, '\0');
554 if (n < 0) {
555 *p_nargs = 0;
556 return NULL;
557 }
558
559 if (n == 0) {
560 *p_nargs = 0;
561 return small_stack;
562 }
563
564 if (n <= small_stack_len) {
565 stack = small_stack;
566 }
567 else {
568 stack = PyMem_Malloc(n * sizeof(stack[0]));
569 if (stack == NULL) {
570 PyErr_NoMemory();
571 return NULL;
572 }
573 }
574
575 va_copy(lva, va);
576 f = format;
577 res = do_mkstack(stack, &f, &lva, '\0', n, flags);
578 va_end(lva);
579
580 if (res < 0) {
581 return NULL;
582 }
583
584 *p_nargs = n;
585 return stack;
586}
587
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000588
Guido van Rossum79f25d91997-04-29 20:08:16 +0000589PyObject *
Victor Stinner2d0eb652016-12-06 16:27:24 +0100590PyEval_CallFunction(PyObject *callable, const char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 va_list vargs;
593 PyObject *args;
594 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 va_start(vargs, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 args = Py_VaBuildValue(format, vargs);
599 va_end(vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 if (args == NULL)
602 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000603
Victor Stinner2d0eb652016-12-06 16:27:24 +0100604 res = PyEval_CallObject(callable, args);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 return res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000608}
609
610
Guido van Rossum79f25d91997-04-29 20:08:16 +0000611PyObject *
Victor Stinner2d0eb652016-12-06 16:27:24 +0100612PyEval_CallMethod(PyObject *obj, const char *name, const char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 va_list vargs;
615 PyObject *meth;
616 PyObject *args;
617 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000618
Victor Stinner2d0eb652016-12-06 16:27:24 +0100619 meth = PyObject_GetAttrString(obj, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 if (meth == NULL)
621 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 va_start(vargs, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 args = Py_VaBuildValue(format, vargs);
626 va_end(vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 if (args == NULL) {
629 Py_DECREF(meth);
630 return NULL;
631 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 res = PyEval_CallObject(meth, args);
634 Py_DECREF(meth);
635 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 return res;
Guido van Rossume5372401993-03-16 12:15:04 +0000638}
Fred Drake9e285152000-09-23 03:24:27 +0000639
640int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000641PyModule_AddObject(PyObject *m, const char *name, PyObject *o)
Fred Drake9e285152000-09-23 03:24:27 +0000642{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 PyObject *dict;
644 if (!PyModule_Check(m)) {
645 PyErr_SetString(PyExc_TypeError,
646 "PyModule_AddObject() needs module as first arg");
647 return -1;
648 }
649 if (!o) {
650 if (!PyErr_Occurred())
651 PyErr_SetString(PyExc_TypeError,
652 "PyModule_AddObject() needs non-NULL value");
653 return -1;
654 }
Jeremy Hyltonc44dbc42003-06-21 21:35:25 +0000655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 dict = PyModule_GetDict(m);
657 if (dict == NULL) {
658 /* Internal error -- modules must have a dict! */
659 PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
660 PyModule_GetName(m));
661 return -1;
662 }
663 if (PyDict_SetItemString(dict, name, o))
664 return -1;
665 Py_DECREF(o);
666 return 0;
Fred Drake9e285152000-09-23 03:24:27 +0000667}
668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000670PyModule_AddIntConstant(PyObject *m, const char *name, long value)
Fred Drake9e285152000-09-23 03:24:27 +0000671{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 PyObject *o = PyLong_FromLong(value);
673 if (!o)
674 return -1;
675 if (PyModule_AddObject(m, name, o) == 0)
676 return 0;
677 Py_DECREF(o);
678 return -1;
Fred Drake9e285152000-09-23 03:24:27 +0000679}
680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681int
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000682PyModule_AddStringConstant(PyObject *m, const char *name, const char *value)
Fred Drake9e285152000-09-23 03:24:27 +0000683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 PyObject *o = PyUnicode_FromString(value);
685 if (!o)
686 return -1;
687 if (PyModule_AddObject(m, name, o) == 0)
688 return 0;
689 Py_DECREF(o);
690 return -1;
Fred Drake9e285152000-09-23 03:24:27 +0000691}