blob: 3acf1870dcd8b8a93e61153429112172167ac993 [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;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000246 if (is_instanceobject(v) || is_instanceobject(w))
247 return instancebinop(v, w, "__coerce__", "__rcoerce__");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000248 if (coerce(&v, &w) < 0)
249 return NULL;
250 res = mkvalue("(OO)", v, w);
251 DECREF(v);
252 DECREF(w);
253 return res;
254}
255
256static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000257builtin_compile(self, args)
258 object *self;
259 object *args;
260{
261 char *str;
262 char *filename;
263 char *startstr;
264 int start;
265 if (!getargs(args, "(sss)", &str, &filename, &startstr))
266 return NULL;
267 if (strcmp(startstr, "exec") == 0)
268 start = file_input;
269 else if (strcmp(startstr, "eval") == 0)
270 start = eval_input;
271 else {
272 err_setstr(ValueError,
273 "compile() mode must be 'exec' or 'eval'");
274 return NULL;
275 }
276 return compile_string(str, filename, start);
277}
278
279static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000280builtin_dir(self, v)
281 object *self;
282 object *v;
283{
284 object *d;
285 if (v == NULL) {
286 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000287 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000288 }
289 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000290 d = getattr(v, "__dict__");
291 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000292 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000293 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000294 return NULL;
295 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000296 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000297 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000298 v = getdictkeys(d);
299 if (sortlist(v) != 0) {
300 DECREF(v);
301 v = NULL;
302 }
303 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000304 else {
305 v = newlistobject(0);
306 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000307 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000308 return v;
309}
310
311static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000312builtin_divmod(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000313 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000314 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000315{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000316 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000317 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000318 return NULL;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000319 if (is_instanceobject(v) || is_instanceobject(w))
320 return instancebinop(v, w, "__divmod__", "__rdivmod__");
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000321 if (v->ob_type->tp_as_number == NULL ||
322 w->ob_type->tp_as_number == NULL) {
Guido van Rossum180d7b41994-09-29 09:45:57 +0000323 err_setstr(TypeError, "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000324 return NULL;
325 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000326 if (coerce(&v, &w) != 0)
327 return NULL;
328 x = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
329 DECREF(v);
330 DECREF(w);
331 return x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000332}
333
334static object *
335exec_eval(v, start)
336 object *v;
337 int start;
338{
339 object *str = NULL, *globals = NULL, *locals = NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000340 char *s;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000341 int n;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000342 /* XXX This is a bit of a mess. Should make it varargs */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000343 if (v != NULL) {
Guido van Rossum5b722181993-03-30 17:46:03 +0000344 if (is_tupleobject(v) &&
Guido van Rossum3f5da241990-12-20 15:06:42 +0000345 ((n = gettuplesize(v)) == 2 || n == 3)) {
346 str = gettupleitem(v, 0);
347 globals = gettupleitem(v, 1);
348 if (n == 3)
349 locals = gettupleitem(v, 2);
350 }
Guido van Rossum5b722181993-03-30 17:46:03 +0000351 else
352 str = v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000353 }
Guido van Rossum5b722181993-03-30 17:46:03 +0000354 if (str == NULL || (!is_stringobject(str) && !is_codeobject(str)) ||
Guido van Rossum3f5da241990-12-20 15:06:42 +0000355 globals != NULL && !is_dictobject(globals) ||
356 locals != NULL && !is_dictobject(locals)) {
357 err_setstr(TypeError,
Guido van Rossum590baa41993-11-30 13:40:46 +0000358 "eval arguments must be (string|code)[,dict[,dict]]");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000359 return NULL;
360 }
Guido van Rossum590baa41993-11-30 13:40:46 +0000361
Guido van Rossum5b722181993-03-30 17:46:03 +0000362 if (is_codeobject(str))
363 return eval_code((codeobject *) str, globals, locals,
Guido van Rossum81daa321993-05-20 14:24:46 +0000364 (object *)NULL, (object *)NULL);
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000365 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000366 if (strlen(s) != getstringsize(str)) {
367 err_setstr(ValueError, "embedded '\\0' in string arg");
368 return NULL;
369 }
Guido van Rossum590baa41993-11-30 13:40:46 +0000370 if (start == eval_input) {
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000371 while (*s == ' ' || *s == '\t')
372 s++;
373 }
374 return run_string(s, start, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000375}
376
377static object *
378builtin_eval(self, v)
379 object *self;
380 object *v;
381{
382 return exec_eval(v, eval_input);
383}
384
385static object *
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000386builtin_execfile(self, v)
387 object *self;
388 object *v;
389{
390 object *str = NULL, *globals = NULL, *locals = NULL, *w;
391 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000392 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000393 int n;
394 if (v != NULL) {
395 if (is_stringobject(v))
396 str = v;
397 else if (is_tupleobject(v) &&
398 ((n = gettuplesize(v)) == 2 || n == 3)) {
399 str = gettupleitem(v, 0);
400 globals = gettupleitem(v, 1);
401 if (n == 3)
402 locals = gettupleitem(v, 2);
403 }
404 }
405 if (str == NULL || !is_stringobject(str) ||
406 globals != NULL && !is_dictobject(globals) ||
407 locals != NULL && !is_dictobject(locals)) {
408 err_setstr(TypeError,
409 "execfile arguments must be filename[,dict[,dict]]");
410 return NULL;
411 }
Guido van Rossum2b81dc91992-08-19 16:40:53 +0000412 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000413 if (strlen(s) != getstringsize(str)) {
414 err_setstr(ValueError, "embedded '\\0' in string arg");
415 return NULL;
416 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000417 BGN_SAVE
Guido van Rossum94390a41992-08-14 15:14:30 +0000418 fp = fopen(s, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000419 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000420 if (fp == NULL) {
421 err_setstr(IOError, "execfile cannot open the file argument");
422 return NULL;
423 }
424 w = run_file(fp, getstringvalue(str), file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000425 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000426 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000427 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000428 return w;
429}
430
431static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000432builtin_float(self, v)
433 object *self;
434 object *v;
435{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000436 number_methods *nb;
437
438 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
439 nb->nb_float == NULL) {
440 err_setstr(TypeError,
441 "float() argument can't be converted to float");
442 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000443 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000444 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000445}
446
447static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000448builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000449 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000450 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000451{
Guido van Rossum94390a41992-08-14 15:14:30 +0000452 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000453 object *name;
454 if (!getargs(args, "(OS)", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000455 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000456 return getattro(v, name);
457}
458
459static object *
460builtin_hasattr(self, args)
461 object *self;
462 object *args;
463{
464 object *v;
465 object *name;
466 if (!getargs(args, "(OS)", &v, &name))
467 return NULL;
468 v = getattro(v, name);
469 if (v == NULL) {
470 err_clear();
471 return newintobject(0L);
472 }
473 DECREF(v);
474 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000475}
476
477static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000478builtin_id(self, args)
479 object *self;
480 object *args;
481{
482 object *v;
483 if (!getargs(args, "O", &v))
484 return NULL;
485 return newintobject((long)v);
486}
487
488static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000489builtin_map(self, args)
490 object *self;
491 object *args;
492{
493 typedef struct {
494 object *seq;
495 sequence_methods *sqf;
496 int len;
497 } sequence;
498
499 object *func, *result;
500 sequence *seqs = NULL, *sqp;
501 int n, len, newfunc = 0;
502 register int i, j;
503
504 if (args == NULL || !is_tupleobject(args)) {
505 err_setstr(TypeError, "map() requires at least two args");
506 return NULL;
507 }
508
509 func = gettupleitem(args, 0);
510 n = gettuplesize(args) - 1;
511
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000512 if ((seqs = NEW(sequence, n)) == NULL) {
513 err_nomem();
514 goto Fail_2;
515 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000516
Guido van Rossum2d951851994-08-29 12:52:16 +0000517 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000518 int curlen;
519
520 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
521 goto Fail_2;
522
523 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
524 static char errmsg[] =
525 "argument %d to map() must be a sequence object";
526 char errbuf[sizeof(errmsg) + 3];
527
528 sprintf(errbuf, errmsg, i+2);
529 err_setstr(TypeError, errbuf);
530 goto Fail_2;
531 }
532
533 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
534 goto Fail_2;
535
536 if (curlen > len)
537 len = curlen;
538 }
539
540 if ((result = (object *) newlistobject(len)) == NULL)
541 goto Fail_2;
542
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000543 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000544 for (i = 0; ; ++i) {
545 object *arglist, *item, *value;
546 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000547
Guido van Rossum2d951851994-08-29 12:52:16 +0000548 if (func == None && n == 1)
549 arglist = NULL;
550 else {
551 if ((arglist = newtupleobject(n)) == NULL)
552 goto Fail_1;
553 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000554
555 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000556 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000557 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000558 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000559 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000560 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000561 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000562 if (item == NULL) {
563 if (i < sqp->len)
564 goto Fail_0;
565 if (err_occurred() == IndexError) {
566 err_clear();
567 INCREF(None);
568 item = None;
569 sqp->len = -1;
570 }
571 else {
572 goto Fail_0;
573 }
574 }
575 else
576 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000577
Guido van Rossum12d12c51993-10-26 17:58:25 +0000578 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000579 if (!arglist)
580 break;
581 if (settupleitem(arglist, j, item) < 0) {
582 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000583 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000584 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000585 continue;
586
587 Fail_0:
Guido van Rossum2d951851994-08-29 12:52:16 +0000588 XDECREF(arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000589 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000590 }
591
Guido van Rossum2d951851994-08-29 12:52:16 +0000592 if (!arglist)
593 arglist = item;
594
595 if (!any) {
596 DECREF(arglist);
597 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000598 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000599
600 if (func == None)
601 value = arglist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000602 else {
Guido van Rossum2d951851994-08-29 12:52:16 +0000603 value = call_object(func, arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000604 DECREF(arglist);
605 if (value == NULL)
606 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000607 }
608 if (i >= len) {
609 if (addlistitem(result, value) < 0)
610 goto Fail_1;
611 }
612 else {
613 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000614 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000615 }
616 }
617
Guido van Rossum2d951851994-08-29 12:52:16 +0000618 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000619 return result;
620
Guido van Rossum12d12c51993-10-26 17:58:25 +0000621Fail_1:
622 DECREF(result);
623Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000624 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000625 return NULL;
626}
627
628static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000629builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000630 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000631 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000632{
Guido van Rossum94390a41992-08-14 15:14:30 +0000633 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000634 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000635 object *value;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000636 if (!getargs(args, "(OSO)", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000637 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000638 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000639 return NULL;
640 INCREF(None);
641 return None;
642}
643
644static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000645builtin_delattr(self, args)
646 object *self;
647 object *args;
648{
649 object *v;
650 object *name;
651 if (!getargs(args, "(OS)", &v, &name))
652 return NULL;
653 if (setattro(v, name, (object *)NULL) != 0)
654 return NULL;
655 INCREF(None);
656 return None;
657}
658
659static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000660builtin_hash(self, args)
661 object *self;
662 object *args;
663{
664 object *v;
665 long x;
666 if (!getargs(args, "O", &v))
667 return NULL;
668 x = hashobject(v);
669 if (x == -1)
670 return NULL;
671 return newintobject(x);
672}
673
674static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000675builtin_hex(self, v)
676 object *self;
677 object *v;
678{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000679 number_methods *nb;
680
681 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
682 nb->nb_hex == NULL) {
683 err_setstr(TypeError,
684 "hex() argument can't be converted to hex");
685 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000686 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000687 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000688}
689
Guido van Rossum3165fe61992-09-25 21:59:05 +0000690static object *builtin_raw_input PROTO((object *, object *));
691
Guido van Rossum006bcd41991-10-24 14:54:44 +0000692static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000693builtin_input(self, v)
694 object *self;
695 object *v;
696{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000697 object *line = builtin_raw_input(self, v);
698 if (line == NULL)
699 return line;
700 v = exec_eval(line, eval_input);
701 DECREF(line);
702 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000703}
704
705static object *
706builtin_int(self, v)
707 object *self;
708 object *v;
709{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000710 number_methods *nb;
711
712 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
713 nb->nb_int == NULL) {
714 err_setstr(TypeError,
715 "int() argument can't be converted to int");
716 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000717 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000718 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000719}
720
721static object *
722builtin_len(self, v)
723 object *self;
724 object *v;
725{
726 long len;
727 typeobject *tp;
728 if (v == NULL) {
729 err_setstr(TypeError, "len() without argument");
730 return NULL;
731 }
732 tp = v->ob_type;
733 if (tp->tp_as_sequence != NULL) {
734 len = (*tp->tp_as_sequence->sq_length)(v);
735 }
736 else if (tp->tp_as_mapping != NULL) {
737 len = (*tp->tp_as_mapping->mp_length)(v);
738 }
739 else {
740 err_setstr(TypeError, "len() of unsized object");
741 return NULL;
742 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000743 if (len < 0)
744 return NULL;
745 else
746 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000747}
748
749static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000750builtin_long(self, v)
751 object *self;
752 object *v;
753{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000754 number_methods *nb;
755
756 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
757 nb->nb_long == NULL) {
758 err_setstr(TypeError,
759 "long() argument can't be converted to long");
760 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000761 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000762 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000763}
764
765static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000766min_max(v, sign)
767 object *v;
768 int sign;
769{
Guido van Rossum2d951851994-08-29 12:52:16 +0000770 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000771 object *w, *x;
772 sequence_methods *sq;
773 if (v == NULL) {
774 err_setstr(TypeError, "min() or max() without argument");
775 return NULL;
776 }
777 sq = v->ob_type->tp_as_sequence;
778 if (sq == NULL) {
779 err_setstr(TypeError, "min() or max() of non-sequence");
780 return NULL;
781 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000782 w = NULL;
783 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000784 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000785 if (x == NULL) {
786 if (err_occurred() == IndexError) {
787 err_clear();
788 break;
789 }
790 XDECREF(w);
791 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000792 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000793 if (w == NULL)
794 w = x;
795 else {
796 if (cmpobject(x, w) * sign > 0) {
797 DECREF(w);
798 w = x;
799 }
800 else
801 DECREF(x);
802 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000803 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000804 if (w == NULL)
805 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000806 return w;
807}
808
809static object *
810builtin_min(self, v)
811 object *self;
812 object *v;
813{
814 return min_max(v, -1);
815}
816
817static object *
818builtin_max(self, v)
819 object *self;
820 object *v;
821{
822 return min_max(v, 1);
823}
824
825static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000826builtin_oct(self, v)
827 object *self;
828 object *v;
829{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000830 number_methods *nb;
831
832 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
833 nb->nb_oct == NULL) {
834 err_setstr(TypeError,
835 "oct() argument can't be converted to oct");
836 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000837 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000838 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000839}
840
841static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000842builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000843 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000844 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000845{
Guido van Rossum2d951851994-08-29 12:52:16 +0000846 char *name;
847 char *mode = "r";
848 int bufsize = -1;
849 object *f;
850 if (!getargs(args, "s", &name) &&
851 (err_clear(), !getargs(args, "(ss)", &name, &mode)) &&
852 (err_clear(), !getargs(args, "(ssi)", &name, &mode, &bufsize)))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000853 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000854 f = newfileobject(name, mode);
855 if (f != NULL)
856 setfilebufsize(f, bufsize);
857 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000858}
859
860static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000861builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000862 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000863 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000864{
Guido van Rossum94390a41992-08-14 15:14:30 +0000865 char *s;
866 int len;
867 if (!getargs(args, "s#", &s, &len))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000868 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000869 if (len != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000870 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000871 return NULL;
872 }
Guido van Rossum94390a41992-08-14 15:14:30 +0000873 return newintobject((long)(s[0] & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000874}
875
876static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000877builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000878 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000879 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000880{
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000881 object *v, *w, *z, *x;
882 z = None;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000883 if (!newgetargs(args, "OO|O", &v, &w, &z))
884 return NULL;
885 if (z == None) {
886 if (is_instanceobject(v) || is_instanceobject(w))
887 return instancebinop(v, w, "__pow__", "__rpow__");
888 }
889 else {
890 /* XXX The ternary version doesn't do coercions */
891 if (is_instanceobject(v))
892 return v->ob_type->tp_as_number->nb_power(v, w, z);
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000893 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000894 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000895 (z!=None && z->ob_type->tp_as_number == NULL) ||
896 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000897 err_setstr(TypeError, "pow() requires numeric arguments");
898 return NULL;
899 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000900 if (coerce(&v, &w) != 0)
901 return NULL;
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000902 if (z!=None) {
903 if (coerce(&w, &z) != 0)
904 return NULL;
905 if (coerce(&v, &z) != 0)
906 return NULL;
907 }
908 x = (*v->ob_type->tp_as_number->nb_power)(v, w, z);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000909 DECREF(v);
910 DECREF(w);
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000911 if (z!=None) {DECREF(w); DECREF(v); DECREF(z); DECREF(z);}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000912 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000913}
914
915static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000916builtin_range(self, v)
917 object *self;
918 object *v;
919{
920 static char *errmsg = "range() requires 1-3 int arguments";
921 int i, n;
922 long ilow, ihigh, istep;
923 if (v != NULL && is_intobject(v)) {
924 ilow = 0; ihigh = getintvalue(v); istep = 1;
925 }
926 else if (v == NULL || !is_tupleobject(v)) {
927 err_setstr(TypeError, errmsg);
928 return NULL;
929 }
930 else {
931 n = gettuplesize(v);
932 if (n < 1 || n > 3) {
933 err_setstr(TypeError, errmsg);
934 return NULL;
935 }
936 for (i = 0; i < n; i++) {
937 if (!is_intobject(gettupleitem(v, i))) {
938 err_setstr(TypeError, errmsg);
939 return NULL;
940 }
941 }
942 if (n == 3) {
943 istep = getintvalue(gettupleitem(v, 2));
944 --n;
945 }
946 else
947 istep = 1;
948 ihigh = getintvalue(gettupleitem(v, --n));
949 if (n > 0)
950 ilow = getintvalue(gettupleitem(v, 0));
951 else
952 ilow = 0;
953 }
954 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000955 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000956 return NULL;
957 }
958 /* XXX ought to check overflow of subtraction */
959 if (istep > 0)
960 n = (ihigh - ilow + istep - 1) / istep;
961 else
962 n = (ihigh - ilow + istep + 1) / istep;
963 if (n < 0)
964 n = 0;
965 v = newlistobject(n);
966 if (v == NULL)
967 return NULL;
968 for (i = 0; i < n; i++) {
969 object *w = newintobject(ilow);
970 if (w == NULL) {
971 DECREF(v);
972 return NULL;
973 }
974 setlistitem(v, i, w);
975 ilow += istep;
976 }
977 return v;
978}
979
980static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000981builtin_xrange(self, v)
982 object *self;
983 object *v;
984{
985 static char *errmsg = "xrange() requires 1-3 int arguments";
986 int i, n;
987 long start, stop, step, len;
988 if (v != NULL && is_intobject(v))
989 start = 0, stop = getintvalue(v), step = 1;
990
991 else if (v == NULL || !is_tupleobject(v)) {
992 err_setstr(TypeError, errmsg);
993 return NULL;
994 }
995 else {
996 n = gettuplesize(v);
997 if (n < 1 || n > 3) {
998 err_setstr(TypeError, errmsg);
999 return NULL;
1000 }
1001 for (i = 0; i < n; i++) {
1002 if (!is_intobject(gettupleitem(v, i))) {
1003 err_setstr(TypeError, errmsg);
1004 return NULL;
1005 }
1006 }
1007 if (n == 3) {
1008 step = getintvalue(gettupleitem(v, 2));
1009 --n;
1010 }
1011 else
1012 step = 1;
1013 stop = getintvalue(gettupleitem(v, --n));
1014 if (n > 0)
1015 start = getintvalue(gettupleitem(v, 0));
1016 else
1017 start = 0;
1018 }
1019
1020 if (step == 0) {
1021 err_setstr(ValueError, "zero step for xrange()");
1022 return NULL;
1023 }
1024
1025 len = (stop - start + step + ((step > 0) ? -1 : 1)) / step;
1026 if (len < 0)
1027 len = 0;
1028
Guido van Rossum7d6aa511993-12-21 22:50:31 +00001029 return newrangeobject(start, len, step, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001030}
1031
1032static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001033builtin_raw_input(self, v)
1034 object *self;
1035 object *v;
1036{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001037 object *f = sysget("stdout");
1038 if (f == NULL) {
1039 err_setstr(RuntimeError, "lost sys.stdout");
1040 return NULL;
1041 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001042 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +00001043 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001044 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001045 return NULL;
1046 }
Guido van Rossum26203aa1991-04-04 15:20:41 +00001047 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001048}
1049
1050static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001051builtin_reduce(self, args)
1052 object *self;
1053 object *args;
1054{
1055 object *seq, *func, *result;
1056 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001057 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001058
Guido van Rossum2d951851994-08-29 12:52:16 +00001059 if (getargs(args, "(OO)", &func, &seq))
1060 result = NULL;
1061 else {
1062 err_clear();
1063 if (!getargs(args, "(OOO)", &func, &seq, &result))
1064 return NULL;
1065 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001066 }
1067
1068 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1069 err_setstr(TypeError,
1070 "2nd argument to reduce() must be a sequence object");
1071 return NULL;
1072 }
1073
Guido van Rossum12d12c51993-10-26 17:58:25 +00001074 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001075 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001076
Guido van Rossum2d951851994-08-29 12:52:16 +00001077 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001078 object *op2;
1079
1080 if (args->ob_refcnt > 1) {
1081 DECREF(args);
1082 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001083 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001084 }
1085
Guido van Rossum2d951851994-08-29 12:52:16 +00001086 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1087 if (err_occurred() == IndexError) {
1088 err_clear();
1089 break;
1090 }
1091 goto Fail;
1092 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001093
Guido van Rossum2d951851994-08-29 12:52:16 +00001094 if (result == NULL)
1095 result = op2;
1096 else {
1097 settupleitem(args, 0, result);
1098 settupleitem(args, 1, op2);
1099 if ((result = call_object(func, args)) == NULL)
1100 goto Fail;
1101 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001102 }
1103
1104 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001105
Guido van Rossum2d951851994-08-29 12:52:16 +00001106 if (result == NULL)
1107 err_setstr(TypeError,
1108 "reduce of empty sequence with no initial value");
1109
Guido van Rossum12d12c51993-10-26 17:58:25 +00001110 return result;
1111
Guido van Rossum2d951851994-08-29 12:52:16 +00001112Fail:
1113 XDECREF(args);
1114 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001115 return NULL;
1116}
1117
1118static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001119builtin_reload(self, v)
1120 object *self;
1121 object *v;
1122{
1123 return reload_module(v);
1124}
1125
1126static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +00001127builtin_repr(self, v)
1128 object *self;
1129 object *v;
1130{
1131 if (v == NULL) {
1132 err_badarg();
1133 return NULL;
1134 }
1135 return reprobject(v);
1136}
1137
1138static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001139builtin_round(self, args)
1140 object *self;
1141 object *args;
1142{
1143 extern double floor PROTO((double));
1144 extern double ceil PROTO((double));
1145 double x;
1146 double f;
1147 int ndigits = 0;
1148 int sign = 1;
1149 int i;
1150 if (!getargs(args, "d", &x)) {
1151 err_clear();
1152 if (!getargs(args, "(di)", &x, &ndigits))
1153 return NULL;
1154 }
1155 f = 1.0;
1156 for (i = ndigits; --i >= 0; )
1157 f = f*10.0;
1158 for (i = ndigits; ++i <= 0; )
1159 f = f*0.1;
1160 if (x >= 0.0)
1161 return newfloatobject(floor(x*f + 0.5) / f);
1162 else
1163 return newfloatobject(ceil(x*f - 0.5) / f);
1164}
1165
1166static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +00001167builtin_str(self, v)
1168 object *self;
1169 object *v;
1170{
1171 if (v == NULL) {
1172 err_badarg();
1173 return NULL;
1174 }
Guido van Rossumc6004111993-11-05 10:22:19 +00001175 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001176}
1177
1178static object *
Guido van Rossumcae027b1994-08-29 12:53:11 +00001179builtin_tuple(self, v)
1180 object *self;
1181 object *v;
1182{
1183 sequence_methods *sqf;
1184 if (v == NULL)
1185 v = None; /* Force error later */
1186 if (is_tupleobject(v)) {
1187 INCREF(v);
1188 return v;
1189 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001190 if (is_listobject(v))
1191 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001192 if (is_stringobject(v)) {
1193 int n = getstringsize(v);
1194 object *t = newtupleobject(n);
1195 if (t != NULL) {
1196 int i;
1197 char *p = getstringvalue(v);
1198 for (i = 0; i < n; i++) {
1199 object *item = newsizedstringobject(p+i, 1);
1200 if (item == NULL) {
1201 DECREF(t);
1202 t = NULL;
1203 break;
1204 }
1205 settupleitem(t, i, item);
1206 }
1207 }
1208 return t;
1209 }
1210 /* Generic sequence object */
1211 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1212 int n = (*sqf->sq_length)(v);
1213 int i;
1214 object *t;
1215 if (n < 0)
1216 return NULL;
1217 t = newtupleobject(n);
1218 if (t == NULL)
1219 return NULL;
1220 for (i = 0; i < n; i++) {
1221 object *item = (*sqf->sq_item)(v, i);
1222 if (item == NULL) {
1223 DECREF(t);
1224 t = NULL;
1225 break;
1226 }
1227 settupleitem(t, i, item);
1228 }
1229 /* XXX Should support indefinite-length sequences */
1230 return t;
1231 }
1232 /* None of the above */
1233 err_setstr(TypeError, "tuple() argument must be a sequence");
1234 return NULL;
1235}
1236
1237static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001238builtin_type(self, v)
1239 object *self;
1240 object *v;
1241{
1242 if (v == NULL) {
Guido van Rossumc89705d1992-11-26 08:54:07 +00001243 err_setstr(TypeError, "type() requires an argument");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001244 return NULL;
1245 }
1246 v = (object *)v->ob_type;
1247 INCREF(v);
1248 return v;
1249}
1250
Guido van Rossum2d951851994-08-29 12:52:16 +00001251static object *
1252builtin_vars(self, v)
1253 object *self;
1254 object *v;
1255{
1256 object *d;
1257 if (v == NULL) {
1258 d = getlocals();
1259 INCREF(d);
1260 }
1261 else {
1262 d = getattr(v, "__dict__");
1263 if (d == NULL) {
1264 err_setstr(TypeError,
1265 "vars() argument must have __dict__ attribute");
1266 return NULL;
1267 }
1268 }
1269 return d;
1270}
1271
Guido van Rossum3f5da241990-12-20 15:06:42 +00001272static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001273 {"abs", builtin_abs},
1274 {"apply", builtin_apply},
Guido van Rossum2d951851994-08-29 12:52:16 +00001275 {"callable", builtin_callable},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001276 {"chr", builtin_chr},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001277 {"cmp", builtin_cmp},
Guido van Rossum04691fc1992-08-12 15:35:34 +00001278 {"coerce", builtin_coerce},
Guido van Rossum5b722181993-03-30 17:46:03 +00001279 {"compile", builtin_compile},
Guido van Rossum14144fc1994-08-29 12:53:40 +00001280 {"delattr", builtin_delattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001281 {"dir", builtin_dir},
1282 {"divmod", builtin_divmod},
1283 {"eval", builtin_eval},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +00001284 {"execfile", builtin_execfile},
Guido van Rossume77a7571993-11-03 15:01:26 +00001285 {"filter", builtin_filter},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001286 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +00001287 {"getattr", builtin_getattr},
Guido van Rossum9bfef441993-03-29 10:43:31 +00001288 {"hasattr", builtin_hasattr},
1289 {"hash", builtin_hash},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001290 {"hex", builtin_hex},
Guido van Rossum5b722181993-03-30 17:46:03 +00001291 {"id", builtin_id},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001292 {"input", builtin_input},
1293 {"int", builtin_int},
1294 {"len", builtin_len},
1295 {"long", builtin_long},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001296 {"map", builtin_map},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001297 {"max", builtin_max},
1298 {"min", builtin_min},
1299 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +00001300 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001301 {"ord", builtin_ord},
1302 {"pow", builtin_pow},
1303 {"range", builtin_range},
1304 {"raw_input", builtin_raw_input},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001305 {"reduce", builtin_reduce},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001306 {"reload", builtin_reload},
Guido van Rossumc89705d1992-11-26 08:54:07 +00001307 {"repr", builtin_repr},
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001308 {"round", builtin_round},
Guido van Rossum33894be1992-01-27 16:53:09 +00001309 {"setattr", builtin_setattr},
Guido van Rossumc89705d1992-11-26 08:54:07 +00001310 {"str", builtin_str},
Guido van Rossumcae027b1994-08-29 12:53:11 +00001311 {"tuple", builtin_tuple},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001312 {"type", builtin_type},
Guido van Rossum2d951851994-08-29 12:52:16 +00001313 {"vars", builtin_vars},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001314 {"xrange", builtin_xrange},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001315 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001316};
1317
1318static object *builtin_dict;
1319
1320object *
1321getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +00001322 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001323{
Guido van Rossum2d951851994-08-29 12:52:16 +00001324 return mappinglookup(builtin_dict, name);
1325}
1326
1327int
1328setbuiltin(cname, value)
1329 char *cname;
1330 object *value;
1331{
1332 return dictinsert(builtin_dict, cname, value);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001333}
1334
1335/* Predefined exceptions */
1336
Guido van Rossum25831651993-05-19 14:50:45 +00001337object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001338object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001339object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001340object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001341object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001342object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001343object *IndexError;
1344object *KeyError;
1345object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001346object *MemoryError;
1347object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001348object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001349object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001350object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001351object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001352object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001353object *TypeError;
1354object *ValueError;
1355object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001356
Guido van Rossum3f5da241990-12-20 15:06:42 +00001357static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001358newstdexception(name)
1359 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001360{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001361 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001362 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1363 fatal("no mem for new standard exception");
1364 return v;
1365}
1366
1367static void
1368initerrors()
1369{
Guido van Rossum25831651993-05-19 14:50:45 +00001370 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001371 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001372 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001373 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001374 IOError = newstdexception("IOError");
1375 ImportError = newstdexception("ImportError");
1376 IndexError = newstdexception("IndexError");
1377 KeyError = newstdexception("KeyError");
1378 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001379 MemoryError = newstdexception("MemoryError");
1380 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001381 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001382 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001383 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001384 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001385 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001386 TypeError = newstdexception("TypeError");
1387 ValueError = newstdexception("ValueError");
1388 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001389}
1390
1391void
1392initbuiltin()
1393{
1394 object *m;
Guido van Rossum89b33251993-10-22 14:26:06 +00001395 m = initmodule("__builtin__", builtin_methods);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001396 builtin_dict = getmoduledict(m);
1397 INCREF(builtin_dict);
1398 initerrors();
1399 (void) dictinsert(builtin_dict, "None", None);
1400}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001401
1402/* Coerce two numeric types to the "larger" one.
1403 Increment the reference count on each argument.
1404 Return -1 and raise an exception if no coercion is possible
1405 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +00001406*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001407
1408int
1409coerce(pv, pw)
1410 object **pv, **pw;
1411{
1412 register object *v = *pv;
1413 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001414 int res;
1415
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001416 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001417 INCREF(v);
1418 INCREF(w);
1419 return 0;
1420 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001421 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
1422 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
1423 if (res <= 0)
1424 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001425 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001426 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
1427 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
1428 if (res <= 0)
1429 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001430 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001431 err_setstr(TypeError, "number coercion failed");
1432 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001433}
Guido van Rossum12d12c51993-10-26 17:58:25 +00001434
1435
Guido van Rossume77a7571993-11-03 15:01:26 +00001436/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001437
1438static object *
1439filtertuple(func, tuple)
1440 object *func;
1441 object *tuple;
1442{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001443 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001444 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001445 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001446
Guido van Rossum2586bf01993-11-01 16:21:44 +00001447 if ((result = newtupleobject(len)) == NULL)
1448 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001449
Guido van Rossum12d12c51993-10-26 17:58:25 +00001450 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001451 object *item, *good;
1452 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001453
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001454 if ((item = gettupleitem(tuple, i)) == NULL)
1455 goto Fail_1;
1456 if (func == None) {
1457 INCREF(item);
1458 good = item;
1459 }
1460 else {
1461 object *arg = mkvalue("(O)", item);
1462 if (arg == NULL)
1463 goto Fail_1;
1464 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001465 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001466 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001467 goto Fail_1;
1468 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001469 ok = testbool(good);
1470 DECREF(good);
1471 if (ok) {
1472 INCREF(item);
1473 if (settupleitem(result, j++, item) < 0)
1474 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001475 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001476 }
1477
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001478 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001479 return NULL;
1480
Guido van Rossum12d12c51993-10-26 17:58:25 +00001481 return result;
1482
Guido van Rossum12d12c51993-10-26 17:58:25 +00001483Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001484 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001485 return NULL;
1486}
1487
1488
Guido van Rossume77a7571993-11-03 15:01:26 +00001489/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001490
1491static object *
1492filterstring(func, strobj)
1493 object *func;
1494 object *strobj;
1495{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001496 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001497 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001498 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001499
Guido van Rossum2586bf01993-11-01 16:21:44 +00001500 if (func == None) {
1501 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001502 INCREF(strobj);
1503 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001504 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001505 if ((result = newsizedstringobject(NULL, len)) == NULL)
1506 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001507
Guido van Rossum12d12c51993-10-26 17:58:25 +00001508 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001509 object *item, *arg, *good;
1510 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001511
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001512 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1513 if (item == NULL)
1514 goto Fail_1;
1515 arg = mkvalue("(O)", item);
1516 DECREF(item);
1517 if (arg == NULL)
1518 goto Fail_1;
1519 good = call_object(func, arg);
1520 DECREF(arg);
1521 if (good == NULL)
1522 goto Fail_1;
1523 ok = testbool(good);
1524 DECREF(good);
1525 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001526 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001527 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001528 }
1529
Guido van Rossum12d12c51993-10-26 17:58:25 +00001530 if (resizestring(&result, j) < 0)
1531 return NULL;
1532
Guido van Rossum12d12c51993-10-26 17:58:25 +00001533 return result;
1534
Guido van Rossum12d12c51993-10-26 17:58:25 +00001535Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001536 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001537 return NULL;
1538}