blob: 67b7e26b840330e608a21fa31879c6f158704c50 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum2d951851994-08-29 12:52:16 +00002Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
Guido van Rossume5372401993-03-16 12:15:04 +00003Amsterdam, 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 Rossum2d951851994-08-29 12:52:16 +000066 if (!is_tupleobject(arglist)) {
67 err_setstr(TypeError, "apply() 2nd argument must be tuple");
68 return NULL;
69 }
Guido van Rossum94390a41992-08-14 15:14:30 +000070 return call_object(func, arglist);
Guido van Rossumc02e15c1991-12-16 13:03:00 +000071}
72
Guido van Rossum2d951851994-08-29 12:52:16 +000073static int
74callable(x)
75 object *x;
76{
77 if (x == NULL)
78 return 0;
79 if (x->ob_type->tp_call != NULL ||
80 is_funcobject(x) ||
81 is_instancemethodobject(x) ||
82 is_methodobject(x) ||
83 is_classobject(x))
84 return 1;
85 if (is_instanceobject(x)) {
86 object *call = getattr(x, "__call__");
87 if (call == NULL) {
88 err_clear();
89 return 0;
90 }
91 /* Could test recursively but don't, for fear of endless
92 recursion if some joker sets self.__call__ = self */
93 DECREF(call);
94 return 1;
95 }
96 return 0;
97}
98
99static object *
100builtin_callable(self, args)
101 object *self;
102 object *args;
103{
104 if (args == NULL) {
105 err_setstr(TypeError,
106 "callable requires exactly one argument");
107 return NULL;
108 }
109 return newintobject((long)callable(args));
110}
111
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000112static object *
Guido van Rossume77a7571993-11-03 15:01:26 +0000113builtin_filter(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000114 object *self;
115 object *args;
116{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000117 object *func, *seq, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000118 sequence_methods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000119 int len;
120 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000121
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000122 if (!getargs(args, "(OO)", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000123 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000124
Guido van Rossum12d12c51993-10-26 17:58:25 +0000125 if (is_stringobject(seq)) {
126 object *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000127 return r;
128 }
129
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000130 if (is_tupleobject(seq)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000131 object *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000132 return r;
133 }
134
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000135 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000136 err_setstr(TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000137 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000138 goto Fail_2;
139 }
140
141 if ((len = (*sqf->sq_length)(seq)) < 0)
142 goto Fail_2;
143
144 if (is_listobject(seq) && seq->ob_refcnt == 1) {
145 INCREF(seq);
146 result = seq;
147 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000148 else {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000149 if ((result = newlistobject(len)) == NULL)
150 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000151 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000152
Guido van Rossum2d951851994-08-29 12:52:16 +0000153 for (i = j = 0; ; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000154 object *item, *good;
155 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000156
Guido van Rossum2d951851994-08-29 12:52:16 +0000157 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
158 if (i < len)
159 goto Fail_1;
160 if (err_occurred() == IndexError) {
161 err_clear();
162 break;
163 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000164 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000165 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000166
167 if (func == None) {
168 good = item;
169 }
170 else {
171 object *arg = mkvalue("(O)", item);
172 DECREF(item);
173 if (arg == NULL)
174 goto Fail_1;
175 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000176 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000177 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000178 goto Fail_1;
179 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000180 ok = testbool(good);
181 DECREF(good);
182 if (ok) {
183 INCREF(item);
Guido van Rossum2d951851994-08-29 12:52:16 +0000184 if (j < len) {
185 if (setlistitem(result, j++, item) < 0)
186 goto Fail_1;
187 }
188 else {
189 j++;
190 if (addlistitem(result, item) < 0)
191 goto Fail_1;
192 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000193 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000194 }
195
Guido van Rossum12d12c51993-10-26 17:58:25 +0000196
Guido van Rossum2d951851994-08-29 12:52:16 +0000197 if (j < len && setlistslice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000198 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000199
Guido van Rossum12d12c51993-10-26 17:58:25 +0000200 return result;
201
Guido van Rossum12d12c51993-10-26 17:58:25 +0000202Fail_1:
203 DECREF(result);
204Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000205 return NULL;
206}
207
208static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000209builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000210 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000211 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000212{
213 long x;
214 char s[1];
Guido van Rossum94390a41992-08-14 15:14:30 +0000215 if (!getargs(args, "l", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000216 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000217 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000218 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000219 return NULL;
220 }
221 s[0] = x;
222 return newsizedstringobject(s, 1);
223}
224
225static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000226builtin_cmp(self, args)
227 object *self;
228 object *args;
229{
230 object *a, *b;
231 if (!getargs(args, "(OO)", &a, &b))
232 return NULL;
233 return newintobject((long)cmpobject(a, b));
234}
235
236static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +0000237builtin_coerce(self, args)
238 object *self;
239 object *args;
240{
241 object *v, *w;
242 object *res;
243
244 if (!getargs(args, "(OO)", &v, &w))
245 return NULL;
246 if (coerce(&v, &w) < 0)
247 return NULL;
248 res = mkvalue("(OO)", v, w);
249 DECREF(v);
250 DECREF(w);
251 return res;
252}
253
254static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000255builtin_compile(self, args)
256 object *self;
257 object *args;
258{
259 char *str;
260 char *filename;
261 char *startstr;
262 int start;
263 if (!getargs(args, "(sss)", &str, &filename, &startstr))
264 return NULL;
265 if (strcmp(startstr, "exec") == 0)
266 start = file_input;
267 else if (strcmp(startstr, "eval") == 0)
268 start = eval_input;
269 else {
270 err_setstr(ValueError,
271 "compile() mode must be 'exec' or 'eval'");
272 return NULL;
273 }
274 return compile_string(str, filename, start);
275}
276
277static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000278builtin_dir(self, v)
279 object *self;
280 object *v;
281{
282 object *d;
283 if (v == NULL) {
284 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000285 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000286 }
287 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000288 d = getattr(v, "__dict__");
289 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000290 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000291 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000292 return NULL;
293 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000294 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000295 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000296 v = getdictkeys(d);
297 if (sortlist(v) != 0) {
298 DECREF(v);
299 v = NULL;
300 }
301 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000302 else {
303 v = newlistobject(0);
304 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000305 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000306 return v;
307}
308
309static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000310builtin_divmod(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000311 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000312 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000313{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000314 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000315 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000316 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000317 if (v->ob_type->tp_as_number == NULL ||
318 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000319 err_setstr(TypeError, "divmod() requires numeric arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000320 return NULL;
321 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000322 if (coerce(&v, &w) != 0)
323 return NULL;
324 x = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
325 DECREF(v);
326 DECREF(w);
327 return x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000328}
329
330static object *
331exec_eval(v, start)
332 object *v;
333 int start;
334{
335 object *str = NULL, *globals = NULL, *locals = NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000336 char *s;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000337 int n;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000338 /* XXX This is a bit of a mess. Should make it varargs */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000339 if (v != NULL) {
Guido van Rossum5b722181993-03-30 17:46:03 +0000340 if (is_tupleobject(v) &&
Guido van Rossum3f5da241990-12-20 15:06:42 +0000341 ((n = gettuplesize(v)) == 2 || n == 3)) {
342 str = gettupleitem(v, 0);
343 globals = gettupleitem(v, 1);
344 if (n == 3)
345 locals = gettupleitem(v, 2);
346 }
Guido van Rossum5b722181993-03-30 17:46:03 +0000347 else
348 str = v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000349 }
Guido van Rossum5b722181993-03-30 17:46:03 +0000350 if (str == NULL || (!is_stringobject(str) && !is_codeobject(str)) ||
Guido van Rossum3f5da241990-12-20 15:06:42 +0000351 globals != NULL && !is_dictobject(globals) ||
352 locals != NULL && !is_dictobject(locals)) {
353 err_setstr(TypeError,
Guido van Rossum590baa41993-11-30 13:40:46 +0000354 "eval arguments must be (string|code)[,dict[,dict]]");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000355 return NULL;
356 }
Guido van Rossum590baa41993-11-30 13:40:46 +0000357
Guido van Rossum5b722181993-03-30 17:46:03 +0000358 if (is_codeobject(str))
359 return eval_code((codeobject *) str, globals, locals,
Guido van Rossum81daa321993-05-20 14:24:46 +0000360 (object *)NULL, (object *)NULL);
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000361 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000362 if (strlen(s) != getstringsize(str)) {
363 err_setstr(ValueError, "embedded '\\0' in string arg");
364 return NULL;
365 }
Guido van Rossum590baa41993-11-30 13:40:46 +0000366 if (start == eval_input) {
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000367 while (*s == ' ' || *s == '\t')
368 s++;
369 }
370 return run_string(s, start, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000371}
372
373static object *
374builtin_eval(self, v)
375 object *self;
376 object *v;
377{
378 return exec_eval(v, eval_input);
379}
380
381static object *
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000382builtin_execfile(self, v)
383 object *self;
384 object *v;
385{
386 object *str = NULL, *globals = NULL, *locals = NULL, *w;
387 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000388 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000389 int n;
390 if (v != NULL) {
391 if (is_stringobject(v))
392 str = v;
393 else if (is_tupleobject(v) &&
394 ((n = gettuplesize(v)) == 2 || n == 3)) {
395 str = gettupleitem(v, 0);
396 globals = gettupleitem(v, 1);
397 if (n == 3)
398 locals = gettupleitem(v, 2);
399 }
400 }
401 if (str == NULL || !is_stringobject(str) ||
402 globals != NULL && !is_dictobject(globals) ||
403 locals != NULL && !is_dictobject(locals)) {
404 err_setstr(TypeError,
405 "execfile arguments must be filename[,dict[,dict]]");
406 return NULL;
407 }
Guido van Rossum2b81dc91992-08-19 16:40:53 +0000408 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000409 if (strlen(s) != getstringsize(str)) {
410 err_setstr(ValueError, "embedded '\\0' in string arg");
411 return NULL;
412 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000413 BGN_SAVE
Guido van Rossum94390a41992-08-14 15:14:30 +0000414 fp = fopen(s, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000415 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000416 if (fp == NULL) {
417 err_setstr(IOError, "execfile cannot open the file argument");
418 return NULL;
419 }
420 w = run_file(fp, getstringvalue(str), file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000421 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000422 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000423 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000424 return w;
425}
426
427static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000428builtin_float(self, v)
429 object *self;
430 object *v;
431{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000432 number_methods *nb;
433
434 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
435 nb->nb_float == NULL) {
436 err_setstr(TypeError,
437 "float() argument can't be converted to float");
438 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000439 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000440 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000441}
442
443static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000444builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000445 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000446 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000447{
Guido van Rossum94390a41992-08-14 15:14:30 +0000448 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000449 object *name;
450 if (!getargs(args, "(OS)", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000451 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000452 return getattro(v, name);
453}
454
455static object *
456builtin_hasattr(self, args)
457 object *self;
458 object *args;
459{
460 object *v;
461 object *name;
462 if (!getargs(args, "(OS)", &v, &name))
463 return NULL;
464 v = getattro(v, name);
465 if (v == NULL) {
466 err_clear();
467 return newintobject(0L);
468 }
469 DECREF(v);
470 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000471}
472
473static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000474builtin_id(self, args)
475 object *self;
476 object *args;
477{
478 object *v;
479 if (!getargs(args, "O", &v))
480 return NULL;
481 return newintobject((long)v);
482}
483
484static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000485builtin_map(self, args)
486 object *self;
487 object *args;
488{
489 typedef struct {
490 object *seq;
491 sequence_methods *sqf;
492 int len;
493 } sequence;
494
495 object *func, *result;
496 sequence *seqs = NULL, *sqp;
497 int n, len, newfunc = 0;
498 register int i, j;
499
500 if (args == NULL || !is_tupleobject(args)) {
501 err_setstr(TypeError, "map() requires at least two args");
502 return NULL;
503 }
504
505 func = gettupleitem(args, 0);
506 n = gettuplesize(args) - 1;
507
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000508 if ((seqs = NEW(sequence, n)) == NULL) {
509 err_nomem();
510 goto Fail_2;
511 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000512
Guido van Rossum2d951851994-08-29 12:52:16 +0000513 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000514 int curlen;
515
516 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
517 goto Fail_2;
518
519 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
520 static char errmsg[] =
521 "argument %d to map() must be a sequence object";
522 char errbuf[sizeof(errmsg) + 3];
523
524 sprintf(errbuf, errmsg, i+2);
525 err_setstr(TypeError, errbuf);
526 goto Fail_2;
527 }
528
529 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
530 goto Fail_2;
531
532 if (curlen > len)
533 len = curlen;
534 }
535
536 if ((result = (object *) newlistobject(len)) == NULL)
537 goto Fail_2;
538
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000539 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000540 for (i = 0; ; ++i) {
541 object *arglist, *item, *value;
542 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000543
Guido van Rossum2d951851994-08-29 12:52:16 +0000544 if (func == None && n == 1)
545 arglist = NULL;
546 else {
547 if ((arglist = newtupleobject(n)) == NULL)
548 goto Fail_1;
549 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000550
551 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000552 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000553 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000554 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000555 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000556 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000557 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000558 if (item == NULL) {
559 if (i < sqp->len)
560 goto Fail_0;
561 if (err_occurred() == IndexError) {
562 err_clear();
563 INCREF(None);
564 item = None;
565 sqp->len = -1;
566 }
567 else {
568 goto Fail_0;
569 }
570 }
571 else
572 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000573
Guido van Rossum12d12c51993-10-26 17:58:25 +0000574 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000575 if (!arglist)
576 break;
577 if (settupleitem(arglist, j, item) < 0) {
578 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000579 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000580 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000581 continue;
582
583 Fail_0:
Guido van Rossum2d951851994-08-29 12:52:16 +0000584 XDECREF(arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000585 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000586 }
587
Guido van Rossum2d951851994-08-29 12:52:16 +0000588 if (!arglist)
589 arglist = item;
590
591 if (!any) {
592 DECREF(arglist);
593 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000594 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000595
596 if (func == None)
597 value = arglist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000598 else {
Guido van Rossum2d951851994-08-29 12:52:16 +0000599 value = call_object(func, arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000600 DECREF(arglist);
601 if (value == NULL)
602 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000603 }
604 if (i >= len) {
605 if (addlistitem(result, value) < 0)
606 goto Fail_1;
607 }
608 else {
609 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000610 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000611 }
612 }
613
Guido van Rossum2d951851994-08-29 12:52:16 +0000614 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000615 return result;
616
Guido van Rossum12d12c51993-10-26 17:58:25 +0000617Fail_1:
618 DECREF(result);
619Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000620 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000621 return NULL;
622}
623
624static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000625builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000626 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000627 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000628{
Guido van Rossum94390a41992-08-14 15:14:30 +0000629 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000630 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000631 object *value;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000632 if (!getargs(args, "(OSO)", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000633 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000634 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000635 return NULL;
636 INCREF(None);
637 return None;
638}
639
640static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000641builtin_delattr(self, args)
642 object *self;
643 object *args;
644{
645 object *v;
646 object *name;
647 if (!getargs(args, "(OS)", &v, &name))
648 return NULL;
649 if (setattro(v, name, (object *)NULL) != 0)
650 return NULL;
651 INCREF(None);
652 return None;
653}
654
655static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000656builtin_hash(self, args)
657 object *self;
658 object *args;
659{
660 object *v;
661 long x;
662 if (!getargs(args, "O", &v))
663 return NULL;
664 x = hashobject(v);
665 if (x == -1)
666 return NULL;
667 return newintobject(x);
668}
669
670static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000671builtin_hex(self, v)
672 object *self;
673 object *v;
674{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000675 number_methods *nb;
676
677 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
678 nb->nb_hex == NULL) {
679 err_setstr(TypeError,
680 "hex() argument can't be converted to hex");
681 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000682 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000683 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000684}
685
Guido van Rossum3165fe61992-09-25 21:59:05 +0000686static object *builtin_raw_input PROTO((object *, object *));
687
Guido van Rossum006bcd41991-10-24 14:54:44 +0000688static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000689builtin_input(self, v)
690 object *self;
691 object *v;
692{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000693 object *line = builtin_raw_input(self, v);
694 if (line == NULL)
695 return line;
696 v = exec_eval(line, eval_input);
697 DECREF(line);
698 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000699}
700
701static object *
702builtin_int(self, v)
703 object *self;
704 object *v;
705{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000706 number_methods *nb;
707
708 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
709 nb->nb_int == NULL) {
710 err_setstr(TypeError,
711 "int() argument can't be converted to int");
712 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000713 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000714 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000715}
716
717static object *
718builtin_len(self, v)
719 object *self;
720 object *v;
721{
722 long len;
723 typeobject *tp;
724 if (v == NULL) {
725 err_setstr(TypeError, "len() without argument");
726 return NULL;
727 }
728 tp = v->ob_type;
729 if (tp->tp_as_sequence != NULL) {
730 len = (*tp->tp_as_sequence->sq_length)(v);
731 }
732 else if (tp->tp_as_mapping != NULL) {
733 len = (*tp->tp_as_mapping->mp_length)(v);
734 }
735 else {
736 err_setstr(TypeError, "len() of unsized object");
737 return NULL;
738 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000739 if (len < 0)
740 return NULL;
741 else
742 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000743}
744
745static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000746builtin_long(self, v)
747 object *self;
748 object *v;
749{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000750 number_methods *nb;
751
752 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
753 nb->nb_long == NULL) {
754 err_setstr(TypeError,
755 "long() argument can't be converted to long");
756 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000757 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000758 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000759}
760
761static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000762min_max(v, sign)
763 object *v;
764 int sign;
765{
Guido van Rossum2d951851994-08-29 12:52:16 +0000766 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000767 object *w, *x;
768 sequence_methods *sq;
769 if (v == NULL) {
770 err_setstr(TypeError, "min() or max() without argument");
771 return NULL;
772 }
773 sq = v->ob_type->tp_as_sequence;
774 if (sq == NULL) {
775 err_setstr(TypeError, "min() or max() of non-sequence");
776 return NULL;
777 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000778 w = NULL;
779 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000780 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000781 if (x == NULL) {
782 if (err_occurred() == IndexError) {
783 err_clear();
784 break;
785 }
786 XDECREF(w);
787 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000788 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000789 if (w == NULL)
790 w = x;
791 else {
792 if (cmpobject(x, w) * sign > 0) {
793 DECREF(w);
794 w = x;
795 }
796 else
797 DECREF(x);
798 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000799 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000800 if (w == NULL)
801 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000802 return w;
803}
804
805static object *
806builtin_min(self, v)
807 object *self;
808 object *v;
809{
810 return min_max(v, -1);
811}
812
813static object *
814builtin_max(self, v)
815 object *self;
816 object *v;
817{
818 return min_max(v, 1);
819}
820
821static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000822builtin_oct(self, v)
823 object *self;
824 object *v;
825{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000826 number_methods *nb;
827
828 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
829 nb->nb_oct == NULL) {
830 err_setstr(TypeError,
831 "oct() argument can't be converted to oct");
832 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000833 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000834 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000835}
836
837static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000838builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000839 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000840 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000841{
Guido van Rossum2d951851994-08-29 12:52:16 +0000842 char *name;
843 char *mode = "r";
844 int bufsize = -1;
845 object *f;
846 if (!getargs(args, "s", &name) &&
847 (err_clear(), !getargs(args, "(ss)", &name, &mode)) &&
848 (err_clear(), !getargs(args, "(ssi)", &name, &mode, &bufsize)))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000849 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000850 f = newfileobject(name, mode);
851 if (f != NULL)
852 setfilebufsize(f, bufsize);
853 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000854}
855
856static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000857builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000858 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000859 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000860{
Guido van Rossum94390a41992-08-14 15:14:30 +0000861 char *s;
862 int len;
863 if (!getargs(args, "s#", &s, &len))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000864 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000865 if (len != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000866 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000867 return NULL;
868 }
Guido van Rossum94390a41992-08-14 15:14:30 +0000869 return newintobject((long)(s[0] & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000870}
871
872static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000873builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000874 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000875 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000876{
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000877 object *v, *w, *z, *x;
878 z = None;
879 if (!getargs(args, "(OO)", &v, &w)) {
880 err_clear();
881 if (!getargs(args, "(OOO)", &v, &w, &z)) {
882 return NULL;
883 }
884 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000885 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000886 (z!=None && z->ob_type->tp_as_number == NULL) ||
887 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000888 err_setstr(TypeError, "pow() requires numeric arguments");
889 return NULL;
890 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000891 if (coerce(&v, &w) != 0)
892 return NULL;
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000893 if (z!=None) {
894 if (coerce(&w, &z) != 0)
895 return NULL;
896 if (coerce(&v, &z) != 0)
897 return NULL;
898 }
899 x = (*v->ob_type->tp_as_number->nb_power)(v, w, z);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000900 DECREF(v);
901 DECREF(w);
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000902 if (z!=None) {DECREF(w); DECREF(v); DECREF(z); DECREF(z);}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000903 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000904}
905
906static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000907builtin_range(self, v)
908 object *self;
909 object *v;
910{
911 static char *errmsg = "range() requires 1-3 int arguments";
912 int i, n;
913 long ilow, ihigh, istep;
914 if (v != NULL && is_intobject(v)) {
915 ilow = 0; ihigh = getintvalue(v); istep = 1;
916 }
917 else if (v == NULL || !is_tupleobject(v)) {
918 err_setstr(TypeError, errmsg);
919 return NULL;
920 }
921 else {
922 n = gettuplesize(v);
923 if (n < 1 || n > 3) {
924 err_setstr(TypeError, errmsg);
925 return NULL;
926 }
927 for (i = 0; i < n; i++) {
928 if (!is_intobject(gettupleitem(v, i))) {
929 err_setstr(TypeError, errmsg);
930 return NULL;
931 }
932 }
933 if (n == 3) {
934 istep = getintvalue(gettupleitem(v, 2));
935 --n;
936 }
937 else
938 istep = 1;
939 ihigh = getintvalue(gettupleitem(v, --n));
940 if (n > 0)
941 ilow = getintvalue(gettupleitem(v, 0));
942 else
943 ilow = 0;
944 }
945 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000946 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000947 return NULL;
948 }
949 /* XXX ought to check overflow of subtraction */
950 if (istep > 0)
951 n = (ihigh - ilow + istep - 1) / istep;
952 else
953 n = (ihigh - ilow + istep + 1) / istep;
954 if (n < 0)
955 n = 0;
956 v = newlistobject(n);
957 if (v == NULL)
958 return NULL;
959 for (i = 0; i < n; i++) {
960 object *w = newintobject(ilow);
961 if (w == NULL) {
962 DECREF(v);
963 return NULL;
964 }
965 setlistitem(v, i, w);
966 ilow += istep;
967 }
968 return v;
969}
970
971static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000972builtin_xrange(self, v)
973 object *self;
974 object *v;
975{
976 static char *errmsg = "xrange() requires 1-3 int arguments";
977 int i, n;
978 long start, stop, step, len;
979 if (v != NULL && is_intobject(v))
980 start = 0, stop = getintvalue(v), step = 1;
981
982 else if (v == NULL || !is_tupleobject(v)) {
983 err_setstr(TypeError, errmsg);
984 return NULL;
985 }
986 else {
987 n = gettuplesize(v);
988 if (n < 1 || n > 3) {
989 err_setstr(TypeError, errmsg);
990 return NULL;
991 }
992 for (i = 0; i < n; i++) {
993 if (!is_intobject(gettupleitem(v, i))) {
994 err_setstr(TypeError, errmsg);
995 return NULL;
996 }
997 }
998 if (n == 3) {
999 step = getintvalue(gettupleitem(v, 2));
1000 --n;
1001 }
1002 else
1003 step = 1;
1004 stop = getintvalue(gettupleitem(v, --n));
1005 if (n > 0)
1006 start = getintvalue(gettupleitem(v, 0));
1007 else
1008 start = 0;
1009 }
1010
1011 if (step == 0) {
1012 err_setstr(ValueError, "zero step for xrange()");
1013 return NULL;
1014 }
1015
1016 len = (stop - start + step + ((step > 0) ? -1 : 1)) / step;
1017 if (len < 0)
1018 len = 0;
1019
Guido van Rossum7d6aa511993-12-21 22:50:31 +00001020 return newrangeobject(start, len, step, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001021}
1022
1023static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001024builtin_raw_input(self, v)
1025 object *self;
1026 object *v;
1027{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001028 object *f = sysget("stdout");
1029 if (f == NULL) {
1030 err_setstr(RuntimeError, "lost sys.stdout");
1031 return NULL;
1032 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001033 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +00001034 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001035 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001036 return NULL;
1037 }
Guido van Rossum26203aa1991-04-04 15:20:41 +00001038 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001039}
1040
1041static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001042builtin_reduce(self, args)
1043 object *self;
1044 object *args;
1045{
1046 object *seq, *func, *result;
1047 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001048 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001049
Guido van Rossum2d951851994-08-29 12:52:16 +00001050 if (getargs(args, "(OO)", &func, &seq))
1051 result = NULL;
1052 else {
1053 err_clear();
1054 if (!getargs(args, "(OOO)", &func, &seq, &result))
1055 return NULL;
1056 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001057 }
1058
1059 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1060 err_setstr(TypeError,
1061 "2nd argument to reduce() must be a sequence object");
1062 return NULL;
1063 }
1064
Guido van Rossum12d12c51993-10-26 17:58:25 +00001065 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001066 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001067
Guido van Rossum2d951851994-08-29 12:52:16 +00001068 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001069 object *op2;
1070
1071 if (args->ob_refcnt > 1) {
1072 DECREF(args);
1073 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001074 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001075 }
1076
Guido van Rossum2d951851994-08-29 12:52:16 +00001077 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1078 if (err_occurred() == IndexError) {
1079 err_clear();
1080 break;
1081 }
1082 goto Fail;
1083 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001084
Guido van Rossum2d951851994-08-29 12:52:16 +00001085 if (result == NULL)
1086 result = op2;
1087 else {
1088 settupleitem(args, 0, result);
1089 settupleitem(args, 1, op2);
1090 if ((result = call_object(func, args)) == NULL)
1091 goto Fail;
1092 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001093 }
1094
1095 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001096
Guido van Rossum2d951851994-08-29 12:52:16 +00001097 if (result == NULL)
1098 err_setstr(TypeError,
1099 "reduce of empty sequence with no initial value");
1100
Guido van Rossum12d12c51993-10-26 17:58:25 +00001101 return result;
1102
Guido van Rossum2d951851994-08-29 12:52:16 +00001103Fail:
1104 XDECREF(args);
1105 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001106 return NULL;
1107}
1108
1109static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001110builtin_reload(self, v)
1111 object *self;
1112 object *v;
1113{
1114 return reload_module(v);
1115}
1116
1117static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +00001118builtin_repr(self, v)
1119 object *self;
1120 object *v;
1121{
1122 if (v == NULL) {
1123 err_badarg();
1124 return NULL;
1125 }
1126 return reprobject(v);
1127}
1128
1129static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001130builtin_round(self, args)
1131 object *self;
1132 object *args;
1133{
1134 extern double floor PROTO((double));
1135 extern double ceil PROTO((double));
1136 double x;
1137 double f;
1138 int ndigits = 0;
1139 int sign = 1;
1140 int i;
1141 if (!getargs(args, "d", &x)) {
1142 err_clear();
1143 if (!getargs(args, "(di)", &x, &ndigits))
1144 return NULL;
1145 }
1146 f = 1.0;
1147 for (i = ndigits; --i >= 0; )
1148 f = f*10.0;
1149 for (i = ndigits; ++i <= 0; )
1150 f = f*0.1;
1151 if (x >= 0.0)
1152 return newfloatobject(floor(x*f + 0.5) / f);
1153 else
1154 return newfloatobject(ceil(x*f - 0.5) / f);
1155}
1156
1157static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +00001158builtin_str(self, v)
1159 object *self;
1160 object *v;
1161{
1162 if (v == NULL) {
1163 err_badarg();
1164 return NULL;
1165 }
Guido van Rossumc6004111993-11-05 10:22:19 +00001166 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001167}
1168
1169static object *
Guido van Rossumcae027b1994-08-29 12:53:11 +00001170builtin_tuple(self, v)
1171 object *self;
1172 object *v;
1173{
1174 sequence_methods *sqf;
1175 if (v == NULL)
1176 v = None; /* Force error later */
1177 if (is_tupleobject(v)) {
1178 INCREF(v);
1179 return v;
1180 }
1181 if (is_listobject(v)) {
1182 int n = getlistsize(v);
1183 object *t = newtupleobject(n);
1184 if (t != NULL) {
1185 int i;
1186 for (i = 0; i < n; i++) {
1187 object *item = getlistitem(v, i);
1188 INCREF(item);
1189 settupleitem(t, i, item);
1190 }
1191 }
1192 return t;
1193 }
1194 if (is_stringobject(v)) {
1195 int n = getstringsize(v);
1196 object *t = newtupleobject(n);
1197 if (t != NULL) {
1198 int i;
1199 char *p = getstringvalue(v);
1200 for (i = 0; i < n; i++) {
1201 object *item = newsizedstringobject(p+i, 1);
1202 if (item == NULL) {
1203 DECREF(t);
1204 t = NULL;
1205 break;
1206 }
1207 settupleitem(t, i, item);
1208 }
1209 }
1210 return t;
1211 }
1212 /* Generic sequence object */
1213 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1214 int n = (*sqf->sq_length)(v);
1215 int i;
1216 object *t;
1217 if (n < 0)
1218 return NULL;
1219 t = newtupleobject(n);
1220 if (t == NULL)
1221 return NULL;
1222 for (i = 0; i < n; i++) {
1223 object *item = (*sqf->sq_item)(v, i);
1224 if (item == NULL) {
1225 DECREF(t);
1226 t = NULL;
1227 break;
1228 }
1229 settupleitem(t, i, item);
1230 }
1231 /* XXX Should support indefinite-length sequences */
1232 return t;
1233 }
1234 /* None of the above */
1235 err_setstr(TypeError, "tuple() argument must be a sequence");
1236 return NULL;
1237}
1238
1239static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001240builtin_type(self, v)
1241 object *self;
1242 object *v;
1243{
1244 if (v == NULL) {
Guido van Rossumc89705d1992-11-26 08:54:07 +00001245 err_setstr(TypeError, "type() requires an argument");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001246 return NULL;
1247 }
1248 v = (object *)v->ob_type;
1249 INCREF(v);
1250 return v;
1251}
1252
Guido van Rossum2d951851994-08-29 12:52:16 +00001253static object *
1254builtin_vars(self, v)
1255 object *self;
1256 object *v;
1257{
1258 object *d;
1259 if (v == NULL) {
1260 d = getlocals();
1261 INCREF(d);
1262 }
1263 else {
1264 d = getattr(v, "__dict__");
1265 if (d == NULL) {
1266 err_setstr(TypeError,
1267 "vars() argument must have __dict__ attribute");
1268 return NULL;
1269 }
1270 }
1271 return d;
1272}
1273
Guido van Rossum3f5da241990-12-20 15:06:42 +00001274static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001275 {"abs", builtin_abs},
1276 {"apply", builtin_apply},
Guido van Rossum2d951851994-08-29 12:52:16 +00001277 {"callable", builtin_callable},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001278 {"chr", builtin_chr},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001279 {"cmp", builtin_cmp},
Guido van Rossum04691fc1992-08-12 15:35:34 +00001280 {"coerce", builtin_coerce},
Guido van Rossum5b722181993-03-30 17:46:03 +00001281 {"compile", builtin_compile},
Guido van Rossum14144fc1994-08-29 12:53:40 +00001282 {"delattr", builtin_delattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001283 {"dir", builtin_dir},
1284 {"divmod", builtin_divmod},
1285 {"eval", builtin_eval},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +00001286 {"execfile", builtin_execfile},
Guido van Rossume77a7571993-11-03 15:01:26 +00001287 {"filter", builtin_filter},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001288 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +00001289 {"getattr", builtin_getattr},
Guido van Rossum9bfef441993-03-29 10:43:31 +00001290 {"hasattr", builtin_hasattr},
1291 {"hash", builtin_hash},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001292 {"hex", builtin_hex},
Guido van Rossum5b722181993-03-30 17:46:03 +00001293 {"id", builtin_id},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001294 {"input", builtin_input},
1295 {"int", builtin_int},
1296 {"len", builtin_len},
1297 {"long", builtin_long},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001298 {"map", builtin_map},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001299 {"max", builtin_max},
1300 {"min", builtin_min},
1301 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +00001302 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001303 {"ord", builtin_ord},
1304 {"pow", builtin_pow},
1305 {"range", builtin_range},
1306 {"raw_input", builtin_raw_input},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001307 {"reduce", builtin_reduce},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001308 {"reload", builtin_reload},
Guido van Rossumc89705d1992-11-26 08:54:07 +00001309 {"repr", builtin_repr},
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001310 {"round", builtin_round},
Guido van Rossum33894be1992-01-27 16:53:09 +00001311 {"setattr", builtin_setattr},
Guido van Rossumc89705d1992-11-26 08:54:07 +00001312 {"str", builtin_str},
Guido van Rossumcae027b1994-08-29 12:53:11 +00001313 {"tuple", builtin_tuple},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001314 {"type", builtin_type},
Guido van Rossum2d951851994-08-29 12:52:16 +00001315 {"vars", builtin_vars},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001316 {"xrange", builtin_xrange},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001317 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001318};
1319
1320static object *builtin_dict;
1321
1322object *
1323getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +00001324 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001325{
Guido van Rossum2d951851994-08-29 12:52:16 +00001326 return mappinglookup(builtin_dict, name);
1327}
1328
1329int
1330setbuiltin(cname, value)
1331 char *cname;
1332 object *value;
1333{
1334 return dictinsert(builtin_dict, cname, value);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001335}
1336
1337/* Predefined exceptions */
1338
Guido van Rossum25831651993-05-19 14:50:45 +00001339object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001340object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001341object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001342object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001343object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001344object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001345object *IndexError;
1346object *KeyError;
1347object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001348object *MemoryError;
1349object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001350object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001351object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001352object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001353object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001354object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001355object *TypeError;
1356object *ValueError;
1357object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001358
Guido van Rossum3f5da241990-12-20 15:06:42 +00001359static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001360newstdexception(name)
1361 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001362{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001363 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001364 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1365 fatal("no mem for new standard exception");
1366 return v;
1367}
1368
1369static void
1370initerrors()
1371{
Guido van Rossum25831651993-05-19 14:50:45 +00001372 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001373 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001374 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001375 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001376 IOError = newstdexception("IOError");
1377 ImportError = newstdexception("ImportError");
1378 IndexError = newstdexception("IndexError");
1379 KeyError = newstdexception("KeyError");
1380 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001381 MemoryError = newstdexception("MemoryError");
1382 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001383 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001384 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001385 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001386 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001387 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001388 TypeError = newstdexception("TypeError");
1389 ValueError = newstdexception("ValueError");
1390 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001391}
1392
1393void
1394initbuiltin()
1395{
1396 object *m;
Guido van Rossum89b33251993-10-22 14:26:06 +00001397 m = initmodule("__builtin__", builtin_methods);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001398 builtin_dict = getmoduledict(m);
1399 INCREF(builtin_dict);
1400 initerrors();
1401 (void) dictinsert(builtin_dict, "None", None);
1402}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001403
1404/* Coerce two numeric types to the "larger" one.
1405 Increment the reference count on each argument.
1406 Return -1 and raise an exception if no coercion is possible
1407 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +00001408*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001409
1410int
1411coerce(pv, pw)
1412 object **pv, **pw;
1413{
1414 register object *v = *pv;
1415 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001416 int res;
1417
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001418 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001419 INCREF(v);
1420 INCREF(w);
1421 return 0;
1422 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001423 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
1424 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
1425 if (res <= 0)
1426 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001427 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001428 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
1429 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
1430 if (res <= 0)
1431 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001432 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001433 err_setstr(TypeError, "number coercion failed");
1434 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001435}
Guido van Rossum12d12c51993-10-26 17:58:25 +00001436
1437
Guido van Rossume77a7571993-11-03 15:01:26 +00001438/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001439
1440static object *
1441filtertuple(func, tuple)
1442 object *func;
1443 object *tuple;
1444{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001445 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001446 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001447 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001448
Guido van Rossum2586bf01993-11-01 16:21:44 +00001449 if ((result = newtupleobject(len)) == NULL)
1450 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001451
Guido van Rossum12d12c51993-10-26 17:58:25 +00001452 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001453 object *item, *good;
1454 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001455
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001456 if ((item = gettupleitem(tuple, i)) == NULL)
1457 goto Fail_1;
1458 if (func == None) {
1459 INCREF(item);
1460 good = item;
1461 }
1462 else {
1463 object *arg = mkvalue("(O)", item);
1464 if (arg == NULL)
1465 goto Fail_1;
1466 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001467 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001468 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001469 goto Fail_1;
1470 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001471 ok = testbool(good);
1472 DECREF(good);
1473 if (ok) {
1474 INCREF(item);
1475 if (settupleitem(result, j++, item) < 0)
1476 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001477 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001478 }
1479
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001480 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001481 return NULL;
1482
Guido van Rossum12d12c51993-10-26 17:58:25 +00001483 return result;
1484
Guido van Rossum12d12c51993-10-26 17:58:25 +00001485Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001486 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001487 return NULL;
1488}
1489
1490
Guido van Rossume77a7571993-11-03 15:01:26 +00001491/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001492
1493static object *
1494filterstring(func, strobj)
1495 object *func;
1496 object *strobj;
1497{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001498 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001499 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001500 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001501
Guido van Rossum2586bf01993-11-01 16:21:44 +00001502 if (func == None) {
1503 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001504 INCREF(strobj);
1505 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001506 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001507 if ((result = newsizedstringobject(NULL, len)) == NULL)
1508 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001509
Guido van Rossum12d12c51993-10-26 17:58:25 +00001510 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001511 object *item, *arg, *good;
1512 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001513
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001514 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1515 if (item == NULL)
1516 goto Fail_1;
1517 arg = mkvalue("(O)", item);
1518 DECREF(item);
1519 if (arg == NULL)
1520 goto Fail_1;
1521 good = call_object(func, arg);
1522 DECREF(arg);
1523 if (good == NULL)
1524 goto Fail_1;
1525 ok = testbool(good);
1526 DECREF(good);
1527 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001528 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001529 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001530 }
1531
Guido van Rossum12d12c51993-10-26 17:58:25 +00001532 if (resizestring(&result, j) < 0)
1533 return NULL;
1534
Guido van Rossum12d12c51993-10-26 17:58:25 +00001535 return result;
1536
Guido van Rossum12d12c51993-10-26 17:58:25 +00001537Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001538 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001539 return NULL;
1540}