blob: dacc1a0a8158bcd854d796b31a7b722759fa85f3 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Module support implementation */
12
Guido van Rossum79f25d91997-04-29 20:08:16 +000013#include "Python.h"
Jack Jansen41aa8e52000-07-03 21:39:47 +000014#ifdef HAVE_LIMITS_H
15#include <limits.h>
16#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000017
Guido van Rossum1d5735e1994-08-30 08:27:36 +000018#ifdef MPW /* MPW pushes 'extended' for float and double types with varargs */
19typedef extended va_double;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000020#else
Guido van Rossum1d5735e1994-08-30 08:27:36 +000021typedef double va_double;
22#endif
23
Guido van Rossum2e58ff31997-11-19 18:53:33 +000024/* Package context -- the full module name for package imports */
25char *_Py_PackageContext = NULL;
26
Guido van Rossum40b33c61997-08-02 03:07:46 +000027/* Py_InitModule4() parameters:
Guido van Rossum970a0a21995-01-09 17:47:20 +000028 - name is the module name
29 - methods is the list of top-level functions
30 - doc is the documentation string
31 - passthrough is passed as self to functions defined in the module
32 - api_version is the value of PYTHON_API_VERSION at the time the
33 module was compiled
Guido van Rossum40b33c61997-08-02 03:07:46 +000034
35 Return value is a borrowed reference to the module object; or NULL
36 if an error occurred (in Python 1.4 and before, errors were fatal).
37 Errors may still leak memory.
Guido van Rossum50620fa1995-01-07 12:43:18 +000038*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +000039
Guido van Rossum970a0a21995-01-09 17:47:20 +000040static char api_version_warning[] =
41"WARNING: Python C API version mismatch for module %s:\n\
Sjoerd Mullender996e6dc1996-01-23 16:07:29 +000042 This Python has API version %d, module %s has version %d.\n";
Guido van Rossum970a0a21995-01-09 17:47:20 +000043
Guido van Rossum79f25d91997-04-29 20:08:16 +000044PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000045Py_InitModule4(char *name, PyMethodDef *methods, char *doc,
46 PyObject *passthrough, int module_api_version)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047{
Guido van Rossum79f25d91997-04-29 20:08:16 +000048 PyObject *m, *d, *v;
49 PyMethodDef *ml;
Guido van Rossum413407f2000-08-04 14:00:14 +000050 if (!Py_IsInitialized())
51 Py_FatalError("Interpreter not initialized (version mismatch?)");
Guido van Rossum970a0a21995-01-09 17:47:20 +000052 if (module_api_version != PYTHON_API_VERSION)
53 fprintf(stderr, api_version_warning,
54 name, PYTHON_API_VERSION, name, module_api_version);
Guido van Rossum2e58ff31997-11-19 18:53:33 +000055 if (_Py_PackageContext != NULL) {
56 char *p = strrchr(_Py_PackageContext, '.');
57 if (p != NULL && strcmp(name, p+1) == 0) {
58 name = _Py_PackageContext;
59 _Py_PackageContext = NULL;
60 }
61 }
Guido van Rossum40b33c61997-08-02 03:07:46 +000062 if ((m = PyImport_AddModule(name)) == NULL)
63 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000064 d = PyModule_GetDict(m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000065 for (ml = methods; ml->ml_name != NULL; ml++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000066 v = PyCFunction_New(ml, passthrough);
Guido van Rossum40b33c61997-08-02 03:07:46 +000067 if (v == NULL)
68 return NULL;
69 if (PyDict_SetItemString(d, ml->ml_name, v) != 0)
70 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000071 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072 }
Guido van Rossum50620fa1995-01-07 12:43:18 +000073 if (doc != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000074 v = PyString_FromString(doc);
75 if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0)
Guido van Rossum40b33c61997-08-02 03:07:46 +000076 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000077 Py_DECREF(v);
Guido van Rossum50620fa1995-01-07 12:43:18 +000078 }
Guido van Rossum3f5da241990-12-20 15:06:42 +000079 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000080}
81
82
Guido van Rossumbf80e541993-02-08 15:49:17 +000083/* Helper for mkvalue() to scan the length of a format */
Guido van Rossumfc61adb1992-04-13 15:53:41 +000084
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000085static int countformat(char *format, int endchar)
Guido van Rossumfc61adb1992-04-13 15:53:41 +000086{
87 int count = 0;
88 int level = 0;
89 while (level > 0 || *format != endchar) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +000090 switch (*format) {
91 case '\0':
Guido van Rossumfc61adb1992-04-13 15:53:41 +000092 /* Premature end */
Guido van Rossum79f25d91997-04-29 20:08:16 +000093 PyErr_SetString(PyExc_SystemError,
94 "unmatched paren in format");
Guido van Rossumfc61adb1992-04-13 15:53:41 +000095 return -1;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000096 case '(':
97 case '[':
98 case '{':
Guido van Rossumfc61adb1992-04-13 15:53:41 +000099 if (level == 0)
100 count++;
101 level++;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000102 break;
103 case ')':
104 case ']':
105 case '}':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000106 level--;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000107 break;
108 case '#':
Guido van Rossumd1b93931995-01-20 16:56:02 +0000109 case '&':
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000110 case ',':
111 case ':':
112 case ' ':
113 case '\t':
114 break;
115 default:
116 if (level == 0)
117 count++;
118 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000119 format++;
120 }
121 return count;
122}
123
124
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000125/* Generic function to create a value -- the inverse of getargs() */
126/* After an original idea and first implementation by Steven Miale */
127
Tim Petersdbd9ba62000-07-09 03:09:57 +0000128static PyObject *do_mktuple(char**, va_list *, int, int);
129static PyObject *do_mklist(char**, va_list *, int, int);
130static PyObject *do_mkdict(char**, va_list *, int, int);
131static PyObject *do_mkvalue(char**, va_list *);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000132
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000133
Guido van Rossum79f25d91997-04-29 20:08:16 +0000134static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000135do_mkdict(char **p_format, va_list *p_va, int endchar, int n)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000136{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000137 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000138 int i;
139 if (n < 0)
140 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000141 if ((d = PyDict_New()) == NULL)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000142 return NULL;
143 for (i = 0; i < n; i+= 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000144 PyObject *k, *v;
Guido van Rossumdb847bd1997-11-20 20:35:45 +0000145 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000146 k = do_mkvalue(p_format, p_va);
147 if (k == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000149 return NULL;
150 }
151 v = do_mkvalue(p_format, p_va);
152 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000153 Py_DECREF(k);
154 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000155 return NULL;
156 }
Guido van Rossumdb847bd1997-11-20 20:35:45 +0000157 err = PyDict_SetItem(d, k, v);
158 Py_DECREF(k);
159 Py_DECREF(v);
160 if (err < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000161 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000162 return NULL;
163 }
164 }
165 if (d != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 Py_DECREF(d);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000167 d = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 PyErr_SetString(PyExc_SystemError,
169 "Unmatched paren in format");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000170 }
171 else if (endchar)
172 ++*p_format;
173 return d;
174}
175
Guido van Rossum79f25d91997-04-29 20:08:16 +0000176static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000177do_mklist(char **p_format, va_list *p_va, int endchar, int n)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000178{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000179 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000180 int i;
181 if (n < 0)
182 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000183 if ((v = PyList_New(n)) == NULL)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000184 return NULL;
185 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186 PyObject *w = do_mkvalue(p_format, p_va);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000187 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 Py_DECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000189 return NULL;
190 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000191 PyList_SetItem(v, i, w);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000192 }
193 if (v != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000194 Py_DECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000195 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000196 PyErr_SetString(PyExc_SystemError,
197 "Unmatched paren in format");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000198 }
199 else if (endchar)
200 ++*p_format;
201 return v;
202}
203
Fred Drake25d34472000-04-28 14:42:37 +0000204static int
205_ustrlen(Py_UNICODE *u)
206{
207 int i = 0;
208 Py_UNICODE *v = u;
209 while (*v != 0) { i++; v++; }
210 return i;
211}
212
Guido van Rossum79f25d91997-04-29 20:08:16 +0000213static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000214do_mktuple(char **p_format, va_list *p_va, int endchar, int n)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000215{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000216 PyObject *v;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000217 int i;
218 if (n < 0)
219 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 if ((v = PyTuple_New(n)) == NULL)
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000221 return NULL;
222 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000223 PyObject *w = do_mkvalue(p_format, p_va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000224 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000225 Py_DECREF(v);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000226 return NULL;
227 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228 PyTuple_SetItem(v, i, w);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000229 }
230 if (v != NULL && **p_format != endchar) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000231 Py_DECREF(v);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000232 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000233 PyErr_SetString(PyExc_SystemError,
234 "Unmatched paren in format");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000235 }
236 else if (endchar)
237 ++*p_format;
238 return v;
239}
240
Guido van Rossum79f25d91997-04-29 20:08:16 +0000241static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000242do_mkvalue(char **p_format, va_list *p_va)
Guido van Rossum899dcf31992-05-15 11:04:59 +0000243{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000244 for (;;) {
245 switch (*(*p_format)++) {
246 case '(':
247 return do_mktuple(p_format, p_va, ')',
248 countformat(*p_format, ')'));
249
250 case '[':
251 return do_mklist(p_format, p_va, ']',
252 countformat(*p_format, ']'));
253
254 case '{':
255 return do_mkdict(p_format, p_va, '}',
256 countformat(*p_format, '}'));
257
258 case 'b':
259 case 'h':
260 case 'i':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000261 return PyInt_FromLong((long)va_arg(*p_va, int));
Jack Jansend50338f2000-07-06 12:22:00 +0000262
263 case 'H':
264 return PyInt_FromLong((long)va_arg(*p_va, unsigned int));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000265
266 case 'l':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 return PyInt_FromLong((long)va_arg(*p_va, long));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000268
Guido van Rossum3dbba6e1999-01-25 21:48:56 +0000269#ifdef HAVE_LONG_LONG
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000270 case 'L':
Guido van Rossum3293b071998-08-25 16:07:15 +0000271 return PyLong_FromLongLong((LONG_LONG)va_arg(*p_va, LONG_LONG));
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000272#endif
Fred Drake25d34472000-04-28 14:42:37 +0000273 case 'u':
274 {
275 PyObject *v;
276 Py_UNICODE *u = va_arg(*p_va, Py_UNICODE *);
277 int n;
278 if (**p_format == '#') {
279 ++*p_format;
280 n = va_arg(*p_va, int);
281 }
282 else
283 n = -1;
284 if (u == NULL) {
285 v = Py_None;
286 Py_INCREF(v);
287 }
288 else {
289 if (n < 0)
290 n = _ustrlen(u);
291 v = PyUnicode_FromUnicode(u, n);
292 }
293 return v;
294 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000295 case 'f':
296 case 'd':
Guido van Rossum79f25d91997-04-29 20:08:16 +0000297 return PyFloat_FromDouble(
298 (double)va_arg(*p_va, va_double));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000299
300 case 'c':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000301 {
302 char p[1];
303 p[0] = va_arg(*p_va, int);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304 return PyString_FromStringAndSize(p, 1);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000305 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000306
307 case 's':
308 case 'z':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000309 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 PyObject *v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000311 char *str = va_arg(*p_va, char *);
312 int n;
313 if (**p_format == '#') {
314 ++*p_format;
315 n = va_arg(*p_va, int);
316 }
317 else
318 n = -1;
319 if (str == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000320 v = Py_None;
321 Py_INCREF(v);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000322 }
323 else {
Guido van Rossum582acec2000-06-28 22:07:35 +0000324 if (n < 0) {
325 size_t m = strlen(str);
326 if (m > INT_MAX) {
327 PyErr_SetString(PyExc_OverflowError,
328 "string too long for Python string");
329 return NULL;
330 }
331 n = (int)m;
332 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 v = PyString_FromStringAndSize(str, n);
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000334 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000335 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000336 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000337
Guido van Rossumd3415001998-12-23 05:01:38 +0000338 case 'N':
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000339 case 'S':
340 case 'O':
Guido van Rossumd1b93931995-01-20 16:56:02 +0000341 if (**p_format == '&') {
Tim Petersdbd9ba62000-07-09 03:09:57 +0000342 typedef PyObject *(*converter)(void *);
Guido van Rossumd1b93931995-01-20 16:56:02 +0000343 converter func = va_arg(*p_va, converter);
344 void *arg = va_arg(*p_va, void *);
345 ++*p_format;
346 return (*func)(arg);
347 }
348 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000349 PyObject *v;
350 v = va_arg(*p_va, PyObject *);
Guido van Rossumc38e7d41998-12-23 19:53:45 +0000351 if (v != NULL) {
Guido van Rossumd3415001998-12-23 05:01:38 +0000352 if (*(*p_format - 1) != 'N')
353 Py_INCREF(v);
Guido van Rossumc38e7d41998-12-23 19:53:45 +0000354 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000355 else if (!PyErr_Occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000356 /* If a NULL was passed
357 * because a call that should
358 * have constructed a value
359 * failed, that's OK, and we
360 * pass the error on; but if
361 * no error occurred it's not
362 * clear that the caller knew
363 * what she was doing. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000364 PyErr_SetString(PyExc_SystemError,
Guido van Rossum233f4b51998-07-07 22:32:19 +0000365 "NULL object passed to Py_BuildValue");
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000366 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000367 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000368
369 case ':':
370 case ',':
371 case ' ':
372 case '\t':
373 break;
374
375 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000376 PyErr_SetString(PyExc_SystemError,
Guido van Rossum233f4b51998-07-07 22:32:19 +0000377 "bad format char passed to Py_BuildValue");
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000378 return NULL;
379
380 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000381 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000382}
383
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000384
Guido van Rossum79f25d91997-04-29 20:08:16 +0000385PyObject *Py_BuildValue(char *format, ...)
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000386{
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000387 va_list va;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000388 PyObject* retval;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000389 va_start(va, format);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000390 retval = Py_VaBuildValue(format, va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000391 va_end(va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000392 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000393}
Guido van Rossume5372401993-03-16 12:15:04 +0000394
Guido van Rossum79f25d91997-04-29 20:08:16 +0000395PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000396Py_VaBuildValue(char *format, va_list va)
Guido van Rossume5372401993-03-16 12:15:04 +0000397{
398 char *f = format;
399 int n = countformat(f, '\0');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000400 va_list lva;
401
402#ifdef VA_LIST_IS_ARRAY
403 memcpy(lva, va, sizeof(va_list));
404#else
405 lva = va;
406#endif
407
Guido van Rossume5372401993-03-16 12:15:04 +0000408 if (n < 0)
409 return NULL;
410 if (n == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000411 Py_INCREF(Py_None);
412 return Py_None;
Guido van Rossume5372401993-03-16 12:15:04 +0000413 }
414 if (n == 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000415 return do_mkvalue(&f, &lva);
416 return do_mktuple(&f, &lva, '\0', n);
417}
418
419
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420PyObject *
421PyEval_CallFunction(PyObject *obj, char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000422{
423 va_list vargs;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000424 PyObject *args;
425 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000426
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000427 va_start(vargs, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000428
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429 args = Py_VaBuildValue(format, vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000430 va_end(vargs);
431
432 if (args == NULL)
433 return NULL;
434
Guido van Rossum79f25d91997-04-29 20:08:16 +0000435 res = PyEval_CallObject(obj, args);
436 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000437
438 return res;
439}
440
441
Guido van Rossum79f25d91997-04-29 20:08:16 +0000442PyObject *
Guido van Rossumc4099e61998-08-08 20:51:26 +0000443PyEval_CallMethod(PyObject *obj, char *methodname, char *format, ...)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000444{
445 va_list vargs;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446 PyObject *meth;
447 PyObject *args;
448 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000449
Guido van Rossumc4099e61998-08-08 20:51:26 +0000450 meth = PyObject_GetAttrString(obj, methodname);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000451 if (meth == NULL)
452 return NULL;
453
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000454 va_start(vargs, format);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000455
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456 args = Py_VaBuildValue(format, vargs);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000457 va_end(vargs);
458
459 if (args == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 Py_DECREF(meth);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000461 return NULL;
462 }
463
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 res = PyEval_CallObject(meth, args);
465 Py_DECREF(meth);
466 Py_DECREF(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000467
468 return res;
Guido van Rossume5372401993-03-16 12:15:04 +0000469}