blob: c8a8e83c417cac6785d13b6f161288c3a0154b70 [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 Rossume77a7571993-11-03 15:01:26 +000070builtin_filter(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +000071 object *self;
72 object *args;
73{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +000074 object *func, *seq, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +000075 sequence_methods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +000076 int len;
77 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +000078
Guido van Rossumdc4b93d1993-10-27 14:56:44 +000079 if (!getargs(args, "(OO)", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +000080 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +000081
Guido van Rossum12d12c51993-10-26 17:58:25 +000082 if (is_stringobject(seq)) {
83 object *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +000084 return r;
85 }
86
Guido van Rossumdc4b93d1993-10-27 14:56:44 +000087 if (is_tupleobject(seq)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +000088 object *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +000089 return r;
90 }
91
Guido van Rossumdc4b93d1993-10-27 14:56:44 +000092 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +000093 err_setstr(TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +000094 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +000095 goto Fail_2;
96 }
97
98 if ((len = (*sqf->sq_length)(seq)) < 0)
99 goto Fail_2;
100
101 if (is_listobject(seq) && seq->ob_refcnt == 1) {
102 INCREF(seq);
103 result = seq;
104 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000105 else {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000106 if ((result = newlistobject(len)) == NULL)
107 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000108 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000109
110 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000111 object *item, *good;
112 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000113
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000114 if ((item = (*sqf->sq_item)(seq, i)) == NULL)
115 goto Fail_1;
116
117 if (func == None) {
118 good = item;
119 }
120 else {
121 object *arg = mkvalue("(O)", item);
122 DECREF(item);
123 if (arg == NULL)
124 goto Fail_1;
125 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000126 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000127 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000128 goto Fail_1;
129 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000130 ok = testbool(good);
131 DECREF(good);
132 if (ok) {
133 INCREF(item);
134 if (setlistitem(result, j++, item) < 0)
135 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000136 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000137 }
138
Guido van Rossum12d12c51993-10-26 17:58:25 +0000139
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000140 if (setlistslice(result, j, len, NULL) < 0)
141 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000142
Guido van Rossum12d12c51993-10-26 17:58:25 +0000143 return result;
144
Guido van Rossum12d12c51993-10-26 17:58:25 +0000145Fail_1:
146 DECREF(result);
147Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000148 return NULL;
149}
150
151static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000152builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000153 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000154 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000155{
156 long x;
157 char s[1];
Guido van Rossum94390a41992-08-14 15:14:30 +0000158 if (!getargs(args, "l", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000159 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000160 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000161 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000162 return NULL;
163 }
164 s[0] = x;
165 return newsizedstringobject(s, 1);
166}
167
168static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000169builtin_cmp(self, args)
170 object *self;
171 object *args;
172{
173 object *a, *b;
174 if (!getargs(args, "(OO)", &a, &b))
175 return NULL;
176 return newintobject((long)cmpobject(a, b));
177}
178
179static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000180builtin_coerce(self, args)
181 object *self;
182 object *args;
183{
184 object *v, *w;
185 object *res;
186
187 if (!getargs(args, "(OO)", &v, &w))
188 return NULL;
189 if (coerce(&v, &w) < 0)
190 return NULL;
191 res = mkvalue("(OO)", v, w);
192 DECREF(v);
193 DECREF(w);
194 return res;
195}
196
197static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000198builtin_compile(self, args)
199 object *self;
200 object *args;
201{
202 char *str;
203 char *filename;
204 char *startstr;
205 int start;
206 if (!getargs(args, "(sss)", &str, &filename, &startstr))
207 return NULL;
208 if (strcmp(startstr, "exec") == 0)
209 start = file_input;
210 else if (strcmp(startstr, "eval") == 0)
211 start = eval_input;
212 else {
213 err_setstr(ValueError,
214 "compile() mode must be 'exec' or 'eval'");
215 return NULL;
216 }
217 return compile_string(str, filename, start);
218}
219
220static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000221builtin_dir(self, v)
222 object *self;
223 object *v;
224{
225 object *d;
226 if (v == NULL) {
227 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000228 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000229 }
230 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000231 d = getattr(v, "__dict__");
232 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000233 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000234 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000235 return NULL;
236 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000237 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000238 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000239 v = getdictkeys(d);
240 if (sortlist(v) != 0) {
241 DECREF(v);
242 v = NULL;
243 }
244 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000245 else {
246 v = newlistobject(0);
247 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000248 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000249 return v;
250}
251
252static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000253builtin_divmod(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000254 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000255 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000256{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000257 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000258 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000259 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000260 if (v->ob_type->tp_as_number == NULL ||
261 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000262 err_setstr(TypeError, "divmod() requires numeric arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000263 return NULL;
264 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000265 if (coerce(&v, &w) != 0)
266 return NULL;
267 x = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
268 DECREF(v);
269 DECREF(w);
270 return x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000271}
272
273static object *
274exec_eval(v, start)
275 object *v;
276 int start;
277{
278 object *str = NULL, *globals = NULL, *locals = NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000279 char *s;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000280 int n;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000281 /* XXX This is a bit of a mess. Should make it varargs */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000282 if (v != NULL) {
Guido van Rossum5b722181993-03-30 17:46:03 +0000283 if (is_tupleobject(v) &&
Guido van Rossum3f5da241990-12-20 15:06:42 +0000284 ((n = gettuplesize(v)) == 2 || n == 3)) {
285 str = gettupleitem(v, 0);
286 globals = gettupleitem(v, 1);
287 if (n == 3)
288 locals = gettupleitem(v, 2);
289 }
Guido van Rossum5b722181993-03-30 17:46:03 +0000290 else
291 str = v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000292 }
Guido van Rossum5b722181993-03-30 17:46:03 +0000293 if (str == NULL || (!is_stringobject(str) && !is_codeobject(str)) ||
Guido van Rossum3f5da241990-12-20 15:06:42 +0000294 globals != NULL && !is_dictobject(globals) ||
295 locals != NULL && !is_dictobject(locals)) {
296 err_setstr(TypeError,
Guido van Rossum590baa41993-11-30 13:40:46 +0000297 "eval arguments must be (string|code)[,dict[,dict]]");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000298 return NULL;
299 }
Guido van Rossum590baa41993-11-30 13:40:46 +0000300
Guido van Rossum5b722181993-03-30 17:46:03 +0000301 if (is_codeobject(str))
302 return eval_code((codeobject *) str, globals, locals,
Guido van Rossum81daa321993-05-20 14:24:46 +0000303 (object *)NULL, (object *)NULL);
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000304 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000305 if (strlen(s) != getstringsize(str)) {
306 err_setstr(ValueError, "embedded '\\0' in string arg");
307 return NULL;
308 }
Guido van Rossum590baa41993-11-30 13:40:46 +0000309 if (start == eval_input) {
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000310 while (*s == ' ' || *s == '\t')
311 s++;
312 }
313 return run_string(s, start, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000314}
315
316static object *
317builtin_eval(self, v)
318 object *self;
319 object *v;
320{
321 return exec_eval(v, eval_input);
322}
323
324static object *
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000325builtin_execfile(self, v)
326 object *self;
327 object *v;
328{
329 object *str = NULL, *globals = NULL, *locals = NULL, *w;
330 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000331 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000332 int n;
333 if (v != NULL) {
334 if (is_stringobject(v))
335 str = v;
336 else if (is_tupleobject(v) &&
337 ((n = gettuplesize(v)) == 2 || n == 3)) {
338 str = gettupleitem(v, 0);
339 globals = gettupleitem(v, 1);
340 if (n == 3)
341 locals = gettupleitem(v, 2);
342 }
343 }
344 if (str == NULL || !is_stringobject(str) ||
345 globals != NULL && !is_dictobject(globals) ||
346 locals != NULL && !is_dictobject(locals)) {
347 err_setstr(TypeError,
348 "execfile arguments must be filename[,dict[,dict]]");
349 return NULL;
350 }
Guido van Rossum2b81dc91992-08-19 16:40:53 +0000351 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000352 if (strlen(s) != getstringsize(str)) {
353 err_setstr(ValueError, "embedded '\\0' in string arg");
354 return NULL;
355 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000356 BGN_SAVE
Guido van Rossum94390a41992-08-14 15:14:30 +0000357 fp = fopen(s, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000358 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000359 if (fp == NULL) {
360 err_setstr(IOError, "execfile cannot open the file argument");
361 return NULL;
362 }
363 w = run_file(fp, getstringvalue(str), file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000364 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000365 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000366 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000367 return w;
368}
369
370static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000371builtin_float(self, v)
372 object *self;
373 object *v;
374{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000375 number_methods *nb;
376
377 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
378 nb->nb_float == NULL) {
379 err_setstr(TypeError,
380 "float() argument can't be converted to float");
381 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000382 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000383 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000384}
385
386static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000387builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000388 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000389 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000390{
Guido van Rossum94390a41992-08-14 15:14:30 +0000391 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000392 object *name;
393 if (!getargs(args, "(OS)", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000394 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000395 return getattro(v, name);
396}
397
398static object *
399builtin_hasattr(self, args)
400 object *self;
401 object *args;
402{
403 object *v;
404 object *name;
405 if (!getargs(args, "(OS)", &v, &name))
406 return NULL;
407 v = getattro(v, name);
408 if (v == NULL) {
409 err_clear();
410 return newintobject(0L);
411 }
412 DECREF(v);
413 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000414}
415
416static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000417builtin_id(self, args)
418 object *self;
419 object *args;
420{
421 object *v;
422 if (!getargs(args, "O", &v))
423 return NULL;
424 return newintobject((long)v);
425}
426
427static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000428builtin_map(self, args)
429 object *self;
430 object *args;
431{
432 typedef struct {
433 object *seq;
434 sequence_methods *sqf;
435 int len;
436 } sequence;
437
438 object *func, *result;
439 sequence *seqs = NULL, *sqp;
440 int n, len, newfunc = 0;
441 register int i, j;
442
443 if (args == NULL || !is_tupleobject(args)) {
444 err_setstr(TypeError, "map() requires at least two args");
445 return NULL;
446 }
447
448 func = gettupleitem(args, 0);
449 n = gettuplesize(args) - 1;
450
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000451 if ((seqs = NEW(sequence, n)) == NULL) {
452 err_nomem();
453 goto Fail_2;
454 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000455
456 for (len = -1, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
457 int curlen;
458
459 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
460 goto Fail_2;
461
462 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
463 static char errmsg[] =
464 "argument %d to map() must be a sequence object";
465 char errbuf[sizeof(errmsg) + 3];
466
467 sprintf(errbuf, errmsg, i+2);
468 err_setstr(TypeError, errbuf);
469 goto Fail_2;
470 }
471
472 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
473 goto Fail_2;
474
475 if (curlen > len)
476 len = curlen;
477 }
478
479 if ((result = (object *) newlistobject(len)) == NULL)
480 goto Fail_2;
481
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000482 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000483 for (i = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000484 object *arglist, *item;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000485
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000486 if ((arglist = newtupleobject(n)) == NULL)
487 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000488
489 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
490 if (i >= sqp->len) {
491 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000492 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000493 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000494 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000495 item = (*sqp->sqf->sq_item)(sqp->seq, i);
496 if (item == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000497 goto Fail_0;
498
Guido van Rossum12d12c51993-10-26 17:58:25 +0000499 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000500 if (settupleitem(arglist, j, item) < 0)
501 goto Fail_0;
502 continue;
503
504 Fail_0:
505 DECREF(arglist);
506 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000507 }
508
509 if (func == None) {
510 if (n == 1) { /* avoid creating singleton */
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000511 INCREF(item); /* This is arglist[0] !!! */
512 DECREF(arglist);
513 if (setlistitem(result, i, item) < 0)
514 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000515 }
516 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000517 if (setlistitem(result, i, arglist) < 0)
518 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000519 }
520 }
521 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000522 object *value = call_object(func, arglist);
523 DECREF(arglist);
524 if (value == NULL)
525 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000526 if (setlistitem((object *) result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000527 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000528 }
529 }
530
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000531 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000532 return result;
533
Guido van Rossum12d12c51993-10-26 17:58:25 +0000534Fail_1:
535 DECREF(result);
536Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000537 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000538 return NULL;
539}
540
541static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000542builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000543 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000544 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000545{
Guido van Rossum94390a41992-08-14 15:14:30 +0000546 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000547 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000548 object *value;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000549 if (!getargs(args, "(OSO)", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000550 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000551 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000552 return NULL;
553 INCREF(None);
554 return None;
555}
556
557static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000558builtin_hash(self, args)
559 object *self;
560 object *args;
561{
562 object *v;
563 long x;
564 if (!getargs(args, "O", &v))
565 return NULL;
566 x = hashobject(v);
567 if (x == -1)
568 return NULL;
569 return newintobject(x);
570}
571
572static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000573builtin_hex(self, v)
574 object *self;
575 object *v;
576{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000577 number_methods *nb;
578
579 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
580 nb->nb_hex == NULL) {
581 err_setstr(TypeError,
582 "hex() argument can't be converted to hex");
583 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000584 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000585 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000586}
587
Guido van Rossum3165fe61992-09-25 21:59:05 +0000588static object *builtin_raw_input PROTO((object *, object *));
589
Guido van Rossum006bcd41991-10-24 14:54:44 +0000590static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000591builtin_input(self, v)
592 object *self;
593 object *v;
594{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000595 object *line = builtin_raw_input(self, v);
596 if (line == NULL)
597 return line;
598 v = exec_eval(line, eval_input);
599 DECREF(line);
600 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000601}
602
603static object *
604builtin_int(self, v)
605 object *self;
606 object *v;
607{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000608 number_methods *nb;
609
610 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
611 nb->nb_int == NULL) {
612 err_setstr(TypeError,
613 "int() argument can't be converted to int");
614 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000615 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000616 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000617}
618
619static object *
620builtin_len(self, v)
621 object *self;
622 object *v;
623{
624 long len;
625 typeobject *tp;
626 if (v == NULL) {
627 err_setstr(TypeError, "len() without argument");
628 return NULL;
629 }
630 tp = v->ob_type;
631 if (tp->tp_as_sequence != NULL) {
632 len = (*tp->tp_as_sequence->sq_length)(v);
633 }
634 else if (tp->tp_as_mapping != NULL) {
635 len = (*tp->tp_as_mapping->mp_length)(v);
636 }
637 else {
638 err_setstr(TypeError, "len() of unsized object");
639 return NULL;
640 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000641 if (len < 0)
642 return NULL;
643 else
644 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000645}
646
647static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000648builtin_long(self, v)
649 object *self;
650 object *v;
651{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000652 number_methods *nb;
653
654 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
655 nb->nb_long == NULL) {
656 err_setstr(TypeError,
657 "long() argument can't be converted to long");
658 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000659 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000660 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000661}
662
663static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000664min_max(v, sign)
665 object *v;
666 int sign;
667{
668 int i, n, cmp;
669 object *w, *x;
670 sequence_methods *sq;
671 if (v == NULL) {
672 err_setstr(TypeError, "min() or max() without argument");
673 return NULL;
674 }
675 sq = v->ob_type->tp_as_sequence;
676 if (sq == NULL) {
677 err_setstr(TypeError, "min() or max() of non-sequence");
678 return NULL;
679 }
680 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000681 if (n < 0)
682 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000683 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000684 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000685 return NULL;
686 }
687 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
688 for (i = 1; i < n; i++) {
689 x = (*sq->sq_item)(v, i); /* Implies INCREF */
690 cmp = cmpobject(x, w);
691 if (cmp * sign > 0) {
692 DECREF(w);
693 w = x;
694 }
695 else
696 DECREF(x);
697 }
698 return w;
699}
700
701static object *
702builtin_min(self, v)
703 object *self;
704 object *v;
705{
706 return min_max(v, -1);
707}
708
709static object *
710builtin_max(self, v)
711 object *self;
712 object *v;
713{
714 return min_max(v, 1);
715}
716
717static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000718builtin_oct(self, v)
719 object *self;
720 object *v;
721{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000722 number_methods *nb;
723
724 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
725 nb->nb_oct == NULL) {
726 err_setstr(TypeError,
727 "oct() argument can't be converted to oct");
728 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000729 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000730 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000731}
732
733static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000734builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000735 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000736 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000737{
Guido van Rossum94390a41992-08-14 15:14:30 +0000738 char *name, *mode;
739 if (!getargs(args, "(ss)", &name, &mode))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000740 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000741 return newfileobject(name, mode);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000742}
743
744static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000745builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000746 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000747 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000748{
Guido van Rossum94390a41992-08-14 15:14:30 +0000749 char *s;
750 int len;
751 if (!getargs(args, "s#", &s, &len))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000752 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000753 if (len != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000754 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000755 return NULL;
756 }
Guido van Rossum94390a41992-08-14 15:14:30 +0000757 return newintobject((long)(s[0] & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000758}
759
760static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000761builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000762 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000763 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000764{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000765 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000766 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossumd4905451991-05-05 20:00:36 +0000767 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000768 if (v->ob_type->tp_as_number == NULL ||
769 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000770 err_setstr(TypeError, "pow() requires numeric arguments");
771 return NULL;
772 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000773 if (coerce(&v, &w) != 0)
774 return NULL;
775 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
776 DECREF(v);
777 DECREF(w);
778 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000779}
780
781static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000782builtin_range(self, v)
783 object *self;
784 object *v;
785{
786 static char *errmsg = "range() requires 1-3 int arguments";
787 int i, n;
788 long ilow, ihigh, istep;
789 if (v != NULL && is_intobject(v)) {
790 ilow = 0; ihigh = getintvalue(v); istep = 1;
791 }
792 else if (v == NULL || !is_tupleobject(v)) {
793 err_setstr(TypeError, errmsg);
794 return NULL;
795 }
796 else {
797 n = gettuplesize(v);
798 if (n < 1 || n > 3) {
799 err_setstr(TypeError, errmsg);
800 return NULL;
801 }
802 for (i = 0; i < n; i++) {
803 if (!is_intobject(gettupleitem(v, i))) {
804 err_setstr(TypeError, errmsg);
805 return NULL;
806 }
807 }
808 if (n == 3) {
809 istep = getintvalue(gettupleitem(v, 2));
810 --n;
811 }
812 else
813 istep = 1;
814 ihigh = getintvalue(gettupleitem(v, --n));
815 if (n > 0)
816 ilow = getintvalue(gettupleitem(v, 0));
817 else
818 ilow = 0;
819 }
820 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000821 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000822 return NULL;
823 }
824 /* XXX ought to check overflow of subtraction */
825 if (istep > 0)
826 n = (ihigh - ilow + istep - 1) / istep;
827 else
828 n = (ihigh - ilow + istep + 1) / istep;
829 if (n < 0)
830 n = 0;
831 v = newlistobject(n);
832 if (v == NULL)
833 return NULL;
834 for (i = 0; i < n; i++) {
835 object *w = newintobject(ilow);
836 if (w == NULL) {
837 DECREF(v);
838 return NULL;
839 }
840 setlistitem(v, i, w);
841 ilow += istep;
842 }
843 return v;
844}
845
846static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000847builtin_xrange(self, v)
848 object *self;
849 object *v;
850{
851 static char *errmsg = "xrange() requires 1-3 int arguments";
852 int i, n;
853 long start, stop, step, len;
854 if (v != NULL && is_intobject(v))
855 start = 0, stop = getintvalue(v), step = 1;
856
857 else if (v == NULL || !is_tupleobject(v)) {
858 err_setstr(TypeError, errmsg);
859 return NULL;
860 }
861 else {
862 n = gettuplesize(v);
863 if (n < 1 || n > 3) {
864 err_setstr(TypeError, errmsg);
865 return NULL;
866 }
867 for (i = 0; i < n; i++) {
868 if (!is_intobject(gettupleitem(v, i))) {
869 err_setstr(TypeError, errmsg);
870 return NULL;
871 }
872 }
873 if (n == 3) {
874 step = getintvalue(gettupleitem(v, 2));
875 --n;
876 }
877 else
878 step = 1;
879 stop = getintvalue(gettupleitem(v, --n));
880 if (n > 0)
881 start = getintvalue(gettupleitem(v, 0));
882 else
883 start = 0;
884 }
885
886 if (step == 0) {
887 err_setstr(ValueError, "zero step for xrange()");
888 return NULL;
889 }
890
891 len = (stop - start + step + ((step > 0) ? -1 : 1)) / step;
892 if (len < 0)
893 len = 0;
894
Guido van Rossum7d6aa511993-12-21 22:50:31 +0000895 return newrangeobject(start, len, step, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000896}
897
898static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000899builtin_raw_input(self, v)
900 object *self;
901 object *v;
902{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000903 object *f = sysget("stdout");
904 if (f == NULL) {
905 err_setstr(RuntimeError, "lost sys.stdout");
906 return NULL;
907 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000908 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000909 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000910 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +0000911 return NULL;
912 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000913 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000914}
915
916static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000917builtin_reduce(self, args)
918 object *self;
919 object *args;
920{
921 object *seq, *func, *result;
922 sequence_methods *sqf;
923 static char reduce_err[] = "reduce() requires 2 or 3 args";
924 register int i;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000925 int start = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000926 int len;
927
928 if (args == NULL || !is_tupleobject(args)) {
929 err_setstr(TypeError, reduce_err);
930 return NULL;
931 }
932
933 switch (gettuplesize(args)) {
934 case 2:
935 start = 1; /* fall through */
936 case 3:
937 func = gettupleitem(args, 0);
938 seq = gettupleitem(args, 1);
939 break;
940 default:
941 err_setstr(TypeError, reduce_err);
942 }
943
944 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
945 err_setstr(TypeError,
946 "2nd argument to reduce() must be a sequence object");
947 return NULL;
948 }
949
Guido van Rossum12d12c51993-10-26 17:58:25 +0000950 if ((len = (*sqf->sq_length)(seq)) < 0)
951 goto Fail_2;
952
953 if (start == 1) {
954 if (len == 0) {
955 err_setstr(TypeError,
956 "reduce of empty sequence with no initial value");
957 goto Fail_2;
958 }
959
960 if ((result = (*sqf->sq_item)(seq, 0)) == NULL)
961 goto Fail_2;
962 }
963 else {
964 result = gettupleitem(args, 2);
965 INCREF(result);
966 }
967
968 if ((args = newtupleobject(2)) == NULL)
969 goto Fail_1;
970
971 for (i = start; i < len; ++i) {
972 object *op2;
973
974 if (args->ob_refcnt > 1) {
975 DECREF(args);
976 if ((args = newtupleobject(2)) == NULL)
977 goto Fail_1;
978 }
979
980 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL)
981 goto Fail_2;
982
983 settupleitem(args, 0, result);
984 settupleitem(args, 1, op2);
985 if ((result = call_object(func, args)) == NULL)
986 goto Fail_0;
987 }
988
989 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000990
991 return result;
992
Guido van Rossum12d12c51993-10-26 17:58:25 +0000993Fail_0:
994 DECREF(args);
995 goto Fail_2;
996Fail_1:
997 DECREF(result);
998Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000999 return NULL;
1000}
1001
1002static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001003builtin_reload(self, v)
1004 object *self;
1005 object *v;
1006{
1007 return reload_module(v);
1008}
1009
1010static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +00001011builtin_repr(self, v)
1012 object *self;
1013 object *v;
1014{
1015 if (v == NULL) {
1016 err_badarg();
1017 return NULL;
1018 }
1019 return reprobject(v);
1020}
1021
1022static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001023builtin_round(self, args)
1024 object *self;
1025 object *args;
1026{
1027 extern double floor PROTO((double));
1028 extern double ceil PROTO((double));
1029 double x;
1030 double f;
1031 int ndigits = 0;
1032 int sign = 1;
1033 int i;
1034 if (!getargs(args, "d", &x)) {
1035 err_clear();
1036 if (!getargs(args, "(di)", &x, &ndigits))
1037 return NULL;
1038 }
1039 f = 1.0;
1040 for (i = ndigits; --i >= 0; )
1041 f = f*10.0;
1042 for (i = ndigits; ++i <= 0; )
1043 f = f*0.1;
1044 if (x >= 0.0)
1045 return newfloatobject(floor(x*f + 0.5) / f);
1046 else
1047 return newfloatobject(ceil(x*f - 0.5) / f);
1048}
1049
1050static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +00001051builtin_str(self, v)
1052 object *self;
1053 object *v;
1054{
1055 if (v == NULL) {
1056 err_badarg();
1057 return NULL;
1058 }
Guido van Rossumc6004111993-11-05 10:22:19 +00001059 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001060}
1061
1062static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001063builtin_type(self, v)
1064 object *self;
1065 object *v;
1066{
1067 if (v == NULL) {
Guido van Rossumc89705d1992-11-26 08:54:07 +00001068 err_setstr(TypeError, "type() requires an argument");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001069 return NULL;
1070 }
1071 v = (object *)v->ob_type;
1072 INCREF(v);
1073 return v;
1074}
1075
1076static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001077 {"abs", builtin_abs},
1078 {"apply", builtin_apply},
1079 {"chr", builtin_chr},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001080 {"cmp", builtin_cmp},
Guido van Rossum04691fc1992-08-12 15:35:34 +00001081 {"coerce", builtin_coerce},
Guido van Rossum5b722181993-03-30 17:46:03 +00001082 {"compile", builtin_compile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001083 {"dir", builtin_dir},
1084 {"divmod", builtin_divmod},
1085 {"eval", builtin_eval},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +00001086 {"execfile", builtin_execfile},
Guido van Rossume77a7571993-11-03 15:01:26 +00001087 {"filter", builtin_filter},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001088 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +00001089 {"getattr", builtin_getattr},
Guido van Rossum9bfef441993-03-29 10:43:31 +00001090 {"hasattr", builtin_hasattr},
1091 {"hash", builtin_hash},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001092 {"hex", builtin_hex},
Guido van Rossum5b722181993-03-30 17:46:03 +00001093 {"id", builtin_id},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001094 {"input", builtin_input},
1095 {"int", builtin_int},
1096 {"len", builtin_len},
1097 {"long", builtin_long},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001098 {"map", builtin_map},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001099 {"max", builtin_max},
1100 {"min", builtin_min},
1101 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +00001102 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001103 {"ord", builtin_ord},
1104 {"pow", builtin_pow},
1105 {"range", builtin_range},
1106 {"raw_input", builtin_raw_input},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001107 {"reduce", builtin_reduce},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001108 {"reload", builtin_reload},
Guido van Rossumc89705d1992-11-26 08:54:07 +00001109 {"repr", builtin_repr},
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001110 {"round", builtin_round},
Guido van Rossum33894be1992-01-27 16:53:09 +00001111 {"setattr", builtin_setattr},
Guido van Rossumc89705d1992-11-26 08:54:07 +00001112 {"str", builtin_str},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001113 {"type", builtin_type},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001114 {"xrange", builtin_xrange},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001115 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001116};
1117
1118static object *builtin_dict;
1119
1120object *
1121getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +00001122 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001123{
Guido van Rossuma57fb011991-08-16 08:54:58 +00001124 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001125}
1126
1127/* Predefined exceptions */
1128
Guido van Rossum25831651993-05-19 14:50:45 +00001129object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001130object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001131object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001132object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001133object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001134object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001135object *IndexError;
1136object *KeyError;
1137object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001138object *MemoryError;
1139object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001140object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001141object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001142object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001143object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001144object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001145object *TypeError;
1146object *ValueError;
1147object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001148
Guido van Rossum3f5da241990-12-20 15:06:42 +00001149static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001150newstdexception(name)
1151 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001152{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001153 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001154 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1155 fatal("no mem for new standard exception");
1156 return v;
1157}
1158
1159static void
1160initerrors()
1161{
Guido van Rossum25831651993-05-19 14:50:45 +00001162 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001163 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001164 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001165 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001166 IOError = newstdexception("IOError");
1167 ImportError = newstdexception("ImportError");
1168 IndexError = newstdexception("IndexError");
1169 KeyError = newstdexception("KeyError");
1170 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001171 MemoryError = newstdexception("MemoryError");
1172 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001173 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001174 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001175 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001176 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001177 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001178 TypeError = newstdexception("TypeError");
1179 ValueError = newstdexception("ValueError");
1180 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001181}
1182
1183void
1184initbuiltin()
1185{
1186 object *m;
Guido van Rossum89b33251993-10-22 14:26:06 +00001187 m = initmodule("__builtin__", builtin_methods);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001188 builtin_dict = getmoduledict(m);
1189 INCREF(builtin_dict);
1190 initerrors();
1191 (void) dictinsert(builtin_dict, "None", None);
1192}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001193
1194/* Coerce two numeric types to the "larger" one.
1195 Increment the reference count on each argument.
1196 Return -1 and raise an exception if no coercion is possible
1197 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +00001198*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001199
1200int
1201coerce(pv, pw)
1202 object **pv, **pw;
1203{
1204 register object *v = *pv;
1205 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001206 int res;
1207
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001208 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001209 INCREF(v);
1210 INCREF(w);
1211 return 0;
1212 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001213 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
1214 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
1215 if (res <= 0)
1216 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001217 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001218 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
1219 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
1220 if (res <= 0)
1221 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001222 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001223 err_setstr(TypeError, "number coercion failed");
1224 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001225}
Guido van Rossum12d12c51993-10-26 17:58:25 +00001226
1227
Guido van Rossume77a7571993-11-03 15:01:26 +00001228/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001229
1230static object *
1231filtertuple(func, tuple)
1232 object *func;
1233 object *tuple;
1234{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001235 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001236 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001237 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001238
Guido van Rossum2586bf01993-11-01 16:21:44 +00001239 if ((result = newtupleobject(len)) == NULL)
1240 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001241
Guido van Rossum12d12c51993-10-26 17:58:25 +00001242 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001243 object *item, *good;
1244 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001245
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001246 if ((item = gettupleitem(tuple, i)) == NULL)
1247 goto Fail_1;
1248 if (func == None) {
1249 INCREF(item);
1250 good = item;
1251 }
1252 else {
1253 object *arg = mkvalue("(O)", item);
1254 if (arg == NULL)
1255 goto Fail_1;
1256 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001257 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001258 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001259 goto Fail_1;
1260 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001261 ok = testbool(good);
1262 DECREF(good);
1263 if (ok) {
1264 INCREF(item);
1265 if (settupleitem(result, j++, item) < 0)
1266 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001267 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001268 }
1269
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001270 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001271 return NULL;
1272
Guido van Rossum12d12c51993-10-26 17:58:25 +00001273 return result;
1274
Guido van Rossum12d12c51993-10-26 17:58:25 +00001275Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001276 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001277 return NULL;
1278}
1279
1280
Guido van Rossume77a7571993-11-03 15:01:26 +00001281/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001282
1283static object *
1284filterstring(func, strobj)
1285 object *func;
1286 object *strobj;
1287{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001288 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001289 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001290 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001291
Guido van Rossum2586bf01993-11-01 16:21:44 +00001292 if (func == None) {
1293 /* No character is ever false -- share input string */
1294 INCREF(result);
1295 return result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001296 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001297 if ((result = newsizedstringobject(NULL, len)) == NULL)
1298 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001299
Guido van Rossum12d12c51993-10-26 17:58:25 +00001300 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001301 object *item, *arg, *good;
1302 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001303
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001304 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1305 if (item == NULL)
1306 goto Fail_1;
1307 arg = mkvalue("(O)", item);
1308 DECREF(item);
1309 if (arg == NULL)
1310 goto Fail_1;
1311 good = call_object(func, arg);
1312 DECREF(arg);
1313 if (good == NULL)
1314 goto Fail_1;
1315 ok = testbool(good);
1316 DECREF(good);
1317 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001318 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001319 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001320 }
1321
Guido van Rossum12d12c51993-10-26 17:58:25 +00001322 if (resizestring(&result, j) < 0)
1323 return NULL;
1324
Guido van Rossum12d12c51993-10-26 17:58:25 +00001325 return result;
1326
Guido van Rossum12d12c51993-10-26 17:58:25 +00001327Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001328 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001329 return NULL;
1330}