blob: b95c351ba08eefaafa93717e9d7cb5c8cfc54cf2 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossume5372401993-03-16 12:15:04 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, The 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 Rossum3f5da241990-12-20 15:06:42 +000025/* Built-in functions */
26
27#include "allobjects.h"
28
29#include "node.h"
30#include "graminit.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000031#include "sysmodule.h"
Guido van Rossum86cd6e61991-01-21 15:12:35 +000032#include "bltinmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000033#include "import.h"
34#include "pythonrun.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035#include "ceval.h"
36#include "modsupport.h"
Guido van Rossum5b722181993-03-30 17:46:03 +000037#include "compile.h"
38#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000039
Guido van Rossum12d12c51993-10-26 17:58:25 +000040/* Forward */
41static object *filterstring PROTO((object *, object *));
42static object *filtertuple PROTO((object *, object *));
43static object *exec_eval PROTO((object *v, int start));
44
Guido van Rossum3f5da241990-12-20 15:06:42 +000045static object *
46builtin_abs(self, v)
47 object *self;
48 object *v;
49{
Guido van Rossumd4905451991-05-05 20:00:36 +000050 number_methods *nm;
51 if (v == NULL || (nm = v->ob_type->tp_as_number) == NULL) {
52 err_setstr(TypeError, "abs() requires numeric argument");
53 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000054 }
Guido van Rossumd4905451991-05-05 20:00:36 +000055 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000056}
57
58static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000059builtin_apply(self, args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000060 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000061 object *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000062{
Guido van Rossum94390a41992-08-14 15:14:30 +000063 object *func, *arglist;
64 if (!getargs(args, "(OO)", &func, &arglist))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000065 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +000066 return call_object(func, arglist);
Guido van Rossumc02e15c1991-12-16 13:03:00 +000067}
68
69static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +000070builtin_bagof(self, args)
71 object *self;
72 object *args;
73{
74 object *func, *seq, *arg, *result;
75 sequence_methods *sqf;
76 int len, newfunc = 0;
77 register int i,j;
78 static char bagof_err[] = "bagof() requires 1 or 2 args";
79
80 if (args == NULL) {
81 err_setstr(TypeError, bagof_err);
82 return NULL;
83 }
84
85 if (is_tupleobject(args)) {
86 if (gettuplesize(args) != 2) {
87 err_setstr(TypeError, bagof_err);
88 return NULL;
89 }
90
91 func = gettupleitem(args, 0);
92 seq = gettupleitem(args, 1);
93
94 if (is_stringobject(func)) {
95 if ((func = exec_eval(func, lambda_input)) == NULL)
96 return NULL;
97 newfunc = 1;
98 }
99 }
100 else {
101 func = None;
102 seq = args;
103 }
104
105 /* check for special cases; strings and tuples are returned as same */
106 if (is_stringobject(seq)) {
107 object *r = filterstring(func, seq);
108 if (newfunc)
109 DECREF(func);
110 return r;
111 }
112
113 else if (is_tupleobject(seq)) {
114 object *r = filtertuple(func, seq);
115 if (newfunc)
116 DECREF(func);
117 return r;
118 }
119
120 if (! (sqf = seq->ob_type->tp_as_sequence)) {
121 err_setstr(TypeError,
122 "argument to bagof() must be a sequence type");
123 goto Fail_2;
124 }
125
126 if ((len = (*sqf->sq_length)(seq)) < 0)
127 goto Fail_2;
128
129 if (is_listobject(seq) && seq->ob_refcnt == 1) {
130 INCREF(seq);
131 result = seq;
132 }
133 else
134 if ((result = newlistobject(len)) == NULL)
135 goto Fail_2;
136
137 if ((arg = newtupleobject(1)) == NULL)
138 goto Fail_1;
139
140 for (i = j = 0; i < len; ++i) {
141 object *ele, *value;
142
143 if (arg->ob_refcnt > 1) {
144 DECREF(arg);
145 if ((arg = newtupleobject(1)) == NULL)
146 goto Fail_1;
147 }
148
149 if ((ele = (*sqf->sq_item)(seq, i)) == NULL)
150 goto Fail_0;
151
152 if (func == None)
153 value = ele;
154 else {
155 if (settupleitem(arg, 0, ele) < 0)
156 goto Fail_0;
157
158 if ((value = call_object(func, arg)) == NULL)
159 goto Fail_0;
160 }
161
162 if (testbool(value)) {
163 INCREF(ele);
164 if (setlistitem(result, j++, ele) < 0)
165 goto Fail_0;
166 }
167
168 DECREF(value);
169 }
170
171 /* list_ass_slice() expects the rest of the list to be non-null */
172 for (i = j; i < len; ++i) {
173 INCREF(None);
174 if (setlistitem(result, i, None) < 0)
175 goto Fail_0;
176 }
177
178 DECREF(arg);
179 if (newfunc)
180 DECREF(func);
181
182 (*result->ob_type->tp_as_sequence->sq_ass_slice)(result, j, len, NULL);
183 return result;
184
185Fail_0:
186 DECREF(arg);
187Fail_1:
188 DECREF(result);
189Fail_2:
190 if (newfunc)
191 DECREF(func);
192 return NULL;
193}
194
195static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000196builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000197 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000198 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000199{
200 long x;
201 char s[1];
Guido van Rossum94390a41992-08-14 15:14:30 +0000202 if (!getargs(args, "l", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000203 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000204 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000205 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000206 return NULL;
207 }
208 s[0] = x;
209 return newsizedstringobject(s, 1);
210}
211
212static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000213builtin_cmp(self, args)
214 object *self;
215 object *args;
216{
217 object *a, *b;
218 if (!getargs(args, "(OO)", &a, &b))
219 return NULL;
220 return newintobject((long)cmpobject(a, b));
221}
222
223static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000224builtin_coerce(self, args)
225 object *self;
226 object *args;
227{
228 object *v, *w;
229 object *res;
230
231 if (!getargs(args, "(OO)", &v, &w))
232 return NULL;
233 if (coerce(&v, &w) < 0)
234 return NULL;
235 res = mkvalue("(OO)", v, w);
236 DECREF(v);
237 DECREF(w);
238 return res;
239}
240
241static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000242builtin_compile(self, args)
243 object *self;
244 object *args;
245{
246 char *str;
247 char *filename;
248 char *startstr;
249 int start;
250 if (!getargs(args, "(sss)", &str, &filename, &startstr))
251 return NULL;
252 if (strcmp(startstr, "exec") == 0)
253 start = file_input;
254 else if (strcmp(startstr, "eval") == 0)
255 start = eval_input;
256 else {
257 err_setstr(ValueError,
258 "compile() mode must be 'exec' or 'eval'");
259 return NULL;
260 }
261 return compile_string(str, filename, start);
262}
263
264static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000265builtin_dir(self, v)
266 object *self;
267 object *v;
268{
269 object *d;
270 if (v == NULL) {
271 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000272 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000273 }
274 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000275 d = getattr(v, "__dict__");
276 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000277 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000278 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000279 return NULL;
280 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000281 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000282 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000283 v = getdictkeys(d);
284 if (sortlist(v) != 0) {
285 DECREF(v);
286 v = NULL;
287 }
288 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000289 else {
290 v = newlistobject(0);
291 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000292 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000293 return v;
294}
295
296static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000297builtin_divmod(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000298 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000299 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000300{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000301 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000302 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000303 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000304 if (v->ob_type->tp_as_number == NULL ||
305 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000306 err_setstr(TypeError, "divmod() requires numeric arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000307 return NULL;
308 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000309 if (coerce(&v, &w) != 0)
310 return NULL;
311 x = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
312 DECREF(v);
313 DECREF(w);
314 return x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000315}
316
317static object *
318exec_eval(v, start)
319 object *v;
320 int start;
321{
322 object *str = NULL, *globals = NULL, *locals = NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000323 char *s;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000324 int n;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000325 /* XXX This is a bit of a mess. Should make it varargs */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000326 if (v != NULL) {
Guido van Rossum5b722181993-03-30 17:46:03 +0000327 if (is_tupleobject(v) &&
Guido van Rossum3f5da241990-12-20 15:06:42 +0000328 ((n = gettuplesize(v)) == 2 || n == 3)) {
329 str = gettupleitem(v, 0);
330 globals = gettupleitem(v, 1);
331 if (n == 3)
332 locals = gettupleitem(v, 2);
333 }
Guido van Rossum5b722181993-03-30 17:46:03 +0000334 else
335 str = v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000336 }
Guido van Rossum5b722181993-03-30 17:46:03 +0000337 if (str == NULL || (!is_stringobject(str) && !is_codeobject(str)) ||
Guido van Rossum3f5da241990-12-20 15:06:42 +0000338 globals != NULL && !is_dictobject(globals) ||
339 locals != NULL && !is_dictobject(locals)) {
340 err_setstr(TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +0000341 "eval/lambda arguments must be (string|code)[,dict[,dict]]");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000342 return NULL;
343 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000344 /* XXX The following is only correct for eval(), not for lambda() */
Guido van Rossum5b722181993-03-30 17:46:03 +0000345 if (is_codeobject(str))
346 return eval_code((codeobject *) str, globals, locals,
Guido van Rossum81daa321993-05-20 14:24:46 +0000347 (object *)NULL, (object *)NULL);
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000348 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000349 if (strlen(s) != getstringsize(str)) {
350 err_setstr(ValueError, "embedded '\\0' in string arg");
351 return NULL;
352 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000353 if (start == eval_input || start == lambda_input) {
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000354 while (*s == ' ' || *s == '\t')
355 s++;
356 }
357 return run_string(s, start, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000358}
359
360static object *
361builtin_eval(self, v)
362 object *self;
363 object *v;
364{
365 return exec_eval(v, eval_input);
366}
367
368static object *
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000369builtin_execfile(self, v)
370 object *self;
371 object *v;
372{
373 object *str = NULL, *globals = NULL, *locals = NULL, *w;
374 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000375 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000376 int n;
377 if (v != NULL) {
378 if (is_stringobject(v))
379 str = v;
380 else if (is_tupleobject(v) &&
381 ((n = gettuplesize(v)) == 2 || n == 3)) {
382 str = gettupleitem(v, 0);
383 globals = gettupleitem(v, 1);
384 if (n == 3)
385 locals = gettupleitem(v, 2);
386 }
387 }
388 if (str == NULL || !is_stringobject(str) ||
389 globals != NULL && !is_dictobject(globals) ||
390 locals != NULL && !is_dictobject(locals)) {
391 err_setstr(TypeError,
392 "execfile arguments must be filename[,dict[,dict]]");
393 return NULL;
394 }
Guido van Rossum2b81dc91992-08-19 16:40:53 +0000395 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000396 if (strlen(s) != getstringsize(str)) {
397 err_setstr(ValueError, "embedded '\\0' in string arg");
398 return NULL;
399 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000400 BGN_SAVE
Guido van Rossum94390a41992-08-14 15:14:30 +0000401 fp = fopen(s, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000402 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000403 if (fp == NULL) {
404 err_setstr(IOError, "execfile cannot open the file argument");
405 return NULL;
406 }
407 w = run_file(fp, getstringvalue(str), file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000408 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000409 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000410 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000411 return w;
412}
413
414static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000415builtin_float(self, v)
416 object *self;
417 object *v;
418{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000419 number_methods *nb;
420
421 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
422 nb->nb_float == NULL) {
423 err_setstr(TypeError,
424 "float() argument can't be converted to float");
425 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000426 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000427 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000428}
429
430static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000431builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000432 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000433 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000434{
Guido van Rossum94390a41992-08-14 15:14:30 +0000435 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000436 object *name;
437 if (!getargs(args, "(OS)", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000438 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000439 return getattro(v, name);
440}
441
442static object *
443builtin_hasattr(self, args)
444 object *self;
445 object *args;
446{
447 object *v;
448 object *name;
449 if (!getargs(args, "(OS)", &v, &name))
450 return NULL;
451 v = getattro(v, name);
452 if (v == NULL) {
453 err_clear();
454 return newintobject(0L);
455 }
456 DECREF(v);
457 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000458}
459
460static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000461builtin_id(self, args)
462 object *self;
463 object *args;
464{
465 object *v;
466 if (!getargs(args, "O", &v))
467 return NULL;
468 return newintobject((long)v);
469}
470
471static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000472builtin_map(self, args)
473 object *self;
474 object *args;
475{
476 typedef struct {
477 object *seq;
478 sequence_methods *sqf;
479 int len;
480 } sequence;
481
482 object *func, *result;
483 sequence *seqs = NULL, *sqp;
484 int n, len, newfunc = 0;
485 register int i, j;
486
487 if (args == NULL || !is_tupleobject(args)) {
488 err_setstr(TypeError, "map() requires at least two args");
489 return NULL;
490 }
491
492 func = gettupleitem(args, 0);
493 n = gettuplesize(args) - 1;
494
495 if (is_stringobject(func)) {
496 if ((func = exec_eval(func, lambda_input)) == NULL)
497 return NULL;
498 newfunc = 1;
499 }
500
501 if ((seqs = (sequence *) malloc(n * sizeof(sequence))) == NULL)
502 return err_nomem();
503
504 for (len = -1, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
505 int curlen;
506
507 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
508 goto Fail_2;
509
510 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
511 static char errmsg[] =
512 "argument %d to map() must be a sequence object";
513 char errbuf[sizeof(errmsg) + 3];
514
515 sprintf(errbuf, errmsg, i+2);
516 err_setstr(TypeError, errbuf);
517 goto Fail_2;
518 }
519
520 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
521 goto Fail_2;
522
523 if (curlen > len)
524 len = curlen;
525 }
526
527 if ((result = (object *) newlistobject(len)) == NULL)
528 goto Fail_2;
529
530 if ((args = newtupleobject(n)) == NULL)
531 goto Fail_1;
532
533 for (i = 0; i < len; ++i) {
534 object *arg, *value;
535
536 if (args->ob_refcnt > 1) {
537 DECREF(args);
538 if ((args = newtupleobject(n)) == NULL)
539 goto Fail_1;
540 }
541
542 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
543 if (i >= sqp->len) {
544 INCREF(None);
545 if (settupleitem(args, j, None) < 0)
546 goto Fail_0;
547 arg = None;
548 }
549
550 else {
551 if ((arg = (*sqp->sqf->sq_item)(sqp->seq, i)) == NULL)
552 goto Fail_0;
553
554 if (settupleitem(args, j, arg) < 0)
555 goto Fail_0;
556 }
557 }
558
559 if (func == None) {
560 if (n == 1) { /* avoid creating singleton */
561 INCREF(arg);
562 if (setlistitem(result, i, arg) < 0)
563 goto Fail_0;
564 }
565 else {
566 INCREF(args);
567 if (setlistitem(result, i, args) < 0)
568 goto Fail_0;
569 }
570 }
571 else {
572 if ((value = call_object(func, args)) == NULL)
573 goto Fail_0;
574
575 if (setlistitem((object *) result, i, value) < 0)
576 goto Fail_0;
577 }
578 }
579
580 if (seqs) free(seqs);
581
582 DECREF(args);
583 if (newfunc)
584 DECREF(func);
585
586 return result;
587
588Fail_0:
589 DECREF(args);
590Fail_1:
591 DECREF(result);
592Fail_2:
593 if (newfunc)
594 DECREF(func);
595
596 if (seqs) free(seqs);
597
598 return NULL;
599}
600
601static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000602builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000603 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000604 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000605{
Guido van Rossum94390a41992-08-14 15:14:30 +0000606 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000607 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000608 object *value;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000609 if (!getargs(args, "(OSO)", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000610 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000611 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000612 return NULL;
613 INCREF(None);
614 return None;
615}
616
617static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000618builtin_hash(self, args)
619 object *self;
620 object *args;
621{
622 object *v;
623 long x;
624 if (!getargs(args, "O", &v))
625 return NULL;
626 x = hashobject(v);
627 if (x == -1)
628 return NULL;
629 return newintobject(x);
630}
631
632static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000633builtin_hex(self, v)
634 object *self;
635 object *v;
636{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000637 number_methods *nb;
638
639 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
640 nb->nb_hex == NULL) {
641 err_setstr(TypeError,
642 "hex() argument can't be converted to hex");
643 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000644 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000645 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000646}
647
Guido van Rossum3165fe61992-09-25 21:59:05 +0000648static object *builtin_raw_input PROTO((object *, object *));
649
Guido van Rossum006bcd41991-10-24 14:54:44 +0000650static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000651builtin_input(self, v)
652 object *self;
653 object *v;
654{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000655 object *line = builtin_raw_input(self, v);
656 if (line == NULL)
657 return line;
658 v = exec_eval(line, eval_input);
659 DECREF(line);
660 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000661}
662
663static object *
664builtin_int(self, v)
665 object *self;
666 object *v;
667{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000668 number_methods *nb;
669
670 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
671 nb->nb_int == NULL) {
672 err_setstr(TypeError,
673 "int() argument can't be converted to int");
674 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000675 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000676 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000677}
678
679static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000680builtin_lambda(self, v)
681 object *self;
682 object *v;
683{
684 return exec_eval(v, lambda_input);
685}
686
687static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000688builtin_len(self, v)
689 object *self;
690 object *v;
691{
692 long len;
693 typeobject *tp;
694 if (v == NULL) {
695 err_setstr(TypeError, "len() without argument");
696 return NULL;
697 }
698 tp = v->ob_type;
699 if (tp->tp_as_sequence != NULL) {
700 len = (*tp->tp_as_sequence->sq_length)(v);
701 }
702 else if (tp->tp_as_mapping != NULL) {
703 len = (*tp->tp_as_mapping->mp_length)(v);
704 }
705 else {
706 err_setstr(TypeError, "len() of unsized object");
707 return NULL;
708 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000709 if (len < 0)
710 return NULL;
711 else
712 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000713}
714
715static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000716builtin_long(self, v)
717 object *self;
718 object *v;
719{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000720 number_methods *nb;
721
722 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
723 nb->nb_long == NULL) {
724 err_setstr(TypeError,
725 "long() argument can't be converted to long");
726 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000727 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000728 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000729}
730
731static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000732min_max(v, sign)
733 object *v;
734 int sign;
735{
736 int i, n, cmp;
737 object *w, *x;
738 sequence_methods *sq;
739 if (v == NULL) {
740 err_setstr(TypeError, "min() or max() without argument");
741 return NULL;
742 }
743 sq = v->ob_type->tp_as_sequence;
744 if (sq == NULL) {
745 err_setstr(TypeError, "min() or max() of non-sequence");
746 return NULL;
747 }
748 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000749 if (n < 0)
750 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000751 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000752 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000753 return NULL;
754 }
755 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
756 for (i = 1; i < n; i++) {
757 x = (*sq->sq_item)(v, i); /* Implies INCREF */
758 cmp = cmpobject(x, w);
759 if (cmp * sign > 0) {
760 DECREF(w);
761 w = x;
762 }
763 else
764 DECREF(x);
765 }
766 return w;
767}
768
769static object *
770builtin_min(self, v)
771 object *self;
772 object *v;
773{
774 return min_max(v, -1);
775}
776
777static object *
778builtin_max(self, v)
779 object *self;
780 object *v;
781{
782 return min_max(v, 1);
783}
784
785static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000786builtin_oct(self, v)
787 object *self;
788 object *v;
789{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000790 number_methods *nb;
791
792 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
793 nb->nb_oct == NULL) {
794 err_setstr(TypeError,
795 "oct() argument can't be converted to oct");
796 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000797 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000798 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000799}
800
801static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000802builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000803 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000804 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000805{
Guido van Rossum94390a41992-08-14 15:14:30 +0000806 char *name, *mode;
807 if (!getargs(args, "(ss)", &name, &mode))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000808 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000809 return newfileobject(name, mode);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000810}
811
812static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000813builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000814 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000815 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000816{
Guido van Rossum94390a41992-08-14 15:14:30 +0000817 char *s;
818 int len;
819 if (!getargs(args, "s#", &s, &len))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000820 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000821 if (len != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000822 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000823 return NULL;
824 }
Guido van Rossum94390a41992-08-14 15:14:30 +0000825 return newintobject((long)(s[0] & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000826}
827
828static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000829builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000830 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000831 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000832{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000833 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000834 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossumd4905451991-05-05 20:00:36 +0000835 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000836 if (v->ob_type->tp_as_number == NULL ||
837 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000838 err_setstr(TypeError, "pow() requires numeric arguments");
839 return NULL;
840 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000841 if (coerce(&v, &w) != 0)
842 return NULL;
843 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
844 DECREF(v);
845 DECREF(w);
846 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000847}
848
849static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000850builtin_range(self, v)
851 object *self;
852 object *v;
853{
854 static char *errmsg = "range() requires 1-3 int arguments";
855 int i, n;
856 long ilow, ihigh, istep;
857 if (v != NULL && is_intobject(v)) {
858 ilow = 0; ihigh = getintvalue(v); istep = 1;
859 }
860 else if (v == NULL || !is_tupleobject(v)) {
861 err_setstr(TypeError, errmsg);
862 return NULL;
863 }
864 else {
865 n = gettuplesize(v);
866 if (n < 1 || n > 3) {
867 err_setstr(TypeError, errmsg);
868 return NULL;
869 }
870 for (i = 0; i < n; i++) {
871 if (!is_intobject(gettupleitem(v, i))) {
872 err_setstr(TypeError, errmsg);
873 return NULL;
874 }
875 }
876 if (n == 3) {
877 istep = getintvalue(gettupleitem(v, 2));
878 --n;
879 }
880 else
881 istep = 1;
882 ihigh = getintvalue(gettupleitem(v, --n));
883 if (n > 0)
884 ilow = getintvalue(gettupleitem(v, 0));
885 else
886 ilow = 0;
887 }
888 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000889 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000890 return NULL;
891 }
892 /* XXX ought to check overflow of subtraction */
893 if (istep > 0)
894 n = (ihigh - ilow + istep - 1) / istep;
895 else
896 n = (ihigh - ilow + istep + 1) / istep;
897 if (n < 0)
898 n = 0;
899 v = newlistobject(n);
900 if (v == NULL)
901 return NULL;
902 for (i = 0; i < n; i++) {
903 object *w = newintobject(ilow);
904 if (w == NULL) {
905 DECREF(v);
906 return NULL;
907 }
908 setlistitem(v, i, w);
909 ilow += istep;
910 }
911 return v;
912}
913
914static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000915builtin_xrange(self, v)
916 object *self;
917 object *v;
918{
919 static char *errmsg = "xrange() requires 1-3 int arguments";
920 int i, n;
921 long start, stop, step, len;
922 if (v != NULL && is_intobject(v))
923 start = 0, stop = getintvalue(v), step = 1;
924
925 else if (v == NULL || !is_tupleobject(v)) {
926 err_setstr(TypeError, errmsg);
927 return NULL;
928 }
929 else {
930 n = gettuplesize(v);
931 if (n < 1 || n > 3) {
932 err_setstr(TypeError, errmsg);
933 return NULL;
934 }
935 for (i = 0; i < n; i++) {
936 if (!is_intobject(gettupleitem(v, i))) {
937 err_setstr(TypeError, errmsg);
938 return NULL;
939 }
940 }
941 if (n == 3) {
942 step = getintvalue(gettupleitem(v, 2));
943 --n;
944 }
945 else
946 step = 1;
947 stop = getintvalue(gettupleitem(v, --n));
948 if (n > 0)
949 start = getintvalue(gettupleitem(v, 0));
950 else
951 start = 0;
952 }
953
954 if (step == 0) {
955 err_setstr(ValueError, "zero step for xrange()");
956 return NULL;
957 }
958
959 len = (stop - start + step + ((step > 0) ? -1 : 1)) / step;
960 if (len < 0)
961 len = 0;
962
963 return newrangeobject(start, len, step, 1);
964}
965
966static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000967builtin_raw_input(self, v)
968 object *self;
969 object *v;
970{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000971 object *f = sysget("stdout");
972 if (f == NULL) {
973 err_setstr(RuntimeError, "lost sys.stdout");
974 return NULL;
975 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000976 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000977 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000978 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +0000979 return NULL;
980 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000981 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000982}
983
984static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000985builtin_reduce(self, args)
986 object *self;
987 object *args;
988{
989 object *seq, *func, *result;
990 sequence_methods *sqf;
991 static char reduce_err[] = "reduce() requires 2 or 3 args";
992 register int i;
993 int start = 0, newfunc = 0;
994 int len;
995
996 if (args == NULL || !is_tupleobject(args)) {
997 err_setstr(TypeError, reduce_err);
998 return NULL;
999 }
1000
1001 switch (gettuplesize(args)) {
1002 case 2:
1003 start = 1; /* fall through */
1004 case 3:
1005 func = gettupleitem(args, 0);
1006 seq = gettupleitem(args, 1);
1007 break;
1008 default:
1009 err_setstr(TypeError, reduce_err);
1010 }
1011
1012 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1013 err_setstr(TypeError,
1014 "2nd argument to reduce() must be a sequence object");
1015 return NULL;
1016 }
1017
1018 if (is_stringobject(func)) {
1019 if ((func = exec_eval(func, lambda_input)) == NULL)
1020 return NULL;
1021 newfunc = 1;
1022 }
1023
1024 if ((len = (*sqf->sq_length)(seq)) < 0)
1025 goto Fail_2;
1026
1027 if (start == 1) {
1028 if (len == 0) {
1029 err_setstr(TypeError,
1030 "reduce of empty sequence with no initial value");
1031 goto Fail_2;
1032 }
1033
1034 if ((result = (*sqf->sq_item)(seq, 0)) == NULL)
1035 goto Fail_2;
1036 }
1037 else {
1038 result = gettupleitem(args, 2);
1039 INCREF(result);
1040 }
1041
1042 if ((args = newtupleobject(2)) == NULL)
1043 goto Fail_1;
1044
1045 for (i = start; i < len; ++i) {
1046 object *op2;
1047
1048 if (args->ob_refcnt > 1) {
1049 DECREF(args);
1050 if ((args = newtupleobject(2)) == NULL)
1051 goto Fail_1;
1052 }
1053
1054 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL)
1055 goto Fail_2;
1056
1057 settupleitem(args, 0, result);
1058 settupleitem(args, 1, op2);
1059 if ((result = call_object(func, args)) == NULL)
1060 goto Fail_0;
1061 }
1062
1063 DECREF(args);
1064 if (newfunc)
1065 DECREF(func);
1066
1067 return result;
1068
1069 /* XXX I hate goto's. I hate goto's. I hate goto's. I hate goto's. */
1070Fail_0:
1071 DECREF(args);
1072 goto Fail_2;
1073Fail_1:
1074 DECREF(result);
1075Fail_2:
1076 if (newfunc)
1077 DECREF(func);
1078 return NULL;
1079}
1080
1081static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001082builtin_reload(self, v)
1083 object *self;
1084 object *v;
1085{
1086 return reload_module(v);
1087}
1088
1089static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +00001090builtin_repr(self, v)
1091 object *self;
1092 object *v;
1093{
1094 if (v == NULL) {
1095 err_badarg();
1096 return NULL;
1097 }
1098 return reprobject(v);
1099}
1100
1101static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001102builtin_round(self, args)
1103 object *self;
1104 object *args;
1105{
1106 extern double floor PROTO((double));
1107 extern double ceil PROTO((double));
1108 double x;
1109 double f;
1110 int ndigits = 0;
1111 int sign = 1;
1112 int i;
1113 if (!getargs(args, "d", &x)) {
1114 err_clear();
1115 if (!getargs(args, "(di)", &x, &ndigits))
1116 return NULL;
1117 }
1118 f = 1.0;
1119 for (i = ndigits; --i >= 0; )
1120 f = f*10.0;
1121 for (i = ndigits; ++i <= 0; )
1122 f = f*0.1;
1123 if (x >= 0.0)
1124 return newfloatobject(floor(x*f + 0.5) / f);
1125 else
1126 return newfloatobject(ceil(x*f - 0.5) / f);
1127}
1128
1129static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +00001130builtin_str(self, v)
1131 object *self;
1132 object *v;
1133{
1134 if (v == NULL) {
1135 err_badarg();
1136 return NULL;
1137 }
1138 if (is_stringobject(v)) {
1139 INCREF(v);
1140 return v;
1141 }
1142 else
1143 return reprobject(v);
1144}
1145
1146static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001147builtin_type(self, v)
1148 object *self;
1149 object *v;
1150{
1151 if (v == NULL) {
Guido van Rossumc89705d1992-11-26 08:54:07 +00001152 err_setstr(TypeError, "type() requires an argument");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001153 return NULL;
1154 }
1155 v = (object *)v->ob_type;
1156 INCREF(v);
1157 return v;
1158}
1159
1160static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001161 {"abs", builtin_abs},
1162 {"apply", builtin_apply},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001163 {"bagof", builtin_bagof},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001164 {"chr", builtin_chr},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001165 {"cmp", builtin_cmp},
Guido van Rossum04691fc1992-08-12 15:35:34 +00001166 {"coerce", builtin_coerce},
Guido van Rossum5b722181993-03-30 17:46:03 +00001167 {"compile", builtin_compile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001168 {"dir", builtin_dir},
1169 {"divmod", builtin_divmod},
1170 {"eval", builtin_eval},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +00001171 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001172 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +00001173 {"getattr", builtin_getattr},
Guido van Rossum9bfef441993-03-29 10:43:31 +00001174 {"hasattr", builtin_hasattr},
1175 {"hash", builtin_hash},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001176 {"hex", builtin_hex},
Guido van Rossum5b722181993-03-30 17:46:03 +00001177 {"id", builtin_id},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001178 {"input", builtin_input},
1179 {"int", builtin_int},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001180 {"lambda", builtin_lambda},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001181 {"len", builtin_len},
1182 {"long", builtin_long},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001183 {"map", builtin_map},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001184 {"max", builtin_max},
1185 {"min", builtin_min},
1186 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +00001187 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001188 {"ord", builtin_ord},
1189 {"pow", builtin_pow},
1190 {"range", builtin_range},
1191 {"raw_input", builtin_raw_input},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001192 {"reduce", builtin_reduce},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001193 {"reload", builtin_reload},
Guido van Rossumc89705d1992-11-26 08:54:07 +00001194 {"repr", builtin_repr},
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001195 {"round", builtin_round},
Guido van Rossum33894be1992-01-27 16:53:09 +00001196 {"setattr", builtin_setattr},
Guido van Rossumc89705d1992-11-26 08:54:07 +00001197 {"str", builtin_str},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001198 {"type", builtin_type},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001199 {"xrange", builtin_xrange},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001200 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001201};
1202
1203static object *builtin_dict;
1204
1205object *
1206getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +00001207 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001208{
Guido van Rossuma57fb011991-08-16 08:54:58 +00001209 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001210}
1211
1212/* Predefined exceptions */
1213
Guido van Rossum25831651993-05-19 14:50:45 +00001214object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001215object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001216object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001217object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001218object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001219object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001220object *IndexError;
1221object *KeyError;
1222object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001223object *MemoryError;
1224object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001225object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001226object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001227object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001228object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001229object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001230object *TypeError;
1231object *ValueError;
1232object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001233
Guido van Rossum3f5da241990-12-20 15:06:42 +00001234static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001235newstdexception(name)
1236 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001237{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001238 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001239 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1240 fatal("no mem for new standard exception");
1241 return v;
1242}
1243
1244static void
1245initerrors()
1246{
Guido van Rossum25831651993-05-19 14:50:45 +00001247 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001248 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001249 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001250 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001251 IOError = newstdexception("IOError");
1252 ImportError = newstdexception("ImportError");
1253 IndexError = newstdexception("IndexError");
1254 KeyError = newstdexception("KeyError");
1255 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001256 MemoryError = newstdexception("MemoryError");
1257 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001258 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001259 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001260 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001261 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001262 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001263 TypeError = newstdexception("TypeError");
1264 ValueError = newstdexception("ValueError");
1265 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001266}
1267
1268void
1269initbuiltin()
1270{
1271 object *m;
Guido van Rossum89b33251993-10-22 14:26:06 +00001272 m = initmodule("__builtin__", builtin_methods);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001273 builtin_dict = getmoduledict(m);
1274 INCREF(builtin_dict);
1275 initerrors();
1276 (void) dictinsert(builtin_dict, "None", None);
1277}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001278
1279/* Coerce two numeric types to the "larger" one.
1280 Increment the reference count on each argument.
1281 Return -1 and raise an exception if no coercion is possible
1282 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +00001283*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001284
1285int
1286coerce(pv, pw)
1287 object **pv, **pw;
1288{
1289 register object *v = *pv;
1290 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001291 int res;
1292
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001293 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001294 INCREF(v);
1295 INCREF(w);
1296 return 0;
1297 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001298 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
1299 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
1300 if (res <= 0)
1301 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001302 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001303 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
1304 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
1305 if (res <= 0)
1306 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001307 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001308 err_setstr(TypeError, "number coercion failed");
1309 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001310}
Guido van Rossum12d12c51993-10-26 17:58:25 +00001311
1312
1313/* Filter a tuple through a function */
1314
1315static object *
1316filtertuple(func, tuple)
1317 object *func;
1318 object *tuple;
1319{
1320 object *arg, *result;
1321 register int i, j;
1322 int len = gettuplesize(tuple), shared = 0;
1323
1324 if (tuple->ob_refcnt == 1) {
1325 result = tuple;
1326 shared = 1;
1327 /* defer INCREF (resizetuple wants it to be one) */
1328 }
1329 else
1330 if ((result = newtupleobject(len)) == NULL)
1331 return NULL;
1332
1333 if ((arg = newtupleobject(1)) == NULL)
1334 goto Fail_1;
1335
1336 for (i = j = 0; i < len; ++i) {
1337 object *ele, *value;
1338
1339 if (arg->ob_refcnt > 1) {
1340 DECREF(arg);
1341 if ((arg = newtupleobject(1)) == NULL)
1342 goto Fail_1;
1343 }
1344
1345 if ((ele = gettupleitem(tuple, i)) == NULL)
1346 goto Fail_0;
1347 INCREF(ele);
1348
1349 if (func == None)
1350 value = ele;
1351 else {
1352 if (settupleitem(arg, 0, ele) < 0)
1353 goto Fail_0;
1354
1355 if ((value = call_object(func, arg)) == NULL)
1356 goto Fail_0;
1357 }
1358
1359 if (testbool(value)) {
1360 INCREF(ele);
1361 if (settupleitem(result, j++, ele) < 0)
1362 goto Fail_0;
1363 }
1364
1365 DECREF(value);
1366 }
1367
1368 DECREF(arg);
1369 if (resizetuple(&result, j) < 0)
1370 return NULL;
1371
1372 if (shared)
1373 INCREF(result);
1374
1375 return result;
1376
1377Fail_0:
1378 DECREF(arg);
1379Fail_1:
1380 if (!shared)
1381 DECREF(result);
1382 return NULL;
1383}
1384
1385
1386/* Filter a string through a function */
1387
1388static object *
1389filterstring(func, strobj)
1390 object *func;
1391 object *strobj;
1392{
1393 object *arg, *result;
1394 register int i, j;
1395 int len = getstringsize(strobj), shared = 0;
1396
1397 if (strobj->ob_refcnt == 1) {
1398 result = strobj;
1399 shared = 1;
1400 /* defer INCREF (resizestring wants it to be one) */
1401
1402 if (func == None) {
1403 INCREF(result);
1404 return result;
1405 }
1406 }
1407 else {
1408 if ((result = newsizedstringobject(NULL, len)) == NULL)
1409 return NULL;
1410
1411 if (func == None) {
1412 strcpy(GETSTRINGVALUE((stringobject *)result),
1413 GETSTRINGVALUE((stringobject *)strobj));
1414 return result;
1415 }
1416 }
1417
1418 if ((arg = newtupleobject(1)) == NULL)
1419 goto Fail_1;
1420
1421 for (i = j = 0; i < len; ++i) {
1422 object *ele, *value;
1423
1424 if (arg->ob_refcnt > 1) {
1425 DECREF(arg);
1426 if ((arg = newtupleobject(1)) == NULL)
1427 goto Fail_1;
1428 }
1429
1430 if ((ele = (*strobj->ob_type->tp_as_sequence->sq_item)
1431 (strobj, i)) == NULL)
1432 goto Fail_0;
1433
1434 if (settupleitem(arg, 0, ele) < 0)
1435 goto Fail_0;
1436
1437 if ((value = call_object(func, arg)) == NULL)
1438 goto Fail_0;
1439
1440 if (testbool(value))
1441 GETSTRINGVALUE((stringobject *)result)[j++] =
1442 GETSTRINGVALUE((stringobject *)ele)[0];
1443
1444 DECREF(value);
1445 }
1446
1447 DECREF(arg);
1448 if (resizestring(&result, j) < 0)
1449 return NULL;
1450
1451 if (shared)
1452 INCREF(result);
1453
1454 return result;
1455
1456Fail_0:
1457 DECREF(arg);
1458Fail_1:
1459 if (!shared)
1460 DECREF(result);
1461 return NULL;
1462}