blob: 51830693714b15ce172da46c7dc1f1b37ca3cefb [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{
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 Rossumdc4b93d1993-10-27 14:56:44 +000082 if (is_stringobject(func)) {
83 if ((func = exec_eval(func, lambda_input)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +000084 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +000085 }
86 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +000087 INCREF(func);
Guido van Rossum12d12c51993-10-26 17:58:25 +000088 }
89
Guido van Rossum12d12c51993-10-26 17:58:25 +000090 if (is_stringobject(seq)) {
91 object *r = filterstring(func, seq);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +000092 DECREF(func);
Guido van Rossum12d12c51993-10-26 17:58:25 +000093 return r;
94 }
95
Guido van Rossumdc4b93d1993-10-27 14:56:44 +000096 if (is_tupleobject(seq)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +000097 object *r = filtertuple(func, seq);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +000098 DECREF(func);
Guido van Rossum12d12c51993-10-26 17:58:25 +000099 return r;
100 }
101
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000102 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000103 err_setstr(TypeError,
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000104 "argument 2 to bagof() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000105 goto Fail_2;
106 }
107
108 if ((len = (*sqf->sq_length)(seq)) < 0)
109 goto Fail_2;
110
111 if (is_listobject(seq) && seq->ob_refcnt == 1) {
112 INCREF(seq);
113 result = seq;
114 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000115 else {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000116 if ((result = newlistobject(len)) == NULL)
117 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000118 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000119
120 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000121 object *item, *good;
122 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000123
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000124 if ((item = (*sqf->sq_item)(seq, i)) == NULL)
125 goto Fail_1;
126
127 if (func == None) {
128 good = item;
129 }
130 else {
131 object *arg = mkvalue("(O)", item);
132 DECREF(item);
133 if (arg == NULL)
134 goto Fail_1;
135 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000136 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000137 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000138 goto Fail_1;
139 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000140 ok = testbool(good);
141 DECREF(good);
142 if (ok) {
143 INCREF(item);
144 if (setlistitem(result, j++, item) < 0)
145 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000146 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000147 }
148
Guido van Rossum12d12c51993-10-26 17:58:25 +0000149
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000150 if (setlistslice(result, j, len, NULL) < 0)
151 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000152
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000153 DECREF(func);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000154 return result;
155
Guido van Rossum12d12c51993-10-26 17:58:25 +0000156Fail_1:
157 DECREF(result);
158Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000159 DECREF(func);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000160 return NULL;
161}
162
163static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000164builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000165 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000166 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000167{
168 long x;
169 char s[1];
Guido van Rossum94390a41992-08-14 15:14:30 +0000170 if (!getargs(args, "l", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000171 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000172 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000173 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000174 return NULL;
175 }
176 s[0] = x;
177 return newsizedstringobject(s, 1);
178}
179
180static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000181builtin_cmp(self, args)
182 object *self;
183 object *args;
184{
185 object *a, *b;
186 if (!getargs(args, "(OO)", &a, &b))
187 return NULL;
188 return newintobject((long)cmpobject(a, b));
189}
190
191static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000192builtin_coerce(self, args)
193 object *self;
194 object *args;
195{
196 object *v, *w;
197 object *res;
198
199 if (!getargs(args, "(OO)", &v, &w))
200 return NULL;
201 if (coerce(&v, &w) < 0)
202 return NULL;
203 res = mkvalue("(OO)", v, w);
204 DECREF(v);
205 DECREF(w);
206 return res;
207}
208
209static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000210builtin_compile(self, args)
211 object *self;
212 object *args;
213{
214 char *str;
215 char *filename;
216 char *startstr;
217 int start;
218 if (!getargs(args, "(sss)", &str, &filename, &startstr))
219 return NULL;
220 if (strcmp(startstr, "exec") == 0)
221 start = file_input;
222 else if (strcmp(startstr, "eval") == 0)
223 start = eval_input;
224 else {
225 err_setstr(ValueError,
226 "compile() mode must be 'exec' or 'eval'");
227 return NULL;
228 }
229 return compile_string(str, filename, start);
230}
231
232static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000233builtin_dir(self, v)
234 object *self;
235 object *v;
236{
237 object *d;
238 if (v == NULL) {
239 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000240 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000241 }
242 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000243 d = getattr(v, "__dict__");
244 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000245 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000246 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000247 return NULL;
248 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000249 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000250 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000251 v = getdictkeys(d);
252 if (sortlist(v) != 0) {
253 DECREF(v);
254 v = NULL;
255 }
256 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000257 else {
258 v = newlistobject(0);
259 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000260 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000261 return v;
262}
263
264static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000265builtin_divmod(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000266 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000267 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000268{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000269 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000270 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000271 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000272 if (v->ob_type->tp_as_number == NULL ||
273 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000274 err_setstr(TypeError, "divmod() requires numeric arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000275 return NULL;
276 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000277 if (coerce(&v, &w) != 0)
278 return NULL;
279 x = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
280 DECREF(v);
281 DECREF(w);
282 return x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000283}
284
285static object *
286exec_eval(v, start)
287 object *v;
288 int start;
289{
290 object *str = NULL, *globals = NULL, *locals = NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000291 char *s;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000292 int n;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000293 /* XXX This is a bit of a mess. Should make it varargs */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000294 if (v != NULL) {
Guido van Rossum5b722181993-03-30 17:46:03 +0000295 if (is_tupleobject(v) &&
Guido van Rossum3f5da241990-12-20 15:06:42 +0000296 ((n = gettuplesize(v)) == 2 || n == 3)) {
297 str = gettupleitem(v, 0);
298 globals = gettupleitem(v, 1);
299 if (n == 3)
300 locals = gettupleitem(v, 2);
301 }
Guido van Rossum5b722181993-03-30 17:46:03 +0000302 else
303 str = v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000304 }
Guido van Rossum5b722181993-03-30 17:46:03 +0000305 if (str == NULL || (!is_stringobject(str) && !is_codeobject(str)) ||
Guido van Rossum3f5da241990-12-20 15:06:42 +0000306 globals != NULL && !is_dictobject(globals) ||
307 locals != NULL && !is_dictobject(locals)) {
308 err_setstr(TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +0000309 "eval/lambda arguments must be (string|code)[,dict[,dict]]");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000310 return NULL;
311 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000312 /* XXX The following is only correct for eval(), not for lambda() */
Guido van Rossum5b722181993-03-30 17:46:03 +0000313 if (is_codeobject(str))
314 return eval_code((codeobject *) str, globals, locals,
Guido van Rossum81daa321993-05-20 14:24:46 +0000315 (object *)NULL, (object *)NULL);
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000316 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000317 if (strlen(s) != getstringsize(str)) {
318 err_setstr(ValueError, "embedded '\\0' in string arg");
319 return NULL;
320 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000321 if (start == eval_input || start == lambda_input) {
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000322 while (*s == ' ' || *s == '\t')
323 s++;
324 }
325 return run_string(s, start, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000326}
327
328static object *
329builtin_eval(self, v)
330 object *self;
331 object *v;
332{
333 return exec_eval(v, eval_input);
334}
335
336static object *
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000337builtin_execfile(self, v)
338 object *self;
339 object *v;
340{
341 object *str = NULL, *globals = NULL, *locals = NULL, *w;
342 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000343 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000344 int n;
345 if (v != NULL) {
346 if (is_stringobject(v))
347 str = v;
348 else if (is_tupleobject(v) &&
349 ((n = gettuplesize(v)) == 2 || n == 3)) {
350 str = gettupleitem(v, 0);
351 globals = gettupleitem(v, 1);
352 if (n == 3)
353 locals = gettupleitem(v, 2);
354 }
355 }
356 if (str == NULL || !is_stringobject(str) ||
357 globals != NULL && !is_dictobject(globals) ||
358 locals != NULL && !is_dictobject(locals)) {
359 err_setstr(TypeError,
360 "execfile arguments must be filename[,dict[,dict]]");
361 return NULL;
362 }
Guido van Rossum2b81dc91992-08-19 16:40:53 +0000363 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000364 if (strlen(s) != getstringsize(str)) {
365 err_setstr(ValueError, "embedded '\\0' in string arg");
366 return NULL;
367 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000368 BGN_SAVE
Guido van Rossum94390a41992-08-14 15:14:30 +0000369 fp = fopen(s, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000370 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000371 if (fp == NULL) {
372 err_setstr(IOError, "execfile cannot open the file argument");
373 return NULL;
374 }
375 w = run_file(fp, getstringvalue(str), file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000376 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000377 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000378 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000379 return w;
380}
381
382static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000383builtin_float(self, v)
384 object *self;
385 object *v;
386{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000387 number_methods *nb;
388
389 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
390 nb->nb_float == NULL) {
391 err_setstr(TypeError,
392 "float() argument can't be converted to float");
393 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000394 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000395 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000396}
397
398static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000399builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000400 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000401 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000402{
Guido van Rossum94390a41992-08-14 15:14:30 +0000403 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000404 object *name;
405 if (!getargs(args, "(OS)", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000406 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000407 return getattro(v, name);
408}
409
410static object *
411builtin_hasattr(self, args)
412 object *self;
413 object *args;
414{
415 object *v;
416 object *name;
417 if (!getargs(args, "(OS)", &v, &name))
418 return NULL;
419 v = getattro(v, name);
420 if (v == NULL) {
421 err_clear();
422 return newintobject(0L);
423 }
424 DECREF(v);
425 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000426}
427
428static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000429builtin_id(self, args)
430 object *self;
431 object *args;
432{
433 object *v;
434 if (!getargs(args, "O", &v))
435 return NULL;
436 return newintobject((long)v);
437}
438
439static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000440builtin_map(self, args)
441 object *self;
442 object *args;
443{
444 typedef struct {
445 object *seq;
446 sequence_methods *sqf;
447 int len;
448 } sequence;
449
450 object *func, *result;
451 sequence *seqs = NULL, *sqp;
452 int n, len, newfunc = 0;
453 register int i, j;
454
455 if (args == NULL || !is_tupleobject(args)) {
456 err_setstr(TypeError, "map() requires at least two args");
457 return NULL;
458 }
459
460 func = gettupleitem(args, 0);
461 n = gettuplesize(args) - 1;
462
463 if (is_stringobject(func)) {
464 if ((func = exec_eval(func, lambda_input)) == NULL)
465 return NULL;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000466 }
467 else {
468 INCREF(func);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000469 }
470
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000471 if ((seqs = NEW(sequence, n)) == NULL) {
472 err_nomem();
473 goto Fail_2;
474 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000475
476 for (len = -1, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
477 int curlen;
478
479 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
480 goto Fail_2;
481
482 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
483 static char errmsg[] =
484 "argument %d to map() must be a sequence object";
485 char errbuf[sizeof(errmsg) + 3];
486
487 sprintf(errbuf, errmsg, i+2);
488 err_setstr(TypeError, errbuf);
489 goto Fail_2;
490 }
491
492 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
493 goto Fail_2;
494
495 if (curlen > len)
496 len = curlen;
497 }
498
499 if ((result = (object *) newlistobject(len)) == NULL)
500 goto Fail_2;
501
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000502 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000503 for (i = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000504 object *arglist, *item;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000505
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000506 if ((arglist = newtupleobject(n)) == NULL)
507 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000508
509 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
510 if (i >= sqp->len) {
511 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000512 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000513 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000514 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000515 item = (*sqp->sqf->sq_item)(sqp->seq, i);
516 if (item == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000517 goto Fail_0;
518
Guido van Rossum12d12c51993-10-26 17:58:25 +0000519 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000520 if (settupleitem(arglist, j, item) < 0)
521 goto Fail_0;
522 continue;
523
524 Fail_0:
525 DECREF(arglist);
526 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000527 }
528
529 if (func == None) {
530 if (n == 1) { /* avoid creating singleton */
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000531 INCREF(item); /* This is arglist[0] !!! */
532 DECREF(arglist);
533 if (setlistitem(result, i, item) < 0)
534 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000535 }
536 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000537 if (setlistitem(result, i, arglist) < 0)
538 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000539 }
540 }
541 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000542 object *value = call_object(func, arglist);
543 DECREF(arglist);
544 if (value == NULL)
545 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000546 if (setlistitem((object *) result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000547 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000548 }
549 }
550
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000551 if (seqs) DEL(seqs);
552 DECREF(func);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000553 return result;
554
Guido van Rossum12d12c51993-10-26 17:58:25 +0000555Fail_1:
556 DECREF(result);
557Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000558 DECREF(func);
559 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000560 return NULL;
561}
562
563static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000564builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000565 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000566 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000567{
Guido van Rossum94390a41992-08-14 15:14:30 +0000568 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000569 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000570 object *value;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000571 if (!getargs(args, "(OSO)", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000572 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000573 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000574 return NULL;
575 INCREF(None);
576 return None;
577}
578
579static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000580builtin_hash(self, args)
581 object *self;
582 object *args;
583{
584 object *v;
585 long x;
586 if (!getargs(args, "O", &v))
587 return NULL;
588 x = hashobject(v);
589 if (x == -1)
590 return NULL;
591 return newintobject(x);
592}
593
594static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000595builtin_hex(self, v)
596 object *self;
597 object *v;
598{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000599 number_methods *nb;
600
601 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
602 nb->nb_hex == NULL) {
603 err_setstr(TypeError,
604 "hex() argument can't be converted to hex");
605 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000606 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000607 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000608}
609
Guido van Rossum3165fe61992-09-25 21:59:05 +0000610static object *builtin_raw_input PROTO((object *, object *));
611
Guido van Rossum006bcd41991-10-24 14:54:44 +0000612static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000613builtin_input(self, v)
614 object *self;
615 object *v;
616{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000617 object *line = builtin_raw_input(self, v);
618 if (line == NULL)
619 return line;
620 v = exec_eval(line, eval_input);
621 DECREF(line);
622 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000623}
624
625static object *
626builtin_int(self, v)
627 object *self;
628 object *v;
629{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000630 number_methods *nb;
631
632 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
633 nb->nb_int == NULL) {
634 err_setstr(TypeError,
635 "int() argument can't be converted to int");
636 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000637 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000638 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000639}
640
641static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000642builtin_lambda(self, v)
643 object *self;
644 object *v;
645{
646 return exec_eval(v, lambda_input);
647}
648
649static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000650builtin_len(self, v)
651 object *self;
652 object *v;
653{
654 long len;
655 typeobject *tp;
656 if (v == NULL) {
657 err_setstr(TypeError, "len() without argument");
658 return NULL;
659 }
660 tp = v->ob_type;
661 if (tp->tp_as_sequence != NULL) {
662 len = (*tp->tp_as_sequence->sq_length)(v);
663 }
664 else if (tp->tp_as_mapping != NULL) {
665 len = (*tp->tp_as_mapping->mp_length)(v);
666 }
667 else {
668 err_setstr(TypeError, "len() of unsized object");
669 return NULL;
670 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000671 if (len < 0)
672 return NULL;
673 else
674 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000675}
676
677static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000678builtin_long(self, v)
679 object *self;
680 object *v;
681{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000682 number_methods *nb;
683
684 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
685 nb->nb_long == NULL) {
686 err_setstr(TypeError,
687 "long() argument can't be converted to long");
688 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000689 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000690 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000691}
692
693static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000694min_max(v, sign)
695 object *v;
696 int sign;
697{
698 int i, n, cmp;
699 object *w, *x;
700 sequence_methods *sq;
701 if (v == NULL) {
702 err_setstr(TypeError, "min() or max() without argument");
703 return NULL;
704 }
705 sq = v->ob_type->tp_as_sequence;
706 if (sq == NULL) {
707 err_setstr(TypeError, "min() or max() of non-sequence");
708 return NULL;
709 }
710 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000711 if (n < 0)
712 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000713 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000714 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000715 return NULL;
716 }
717 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
718 for (i = 1; i < n; i++) {
719 x = (*sq->sq_item)(v, i); /* Implies INCREF */
720 cmp = cmpobject(x, w);
721 if (cmp * sign > 0) {
722 DECREF(w);
723 w = x;
724 }
725 else
726 DECREF(x);
727 }
728 return w;
729}
730
731static object *
732builtin_min(self, v)
733 object *self;
734 object *v;
735{
736 return min_max(v, -1);
737}
738
739static object *
740builtin_max(self, v)
741 object *self;
742 object *v;
743{
744 return min_max(v, 1);
745}
746
747static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000748builtin_oct(self, v)
749 object *self;
750 object *v;
751{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000752 number_methods *nb;
753
754 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
755 nb->nb_oct == NULL) {
756 err_setstr(TypeError,
757 "oct() argument can't be converted to oct");
758 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000759 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000760 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000761}
762
763static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000764builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000765 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000766 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000767{
Guido van Rossum94390a41992-08-14 15:14:30 +0000768 char *name, *mode;
769 if (!getargs(args, "(ss)", &name, &mode))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000770 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000771 return newfileobject(name, mode);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000772}
773
774static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000775builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000776 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000777 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000778{
Guido van Rossum94390a41992-08-14 15:14:30 +0000779 char *s;
780 int len;
781 if (!getargs(args, "s#", &s, &len))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000782 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000783 if (len != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000784 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000785 return NULL;
786 }
Guido van Rossum94390a41992-08-14 15:14:30 +0000787 return newintobject((long)(s[0] & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000788}
789
790static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000791builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000792 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000793 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000794{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000795 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000796 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossumd4905451991-05-05 20:00:36 +0000797 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000798 if (v->ob_type->tp_as_number == NULL ||
799 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000800 err_setstr(TypeError, "pow() requires numeric arguments");
801 return NULL;
802 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000803 if (coerce(&v, &w) != 0)
804 return NULL;
805 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
806 DECREF(v);
807 DECREF(w);
808 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000809}
810
811static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000812builtin_range(self, v)
813 object *self;
814 object *v;
815{
816 static char *errmsg = "range() requires 1-3 int arguments";
817 int i, n;
818 long ilow, ihigh, istep;
819 if (v != NULL && is_intobject(v)) {
820 ilow = 0; ihigh = getintvalue(v); istep = 1;
821 }
822 else if (v == NULL || !is_tupleobject(v)) {
823 err_setstr(TypeError, errmsg);
824 return NULL;
825 }
826 else {
827 n = gettuplesize(v);
828 if (n < 1 || n > 3) {
829 err_setstr(TypeError, errmsg);
830 return NULL;
831 }
832 for (i = 0; i < n; i++) {
833 if (!is_intobject(gettupleitem(v, i))) {
834 err_setstr(TypeError, errmsg);
835 return NULL;
836 }
837 }
838 if (n == 3) {
839 istep = getintvalue(gettupleitem(v, 2));
840 --n;
841 }
842 else
843 istep = 1;
844 ihigh = getintvalue(gettupleitem(v, --n));
845 if (n > 0)
846 ilow = getintvalue(gettupleitem(v, 0));
847 else
848 ilow = 0;
849 }
850 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000851 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000852 return NULL;
853 }
854 /* XXX ought to check overflow of subtraction */
855 if (istep > 0)
856 n = (ihigh - ilow + istep - 1) / istep;
857 else
858 n = (ihigh - ilow + istep + 1) / istep;
859 if (n < 0)
860 n = 0;
861 v = newlistobject(n);
862 if (v == NULL)
863 return NULL;
864 for (i = 0; i < n; i++) {
865 object *w = newintobject(ilow);
866 if (w == NULL) {
867 DECREF(v);
868 return NULL;
869 }
870 setlistitem(v, i, w);
871 ilow += istep;
872 }
873 return v;
874}
875
876static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000877builtin_xrange(self, v)
878 object *self;
879 object *v;
880{
881 static char *errmsg = "xrange() requires 1-3 int arguments";
882 int i, n;
883 long start, stop, step, len;
884 if (v != NULL && is_intobject(v))
885 start = 0, stop = getintvalue(v), step = 1;
886
887 else if (v == NULL || !is_tupleobject(v)) {
888 err_setstr(TypeError, errmsg);
889 return NULL;
890 }
891 else {
892 n = gettuplesize(v);
893 if (n < 1 || n > 3) {
894 err_setstr(TypeError, errmsg);
895 return NULL;
896 }
897 for (i = 0; i < n; i++) {
898 if (!is_intobject(gettupleitem(v, i))) {
899 err_setstr(TypeError, errmsg);
900 return NULL;
901 }
902 }
903 if (n == 3) {
904 step = getintvalue(gettupleitem(v, 2));
905 --n;
906 }
907 else
908 step = 1;
909 stop = getintvalue(gettupleitem(v, --n));
910 if (n > 0)
911 start = getintvalue(gettupleitem(v, 0));
912 else
913 start = 0;
914 }
915
916 if (step == 0) {
917 err_setstr(ValueError, "zero step for xrange()");
918 return NULL;
919 }
920
921 len = (stop - start + step + ((step > 0) ? -1 : 1)) / step;
922 if (len < 0)
923 len = 0;
924
Guido van Rossum2586bf01993-11-01 16:21:44 +0000925 return newrangeobject(start, len, step);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000926}
927
928static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000929builtin_raw_input(self, v)
930 object *self;
931 object *v;
932{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000933 object *f = sysget("stdout");
934 if (f == NULL) {
935 err_setstr(RuntimeError, "lost sys.stdout");
936 return NULL;
937 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000938 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000939 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000940 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +0000941 return NULL;
942 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000943 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000944}
945
946static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000947builtin_reduce(self, args)
948 object *self;
949 object *args;
950{
951 object *seq, *func, *result;
952 sequence_methods *sqf;
953 static char reduce_err[] = "reduce() requires 2 or 3 args";
954 register int i;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000955 int start = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000956 int len;
957
958 if (args == NULL || !is_tupleobject(args)) {
959 err_setstr(TypeError, reduce_err);
960 return NULL;
961 }
962
963 switch (gettuplesize(args)) {
964 case 2:
965 start = 1; /* fall through */
966 case 3:
967 func = gettupleitem(args, 0);
968 seq = gettupleitem(args, 1);
969 break;
970 default:
971 err_setstr(TypeError, reduce_err);
972 }
973
974 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
975 err_setstr(TypeError,
976 "2nd argument to reduce() must be a sequence object");
977 return NULL;
978 }
979
980 if (is_stringobject(func)) {
981 if ((func = exec_eval(func, lambda_input)) == NULL)
982 return NULL;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000983 }
984 else {
985 INCREF(func);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000986 }
987
988 if ((len = (*sqf->sq_length)(seq)) < 0)
989 goto Fail_2;
990
991 if (start == 1) {
992 if (len == 0) {
993 err_setstr(TypeError,
994 "reduce of empty sequence with no initial value");
995 goto Fail_2;
996 }
997
998 if ((result = (*sqf->sq_item)(seq, 0)) == NULL)
999 goto Fail_2;
1000 }
1001 else {
1002 result = gettupleitem(args, 2);
1003 INCREF(result);
1004 }
1005
1006 if ((args = newtupleobject(2)) == NULL)
1007 goto Fail_1;
1008
1009 for (i = start; i < len; ++i) {
1010 object *op2;
1011
1012 if (args->ob_refcnt > 1) {
1013 DECREF(args);
1014 if ((args = newtupleobject(2)) == NULL)
1015 goto Fail_1;
1016 }
1017
1018 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL)
1019 goto Fail_2;
1020
1021 settupleitem(args, 0, result);
1022 settupleitem(args, 1, op2);
1023 if ((result = call_object(func, args)) == NULL)
1024 goto Fail_0;
1025 }
1026
1027 DECREF(args);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001028 DECREF(func);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001029
1030 return result;
1031
Guido van Rossum12d12c51993-10-26 17:58:25 +00001032Fail_0:
1033 DECREF(args);
1034 goto Fail_2;
1035Fail_1:
1036 DECREF(result);
1037Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001038 DECREF(func);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001039 return NULL;
1040}
1041
1042static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001043builtin_reload(self, v)
1044 object *self;
1045 object *v;
1046{
1047 return reload_module(v);
1048}
1049
1050static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +00001051builtin_repr(self, v)
1052 object *self;
1053 object *v;
1054{
1055 if (v == NULL) {
1056 err_badarg();
1057 return NULL;
1058 }
1059 return reprobject(v);
1060}
1061
1062static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001063builtin_round(self, args)
1064 object *self;
1065 object *args;
1066{
1067 extern double floor PROTO((double));
1068 extern double ceil PROTO((double));
1069 double x;
1070 double f;
1071 int ndigits = 0;
1072 int sign = 1;
1073 int i;
1074 if (!getargs(args, "d", &x)) {
1075 err_clear();
1076 if (!getargs(args, "(di)", &x, &ndigits))
1077 return NULL;
1078 }
1079 f = 1.0;
1080 for (i = ndigits; --i >= 0; )
1081 f = f*10.0;
1082 for (i = ndigits; ++i <= 0; )
1083 f = f*0.1;
1084 if (x >= 0.0)
1085 return newfloatobject(floor(x*f + 0.5) / f);
1086 else
1087 return newfloatobject(ceil(x*f - 0.5) / f);
1088}
1089
1090static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +00001091builtin_str(self, v)
1092 object *self;
1093 object *v;
1094{
1095 if (v == NULL) {
1096 err_badarg();
1097 return NULL;
1098 }
1099 if (is_stringobject(v)) {
1100 INCREF(v);
1101 return v;
1102 }
1103 else
1104 return reprobject(v);
1105}
1106
1107static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001108builtin_type(self, v)
1109 object *self;
1110 object *v;
1111{
1112 if (v == NULL) {
Guido van Rossumc89705d1992-11-26 08:54:07 +00001113 err_setstr(TypeError, "type() requires an argument");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001114 return NULL;
1115 }
1116 v = (object *)v->ob_type;
1117 INCREF(v);
1118 return v;
1119}
1120
1121static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001122 {"abs", builtin_abs},
1123 {"apply", builtin_apply},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001124 {"bagof", builtin_bagof},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001125 {"chr", builtin_chr},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001126 {"cmp", builtin_cmp},
Guido van Rossum04691fc1992-08-12 15:35:34 +00001127 {"coerce", builtin_coerce},
Guido van Rossum5b722181993-03-30 17:46:03 +00001128 {"compile", builtin_compile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001129 {"dir", builtin_dir},
1130 {"divmod", builtin_divmod},
1131 {"eval", builtin_eval},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +00001132 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001133 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +00001134 {"getattr", builtin_getattr},
Guido van Rossum9bfef441993-03-29 10:43:31 +00001135 {"hasattr", builtin_hasattr},
1136 {"hash", builtin_hash},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001137 {"hex", builtin_hex},
Guido van Rossum5b722181993-03-30 17:46:03 +00001138 {"id", builtin_id},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001139 {"input", builtin_input},
1140 {"int", builtin_int},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001141 {"lambda", builtin_lambda},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001142 {"len", builtin_len},
1143 {"long", builtin_long},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001144 {"map", builtin_map},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001145 {"max", builtin_max},
1146 {"min", builtin_min},
1147 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +00001148 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001149 {"ord", builtin_ord},
1150 {"pow", builtin_pow},
1151 {"range", builtin_range},
1152 {"raw_input", builtin_raw_input},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001153 {"reduce", builtin_reduce},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001154 {"reload", builtin_reload},
Guido van Rossumc89705d1992-11-26 08:54:07 +00001155 {"repr", builtin_repr},
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001156 {"round", builtin_round},
Guido van Rossum33894be1992-01-27 16:53:09 +00001157 {"setattr", builtin_setattr},
Guido van Rossumc89705d1992-11-26 08:54:07 +00001158 {"str", builtin_str},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001159 {"type", builtin_type},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001160 {"xrange", builtin_xrange},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001161 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001162};
1163
1164static object *builtin_dict;
1165
1166object *
1167getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +00001168 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001169{
Guido van Rossuma57fb011991-08-16 08:54:58 +00001170 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001171}
1172
1173/* Predefined exceptions */
1174
Guido van Rossum25831651993-05-19 14:50:45 +00001175object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001176object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001177object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001178object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001179object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001180object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001181object *IndexError;
1182object *KeyError;
1183object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001184object *MemoryError;
1185object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001186object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001187object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001188object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001189object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001190object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001191object *TypeError;
1192object *ValueError;
1193object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001194
Guido van Rossum3f5da241990-12-20 15:06:42 +00001195static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001196newstdexception(name)
1197 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001198{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001199 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001200 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1201 fatal("no mem for new standard exception");
1202 return v;
1203}
1204
1205static void
1206initerrors()
1207{
Guido van Rossum25831651993-05-19 14:50:45 +00001208 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001209 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001210 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001211 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001212 IOError = newstdexception("IOError");
1213 ImportError = newstdexception("ImportError");
1214 IndexError = newstdexception("IndexError");
1215 KeyError = newstdexception("KeyError");
1216 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001217 MemoryError = newstdexception("MemoryError");
1218 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001219 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001220 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001221 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001222 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001223 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001224 TypeError = newstdexception("TypeError");
1225 ValueError = newstdexception("ValueError");
1226 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001227}
1228
1229void
1230initbuiltin()
1231{
1232 object *m;
Guido van Rossum89b33251993-10-22 14:26:06 +00001233 m = initmodule("__builtin__", builtin_methods);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001234 builtin_dict = getmoduledict(m);
1235 INCREF(builtin_dict);
1236 initerrors();
1237 (void) dictinsert(builtin_dict, "None", None);
1238}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001239
1240/* Coerce two numeric types to the "larger" one.
1241 Increment the reference count on each argument.
1242 Return -1 and raise an exception if no coercion is possible
1243 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +00001244*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001245
1246int
1247coerce(pv, pw)
1248 object **pv, **pw;
1249{
1250 register object *v = *pv;
1251 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001252 int res;
1253
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001254 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001255 INCREF(v);
1256 INCREF(w);
1257 return 0;
1258 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001259 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
1260 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
1261 if (res <= 0)
1262 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001263 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001264 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
1265 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
1266 if (res <= 0)
1267 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001268 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001269 err_setstr(TypeError, "number coercion failed");
1270 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001271}
Guido van Rossum12d12c51993-10-26 17:58:25 +00001272
1273
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001274/* Helper for bagof(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001275
1276static object *
1277filtertuple(func, tuple)
1278 object *func;
1279 object *tuple;
1280{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001281 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001282 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001283 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001284
Guido van Rossum2586bf01993-11-01 16:21:44 +00001285 if ((result = newtupleobject(len)) == NULL)
1286 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001287
Guido van Rossum12d12c51993-10-26 17:58:25 +00001288 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001289 object *item, *good;
1290 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001291
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001292 if ((item = gettupleitem(tuple, i)) == NULL)
1293 goto Fail_1;
1294 if (func == None) {
1295 INCREF(item);
1296 good = item;
1297 }
1298 else {
1299 object *arg = mkvalue("(O)", item);
1300 if (arg == NULL)
1301 goto Fail_1;
1302 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001303 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001304 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001305 goto Fail_1;
1306 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001307 ok = testbool(good);
1308 DECREF(good);
1309 if (ok) {
1310 INCREF(item);
1311 if (settupleitem(result, j++, item) < 0)
1312 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001313 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001314 }
1315
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001316 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001317 return NULL;
1318
Guido van Rossum12d12c51993-10-26 17:58:25 +00001319 return result;
1320
Guido van Rossum12d12c51993-10-26 17:58:25 +00001321Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001322 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001323 return NULL;
1324}
1325
1326
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001327/* Helper for bagof(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001328
1329static object *
1330filterstring(func, strobj)
1331 object *func;
1332 object *strobj;
1333{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001334 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001335 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001336 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001337
Guido van Rossum2586bf01993-11-01 16:21:44 +00001338 if (func == None) {
1339 /* No character is ever false -- share input string */
1340 INCREF(result);
1341 return result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001342 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001343 if ((result = newsizedstringobject(NULL, len)) == NULL)
1344 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001345
Guido van Rossum12d12c51993-10-26 17:58:25 +00001346 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001347 object *item, *arg, *good;
1348 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001349
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001350 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1351 if (item == NULL)
1352 goto Fail_1;
1353 arg = mkvalue("(O)", item);
1354 DECREF(item);
1355 if (arg == NULL)
1356 goto Fail_1;
1357 good = call_object(func, arg);
1358 DECREF(arg);
1359 if (good == NULL)
1360 goto Fail_1;
1361 ok = testbool(good);
1362 DECREF(good);
1363 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001364 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001365 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001366 }
1367
Guido van Rossum12d12c51993-10-26 17:58:25 +00001368 if (resizestring(&result, j) < 0)
1369 return NULL;
1370
Guido van Rossum12d12c51993-10-26 17:58:25 +00001371 return result;
1372
Guido van Rossum12d12c51993-10-26 17:58:25 +00001373Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001374 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001375 return NULL;
1376}