blob: f196095fff17c1a0d46de01f3945154ab1214f5f [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* Module support implementation */
26
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028#include "import.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000029
Guido van Rossum1d5735e1994-08-30 08:27:36 +000030#ifdef MPW /* MPW pushes 'extended' for float and double types with varargs */
31typedef extended va_double;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000032#else
Guido van Rossum1d5735e1994-08-30 08:27:36 +000033typedef double va_double;
34#endif
35
36
37/* initmodule2() has an additional parameter, 'passthrough', which is
38 passed as 'self' to functions defined in the module. This is used
39 e.g. by dynamically loaded modules on the Mac. */
40
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041object *
Guido van Rossum1d5735e1994-08-30 08:27:36 +000042initmodule2(name, methods, passthrough)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043 char *name;
44 struct methodlist *methods;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000045 object *passthrough;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000046{
47 object *m, *d, *v;
48 struct methodlist *ml;
Guido van Rossuma2b7f401993-01-04 09:09:59 +000049 char *namebuf;
Guido van Rossum3f5da241990-12-20 15:06:42 +000050 if ((m = add_module(name)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051 fprintf(stderr, "initializing module: %s\n", name);
52 fatal("can't create a module");
53 }
54 d = getmoduledict(m);
55 for (ml = methods; ml->ml_name != NULL; ml++) {
Guido van Rossuma2b7f401993-01-04 09:09:59 +000056 namebuf = NEW(char, strlen(name) + strlen(ml->ml_name) + 2);
57 if (namebuf == NULL)
58 fatal("out of mem for method name");
Guido van Rossum3f5da241990-12-20 15:06:42 +000059 sprintf(namebuf, "%s.%s", name, ml->ml_name);
Guido van Rossuma2b7f401993-01-04 09:09:59 +000060 v = newmethodobject(namebuf, ml->ml_meth,
Guido van Rossum6d023c91995-01-04 19:12:13 +000061 (object *)passthrough,
62 (ml->ml_varargs ? METH_VARARGS : 0) |
63 METH_FREENAME);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064 if (v == NULL || dictinsert(d, ml->ml_name, v) != 0) {
65 fprintf(stderr, "initializing module: %s\n", name);
66 fatal("can't initialize module");
67 }
68 DECREF(v);
69 }
Guido van Rossum3f5da241990-12-20 15:06:42 +000070 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071}
72
Guido van Rossum1d5735e1994-08-30 08:27:36 +000073/* The standard initmodule() passes NULL for 'self' */
74
75object *
76initmodule(name, methods)
77 char *name;
78 struct methodlist *methods;
79{
80 return initmodule2(name, methods, (object *)NULL);
81}
82
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000083
Guido van Rossumbf80e541993-02-08 15:49:17 +000084/* Helper for mkvalue() to scan the length of a format */
Guido van Rossumfc61adb1992-04-13 15:53:41 +000085
86static int countformat PROTO((char *format, int endchar));
87static int countformat(format, endchar)
88 char *format;
89 int endchar;
90{
91 int count = 0;
92 int level = 0;
93 while (level > 0 || *format != endchar) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +000094 switch (*format) {
95 case '\0':
Guido van Rossumfc61adb1992-04-13 15:53:41 +000096 /* Premature end */
97 err_setstr(SystemError, "unmatched paren in format");
98 return -1;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000099 case '(':
100 case '[':
101 case '{':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000102 if (level == 0)
103 count++;
104 level++;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000105 break;
106 case ')':
107 case ']':
108 case '}':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000109 level--;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000110 break;
111 case '#':
112 case ',':
113 case ':':
114 case ' ':
115 case '\t':
116 break;
117 default:
118 if (level == 0)
119 count++;
120 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000121 format++;
122 }
123 return count;
124}
125
126
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000127/* Generic function to create a value -- the inverse of getargs() */
128/* After an original idea and first implementation by Steven Miale */
129
130static object *do_mktuple PROTO((char**, va_list *, int, int));
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000131static object *do_mklist PROTO((char**, va_list *, int, int));
132static object *do_mkdict PROTO((char**, va_list *, int, int));
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000133static object *do_mkvalue PROTO((char**, va_list *));
134
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000135
136static object *
137do_mkdict(p_format, p_va, endchar, n)
138 char **p_format;
139 va_list *p_va;
140 int endchar;
141 int n;
142{
143 object *d;
144 int i;
145 if (n < 0)
146 return NULL;
147 if ((d = newdictobject()) == NULL)
148 return NULL;
149 for (i = 0; i < n; i+= 2) {
150 object *k, *v;
151 k = do_mkvalue(p_format, p_va);
152 if (k == NULL) {
153 DECREF(d);
154 return NULL;
155 }
156 v = do_mkvalue(p_format, p_va);
157 if (v == NULL) {
158 DECREF(k);
159 DECREF(d);
160 return NULL;
161 }
162 if (dict2insert(d, k, v) < 0) {
163 DECREF(k);
164 DECREF(v);
165 DECREF(d);
166 return NULL;
167 }
168 }
169 if (d != NULL && **p_format != endchar) {
170 DECREF(d);
171 d = NULL;
172 err_setstr(SystemError, "Unmatched paren in format");
173 }
174 else if (endchar)
175 ++*p_format;
176 return d;
177}
178
179static object *
180do_mklist(p_format, p_va, endchar, n)
181 char **p_format;
182 va_list *p_va;
183 int endchar;
184 int n;
185{
186 object *v;
187 int i;
188 if (n < 0)
189 return NULL;
190 if ((v = newlistobject(n)) == NULL)
191 return NULL;
192 for (i = 0; i < n; i++) {
193 object *w = do_mkvalue(p_format, p_va);
194 if (w == NULL) {
195 DECREF(v);
196 return NULL;
197 }
198 setlistitem(v, i, w);
199 }
200 if (v != NULL && **p_format != endchar) {
201 DECREF(v);
202 v = NULL;
203 err_setstr(SystemError, "Unmatched paren in format");
204 }
205 else if (endchar)
206 ++*p_format;
207 return v;
208}
209
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000210static object *
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000211do_mktuple(p_format, p_va, endchar, n)
212 char **p_format;
213 va_list *p_va;
214 int endchar;
215 int n;
216{
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000217 object *v;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000218 int i;
219 if (n < 0)
220 return NULL;
221 if ((v = newtupleobject(n)) == NULL)
222 return NULL;
223 for (i = 0; i < n; i++) {
224 object *w = do_mkvalue(p_format, p_va);
225 if (w == NULL) {
226 DECREF(v);
227 return NULL;
228 }
229 settupleitem(v, i, w);
230 }
231 if (v != NULL && **p_format != endchar) {
232 DECREF(v);
233 v = NULL;
234 err_setstr(SystemError, "Unmatched paren in format");
235 }
236 else if (endchar)
237 ++*p_format;
238 return v;
239}
240
241static object *
Guido van Rossum899dcf31992-05-15 11:04:59 +0000242do_mkvalue(p_format, p_va)
243 char **p_format;
244 va_list *p_va;
245{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000246 for (;;) {
247 switch (*(*p_format)++) {
248 case '(':
249 return do_mktuple(p_format, p_va, ')',
250 countformat(*p_format, ')'));
251
252 case '[':
253 return do_mklist(p_format, p_va, ']',
254 countformat(*p_format, ']'));
255
256 case '{':
257 return do_mkdict(p_format, p_va, '}',
258 countformat(*p_format, '}'));
259
260 case 'b':
261 case 'h':
262 case 'i':
263 return newintobject((long)va_arg(*p_va, int));
264
265 case 'l':
266 return newintobject((long)va_arg(*p_va, long));
267
268 case 'f':
269 case 'd':
270 return newfloatobject((double)va_arg(*p_va, double));
271
272 case 'c':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000273 {
274 char p[1];
275 p[0] = va_arg(*p_va, int);
276 return newsizedstringobject(p, 1);
277 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000278
279 case 's':
280 case 'z':
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000281 {
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000282 object *v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000283 char *str = va_arg(*p_va, char *);
284 int n;
285 if (**p_format == '#') {
286 ++*p_format;
287 n = va_arg(*p_va, int);
288 }
289 else
290 n = -1;
291 if (str == NULL) {
292 v = None;
293 INCREF(v);
294 }
295 else {
296 if (n < 0)
297 n = strlen(str);
298 v = newsizedstringobject(str, n);
299 }
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000300 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000301 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000302
303 case 'S':
304 case 'O':
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000305 {
306 object *v;
307 v = va_arg(*p_va, object *);
308 if (v != NULL)
309 INCREF(v);
310 else if (!err_occurred())
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000311 /* If a NULL was passed
312 * because a call that should
313 * have constructed a value
314 * failed, that's OK, and we
315 * pass the error on; but if
316 * no error occurred it's not
317 * clear that the caller knew
318 * what she was doing. */
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000319 err_setstr(SystemError,
320 "NULL object passed to mkvalue");
321 return v;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000322 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000323
324 case ':':
325 case ',':
326 case ' ':
327 case '\t':
328 break;
329
330 default:
331 err_setstr(SystemError,
332 "bad format char passed to mkvalue");
333 return NULL;
334
335 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000336 }
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000337}
338
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000339
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000340#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000341/* VARARGS 2 */
342object *mkvalue(char *format, ...)
343#else
344/* VARARGS */
345object *mkvalue(va_alist) va_dcl
346#endif
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000347{
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000348 va_list va;
349 object* retval;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000350#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000351 va_start(va, format);
352#else
353 char *format;
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000354 va_start(va);
355 format = va_arg(va, char *);
356#endif
Guido van Rossume5372401993-03-16 12:15:04 +0000357 retval = vmkvalue(format, va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000358 va_end(va);
Guido van Rossumfc61adb1992-04-13 15:53:41 +0000359 return retval;
Guido van Rossum3cfe6fa1992-04-13 10:48:55 +0000360}
Guido van Rossume5372401993-03-16 12:15:04 +0000361
362object *
363vmkvalue(format, va)
364 char *format;
365 va_list va;
366{
367 char *f = format;
368 int n = countformat(f, '\0');
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000369 va_list lva;
370
371#ifdef VA_LIST_IS_ARRAY
372 memcpy(lva, va, sizeof(va_list));
373#else
374 lva = va;
375#endif
376
Guido van Rossume5372401993-03-16 12:15:04 +0000377 if (n < 0)
378 return NULL;
379 if (n == 0) {
380 INCREF(None);
381 return None;
382 }
383 if (n == 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000384 return do_mkvalue(&f, &lva);
385 return do_mktuple(&f, &lva, '\0', n);
386}
387
388
389#ifdef HAVE_STDARG_PROTOTYPES
390object *
391PyEval_CallFunction(object *obj, char *format, ...)
392#else
393object *
394PyEval_CallFunction(obj, format, va_alist)
395 object *obj;
396 char *format;
397 va_dcl
398#endif
399{
400 va_list vargs;
401 object *args;
402 object *res;
403
404#ifdef HAVE_STDARG_PROTOTYPES
405 va_start(vargs, format);
406#else
407 va_start(vargs);
408#endif
409
410 args = vmkvalue(format, vargs);
411 va_end(vargs);
412
413 if (args == NULL)
414 return NULL;
415
416 res = call_object(obj, args);
417 DECREF(args);
418
419 return res;
420}
421
422
423#ifdef HAVE_STDARG_PROTOTYPES
424object *
425PyEval_CallMethod(object *obj, char *method, char *format, ...)
426#else
427object *
428PyEval_CallMethod(obj, method, format, va_alist)
429 object *obj;
430 char *method;
431 char *format;
432 va_dcl
433#endif
434{
435 va_list vargs;
436 object *meth;
437 object *args;
438 object *res;
439
440 meth = getattr(obj, method);
441 if (meth == NULL)
442 return NULL;
443
444#ifdef HAVE_STDARG_PROTOTYPES
445 va_start(vargs, format);
446#else
447 va_start(vargs);
448#endif
449
450 args = vmkvalue(format, vargs);
451 va_end(vargs);
452
453 if (args == NULL) {
454 DECREF(meth);
455 return NULL;
456 }
457
458 res = call_object(meth, args);
459 DECREF(meth);
460 DECREF(args);
461
462 return res;
Guido van Rossume5372401993-03-16 12:15:04 +0000463}