blob: 7e872ade63c279bf06d05d2c9769d63d47310d2b [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 Rossum9bfef441993-03-29 10:43:31 +0000641builtin_hash(self, args)
642 object *self;
643 object *args;
644{
645 object *v;
646 long x;
647 if (!getargs(args, "O", &v))
648 return NULL;
649 x = hashobject(v);
650 if (x == -1)
651 return NULL;
652 return newintobject(x);
653}
654
655static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000656builtin_hex(self, v)
657 object *self;
658 object *v;
659{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000660 number_methods *nb;
661
662 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
663 nb->nb_hex == NULL) {
664 err_setstr(TypeError,
665 "hex() argument can't be converted to hex");
666 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000667 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000668 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000669}
670
Guido van Rossum3165fe61992-09-25 21:59:05 +0000671static object *builtin_raw_input PROTO((object *, object *));
672
Guido van Rossum006bcd41991-10-24 14:54:44 +0000673static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000674builtin_input(self, v)
675 object *self;
676 object *v;
677{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000678 object *line = builtin_raw_input(self, v);
679 if (line == NULL)
680 return line;
681 v = exec_eval(line, eval_input);
682 DECREF(line);
683 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000684}
685
686static object *
687builtin_int(self, v)
688 object *self;
689 object *v;
690{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000691 number_methods *nb;
692
693 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
694 nb->nb_int == NULL) {
695 err_setstr(TypeError,
696 "int() argument can't be converted to int");
697 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000698 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000699 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000700}
701
702static object *
703builtin_len(self, v)
704 object *self;
705 object *v;
706{
707 long len;
708 typeobject *tp;
709 if (v == NULL) {
710 err_setstr(TypeError, "len() without argument");
711 return NULL;
712 }
713 tp = v->ob_type;
714 if (tp->tp_as_sequence != NULL) {
715 len = (*tp->tp_as_sequence->sq_length)(v);
716 }
717 else if (tp->tp_as_mapping != NULL) {
718 len = (*tp->tp_as_mapping->mp_length)(v);
719 }
720 else {
721 err_setstr(TypeError, "len() of unsized object");
722 return NULL;
723 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000724 if (len < 0)
725 return NULL;
726 else
727 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000728}
729
730static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000731builtin_long(self, v)
732 object *self;
733 object *v;
734{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000735 number_methods *nb;
736
737 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
738 nb->nb_long == NULL) {
739 err_setstr(TypeError,
740 "long() argument can't be converted to long");
741 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000742 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000743 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000744}
745
746static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000747min_max(v, sign)
748 object *v;
749 int sign;
750{
Guido van Rossum2d951851994-08-29 12:52:16 +0000751 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000752 object *w, *x;
753 sequence_methods *sq;
754 if (v == NULL) {
755 err_setstr(TypeError, "min() or max() without argument");
756 return NULL;
757 }
758 sq = v->ob_type->tp_as_sequence;
759 if (sq == NULL) {
760 err_setstr(TypeError, "min() or max() of non-sequence");
761 return NULL;
762 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000763 w = NULL;
764 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000765 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000766 if (x == NULL) {
767 if (err_occurred() == IndexError) {
768 err_clear();
769 break;
770 }
771 XDECREF(w);
772 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000773 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000774 if (w == NULL)
775 w = x;
776 else {
777 if (cmpobject(x, w) * sign > 0) {
778 DECREF(w);
779 w = x;
780 }
781 else
782 DECREF(x);
783 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000784 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000785 if (w == NULL)
786 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000787 return w;
788}
789
790static object *
791builtin_min(self, v)
792 object *self;
793 object *v;
794{
795 return min_max(v, -1);
796}
797
798static object *
799builtin_max(self, v)
800 object *self;
801 object *v;
802{
803 return min_max(v, 1);
804}
805
806static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000807builtin_oct(self, v)
808 object *self;
809 object *v;
810{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000811 number_methods *nb;
812
813 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
814 nb->nb_oct == NULL) {
815 err_setstr(TypeError,
816 "oct() argument can't be converted to oct");
817 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000818 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000819 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000820}
821
822static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000823builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000824 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000825 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000826{
Guido van Rossum2d951851994-08-29 12:52:16 +0000827 char *name;
828 char *mode = "r";
829 int bufsize = -1;
830 object *f;
831 if (!getargs(args, "s", &name) &&
832 (err_clear(), !getargs(args, "(ss)", &name, &mode)) &&
833 (err_clear(), !getargs(args, "(ssi)", &name, &mode, &bufsize)))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000834 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000835 f = newfileobject(name, mode);
836 if (f != NULL)
837 setfilebufsize(f, bufsize);
838 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000839}
840
841static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000842builtin_ord(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 Rossum94390a41992-08-14 15:14:30 +0000846 char *s;
847 int len;
848 if (!getargs(args, "s#", &s, &len))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000849 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000850 if (len != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000851 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000852 return NULL;
853 }
Guido van Rossum94390a41992-08-14 15:14:30 +0000854 return newintobject((long)(s[0] & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000855}
856
857static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000858builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000859 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000860 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000861{
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000862 object *v, *w, *z, *x;
863 z = None;
864 if (!getargs(args, "(OO)", &v, &w)) {
865 err_clear();
866 if (!getargs(args, "(OOO)", &v, &w, &z)) {
867 return NULL;
868 }
869 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000870 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000871 (z!=None && z->ob_type->tp_as_number == NULL) ||
872 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000873 err_setstr(TypeError, "pow() requires numeric arguments");
874 return NULL;
875 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000876 if (coerce(&v, &w) != 0)
877 return NULL;
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000878 if (z!=None) {
879 if (coerce(&w, &z) != 0)
880 return NULL;
881 if (coerce(&v, &z) != 0)
882 return NULL;
883 }
884 x = (*v->ob_type->tp_as_number->nb_power)(v, w, z);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000885 DECREF(v);
886 DECREF(w);
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000887 if (z!=None) {DECREF(w); DECREF(v); DECREF(z); DECREF(z);}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000888 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000889}
890
891static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000892builtin_range(self, v)
893 object *self;
894 object *v;
895{
896 static char *errmsg = "range() requires 1-3 int arguments";
897 int i, n;
898 long ilow, ihigh, istep;
899 if (v != NULL && is_intobject(v)) {
900 ilow = 0; ihigh = getintvalue(v); istep = 1;
901 }
902 else if (v == NULL || !is_tupleobject(v)) {
903 err_setstr(TypeError, errmsg);
904 return NULL;
905 }
906 else {
907 n = gettuplesize(v);
908 if (n < 1 || n > 3) {
909 err_setstr(TypeError, errmsg);
910 return NULL;
911 }
912 for (i = 0; i < n; i++) {
913 if (!is_intobject(gettupleitem(v, i))) {
914 err_setstr(TypeError, errmsg);
915 return NULL;
916 }
917 }
918 if (n == 3) {
919 istep = getintvalue(gettupleitem(v, 2));
920 --n;
921 }
922 else
923 istep = 1;
924 ihigh = getintvalue(gettupleitem(v, --n));
925 if (n > 0)
926 ilow = getintvalue(gettupleitem(v, 0));
927 else
928 ilow = 0;
929 }
930 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000931 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000932 return NULL;
933 }
934 /* XXX ought to check overflow of subtraction */
935 if (istep > 0)
936 n = (ihigh - ilow + istep - 1) / istep;
937 else
938 n = (ihigh - ilow + istep + 1) / istep;
939 if (n < 0)
940 n = 0;
941 v = newlistobject(n);
942 if (v == NULL)
943 return NULL;
944 for (i = 0; i < n; i++) {
945 object *w = newintobject(ilow);
946 if (w == NULL) {
947 DECREF(v);
948 return NULL;
949 }
950 setlistitem(v, i, w);
951 ilow += istep;
952 }
953 return v;
954}
955
956static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000957builtin_xrange(self, v)
958 object *self;
959 object *v;
960{
961 static char *errmsg = "xrange() requires 1-3 int arguments";
962 int i, n;
963 long start, stop, step, len;
964 if (v != NULL && is_intobject(v))
965 start = 0, stop = getintvalue(v), step = 1;
966
967 else if (v == NULL || !is_tupleobject(v)) {
968 err_setstr(TypeError, errmsg);
969 return NULL;
970 }
971 else {
972 n = gettuplesize(v);
973 if (n < 1 || n > 3) {
974 err_setstr(TypeError, errmsg);
975 return NULL;
976 }
977 for (i = 0; i < n; i++) {
978 if (!is_intobject(gettupleitem(v, i))) {
979 err_setstr(TypeError, errmsg);
980 return NULL;
981 }
982 }
983 if (n == 3) {
984 step = getintvalue(gettupleitem(v, 2));
985 --n;
986 }
987 else
988 step = 1;
989 stop = getintvalue(gettupleitem(v, --n));
990 if (n > 0)
991 start = getintvalue(gettupleitem(v, 0));
992 else
993 start = 0;
994 }
995
996 if (step == 0) {
997 err_setstr(ValueError, "zero step for xrange()");
998 return NULL;
999 }
1000
1001 len = (stop - start + step + ((step > 0) ? -1 : 1)) / step;
1002 if (len < 0)
1003 len = 0;
1004
Guido van Rossum7d6aa511993-12-21 22:50:31 +00001005 return newrangeobject(start, len, step, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001006}
1007
1008static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001009builtin_raw_input(self, v)
1010 object *self;
1011 object *v;
1012{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001013 object *f = sysget("stdout");
1014 if (f == NULL) {
1015 err_setstr(RuntimeError, "lost sys.stdout");
1016 return NULL;
1017 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001018 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +00001019 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001020 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001021 return NULL;
1022 }
Guido van Rossum26203aa1991-04-04 15:20:41 +00001023 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001024}
1025
1026static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001027builtin_reduce(self, args)
1028 object *self;
1029 object *args;
1030{
1031 object *seq, *func, *result;
1032 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001033 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001034
Guido van Rossum2d951851994-08-29 12:52:16 +00001035 if (getargs(args, "(OO)", &func, &seq))
1036 result = NULL;
1037 else {
1038 err_clear();
1039 if (!getargs(args, "(OOO)", &func, &seq, &result))
1040 return NULL;
1041 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001042 }
1043
1044 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1045 err_setstr(TypeError,
1046 "2nd argument to reduce() must be a sequence object");
1047 return NULL;
1048 }
1049
Guido van Rossum12d12c51993-10-26 17:58:25 +00001050 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001051 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001052
Guido van Rossum2d951851994-08-29 12:52:16 +00001053 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001054 object *op2;
1055
1056 if (args->ob_refcnt > 1) {
1057 DECREF(args);
1058 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001059 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001060 }
1061
Guido van Rossum2d951851994-08-29 12:52:16 +00001062 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1063 if (err_occurred() == IndexError) {
1064 err_clear();
1065 break;
1066 }
1067 goto Fail;
1068 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001069
Guido van Rossum2d951851994-08-29 12:52:16 +00001070 if (result == NULL)
1071 result = op2;
1072 else {
1073 settupleitem(args, 0, result);
1074 settupleitem(args, 1, op2);
1075 if ((result = call_object(func, args)) == NULL)
1076 goto Fail;
1077 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001078 }
1079
1080 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001081
Guido van Rossum2d951851994-08-29 12:52:16 +00001082 if (result == NULL)
1083 err_setstr(TypeError,
1084 "reduce of empty sequence with no initial value");
1085
Guido van Rossum12d12c51993-10-26 17:58:25 +00001086 return result;
1087
Guido van Rossum2d951851994-08-29 12:52:16 +00001088Fail:
1089 XDECREF(args);
1090 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001091 return NULL;
1092}
1093
1094static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001095builtin_reload(self, v)
1096 object *self;
1097 object *v;
1098{
1099 return reload_module(v);
1100}
1101
1102static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +00001103builtin_repr(self, v)
1104 object *self;
1105 object *v;
1106{
1107 if (v == NULL) {
1108 err_badarg();
1109 return NULL;
1110 }
1111 return reprobject(v);
1112}
1113
1114static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001115builtin_round(self, args)
1116 object *self;
1117 object *args;
1118{
1119 extern double floor PROTO((double));
1120 extern double ceil PROTO((double));
1121 double x;
1122 double f;
1123 int ndigits = 0;
1124 int sign = 1;
1125 int i;
1126 if (!getargs(args, "d", &x)) {
1127 err_clear();
1128 if (!getargs(args, "(di)", &x, &ndigits))
1129 return NULL;
1130 }
1131 f = 1.0;
1132 for (i = ndigits; --i >= 0; )
1133 f = f*10.0;
1134 for (i = ndigits; ++i <= 0; )
1135 f = f*0.1;
1136 if (x >= 0.0)
1137 return newfloatobject(floor(x*f + 0.5) / f);
1138 else
1139 return newfloatobject(ceil(x*f - 0.5) / f);
1140}
1141
1142static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +00001143builtin_str(self, v)
1144 object *self;
1145 object *v;
1146{
1147 if (v == NULL) {
1148 err_badarg();
1149 return NULL;
1150 }
Guido van Rossumc6004111993-11-05 10:22:19 +00001151 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001152}
1153
1154static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001155builtin_type(self, v)
1156 object *self;
1157 object *v;
1158{
1159 if (v == NULL) {
Guido van Rossumc89705d1992-11-26 08:54:07 +00001160 err_setstr(TypeError, "type() requires an argument");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001161 return NULL;
1162 }
1163 v = (object *)v->ob_type;
1164 INCREF(v);
1165 return v;
1166}
1167
Guido van Rossum2d951851994-08-29 12:52:16 +00001168static object *
1169builtin_vars(self, v)
1170 object *self;
1171 object *v;
1172{
1173 object *d;
1174 if (v == NULL) {
1175 d = getlocals();
1176 INCREF(d);
1177 }
1178 else {
1179 d = getattr(v, "__dict__");
1180 if (d == NULL) {
1181 err_setstr(TypeError,
1182 "vars() argument must have __dict__ attribute");
1183 return NULL;
1184 }
1185 }
1186 return d;
1187}
1188
Guido van Rossum3f5da241990-12-20 15:06:42 +00001189static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001190 {"abs", builtin_abs},
1191 {"apply", builtin_apply},
Guido van Rossum2d951851994-08-29 12:52:16 +00001192 {"callable", builtin_callable},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001193 {"chr", builtin_chr},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001194 {"cmp", builtin_cmp},
Guido van Rossum04691fc1992-08-12 15:35:34 +00001195 {"coerce", builtin_coerce},
Guido van Rossum5b722181993-03-30 17:46:03 +00001196 {"compile", builtin_compile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001197 {"dir", builtin_dir},
1198 {"divmod", builtin_divmod},
1199 {"eval", builtin_eval},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +00001200 {"execfile", builtin_execfile},
Guido van Rossume77a7571993-11-03 15:01:26 +00001201 {"filter", builtin_filter},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001202 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +00001203 {"getattr", builtin_getattr},
Guido van Rossum9bfef441993-03-29 10:43:31 +00001204 {"hasattr", builtin_hasattr},
1205 {"hash", builtin_hash},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001206 {"hex", builtin_hex},
Guido van Rossum5b722181993-03-30 17:46:03 +00001207 {"id", builtin_id},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001208 {"input", builtin_input},
1209 {"int", builtin_int},
1210 {"len", builtin_len},
1211 {"long", builtin_long},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001212 {"map", builtin_map},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001213 {"max", builtin_max},
1214 {"min", builtin_min},
1215 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +00001216 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001217 {"ord", builtin_ord},
1218 {"pow", builtin_pow},
1219 {"range", builtin_range},
1220 {"raw_input", builtin_raw_input},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001221 {"reduce", builtin_reduce},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001222 {"reload", builtin_reload},
Guido van Rossumc89705d1992-11-26 08:54:07 +00001223 {"repr", builtin_repr},
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001224 {"round", builtin_round},
Guido van Rossum33894be1992-01-27 16:53:09 +00001225 {"setattr", builtin_setattr},
Guido van Rossumc89705d1992-11-26 08:54:07 +00001226 {"str", builtin_str},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001227 {"type", builtin_type},
Guido van Rossum2d951851994-08-29 12:52:16 +00001228 {"vars", builtin_vars},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001229 {"xrange", builtin_xrange},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001230 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001231};
1232
1233static object *builtin_dict;
1234
1235object *
1236getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +00001237 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001238{
Guido van Rossum2d951851994-08-29 12:52:16 +00001239 return mappinglookup(builtin_dict, name);
1240}
1241
1242int
1243setbuiltin(cname, value)
1244 char *cname;
1245 object *value;
1246{
1247 return dictinsert(builtin_dict, cname, value);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001248}
1249
1250/* Predefined exceptions */
1251
Guido van Rossum25831651993-05-19 14:50:45 +00001252object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001253object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001254object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001255object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001256object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001257object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001258object *IndexError;
1259object *KeyError;
1260object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001261object *MemoryError;
1262object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001263object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001264object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001265object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001266object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001267object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001268object *TypeError;
1269object *ValueError;
1270object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001271
Guido van Rossum3f5da241990-12-20 15:06:42 +00001272static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001273newstdexception(name)
1274 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001275{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001276 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001277 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1278 fatal("no mem for new standard exception");
1279 return v;
1280}
1281
1282static void
1283initerrors()
1284{
Guido van Rossum25831651993-05-19 14:50:45 +00001285 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001286 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001287 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001288 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001289 IOError = newstdexception("IOError");
1290 ImportError = newstdexception("ImportError");
1291 IndexError = newstdexception("IndexError");
1292 KeyError = newstdexception("KeyError");
1293 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001294 MemoryError = newstdexception("MemoryError");
1295 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001296 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001297 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001298 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001299 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001300 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001301 TypeError = newstdexception("TypeError");
1302 ValueError = newstdexception("ValueError");
1303 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001304}
1305
1306void
1307initbuiltin()
1308{
1309 object *m;
Guido van Rossum89b33251993-10-22 14:26:06 +00001310 m = initmodule("__builtin__", builtin_methods);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001311 builtin_dict = getmoduledict(m);
1312 INCREF(builtin_dict);
1313 initerrors();
1314 (void) dictinsert(builtin_dict, "None", None);
1315}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001316
1317/* Coerce two numeric types to the "larger" one.
1318 Increment the reference count on each argument.
1319 Return -1 and raise an exception if no coercion is possible
1320 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +00001321*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001322
1323int
1324coerce(pv, pw)
1325 object **pv, **pw;
1326{
1327 register object *v = *pv;
1328 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001329 int res;
1330
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001331 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001332 INCREF(v);
1333 INCREF(w);
1334 return 0;
1335 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001336 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
1337 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
1338 if (res <= 0)
1339 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001340 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001341 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
1342 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
1343 if (res <= 0)
1344 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001345 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001346 err_setstr(TypeError, "number coercion failed");
1347 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001348}
Guido van Rossum12d12c51993-10-26 17:58:25 +00001349
1350
Guido van Rossume77a7571993-11-03 15:01:26 +00001351/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001352
1353static object *
1354filtertuple(func, tuple)
1355 object *func;
1356 object *tuple;
1357{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001358 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001359 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001360 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001361
Guido van Rossum2586bf01993-11-01 16:21:44 +00001362 if ((result = newtupleobject(len)) == NULL)
1363 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001364
Guido van Rossum12d12c51993-10-26 17:58:25 +00001365 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001366 object *item, *good;
1367 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001368
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001369 if ((item = gettupleitem(tuple, i)) == NULL)
1370 goto Fail_1;
1371 if (func == None) {
1372 INCREF(item);
1373 good = item;
1374 }
1375 else {
1376 object *arg = mkvalue("(O)", item);
1377 if (arg == NULL)
1378 goto Fail_1;
1379 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001380 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001381 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001382 goto Fail_1;
1383 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001384 ok = testbool(good);
1385 DECREF(good);
1386 if (ok) {
1387 INCREF(item);
1388 if (settupleitem(result, j++, item) < 0)
1389 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001390 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001391 }
1392
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001393 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001394 return NULL;
1395
Guido van Rossum12d12c51993-10-26 17:58:25 +00001396 return result;
1397
Guido van Rossum12d12c51993-10-26 17:58:25 +00001398Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001399 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001400 return NULL;
1401}
1402
1403
Guido van Rossume77a7571993-11-03 15:01:26 +00001404/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001405
1406static object *
1407filterstring(func, strobj)
1408 object *func;
1409 object *strobj;
1410{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001411 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001412 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001413 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001414
Guido van Rossum2586bf01993-11-01 16:21:44 +00001415 if (func == None) {
1416 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001417 INCREF(strobj);
1418 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001419 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001420 if ((result = newsizedstringobject(NULL, len)) == NULL)
1421 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001422
Guido van Rossum12d12c51993-10-26 17:58:25 +00001423 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001424 object *item, *arg, *good;
1425 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001426
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001427 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1428 if (item == NULL)
1429 goto Fail_1;
1430 arg = mkvalue("(O)", item);
1431 DECREF(item);
1432 if (arg == NULL)
1433 goto Fail_1;
1434 good = call_object(func, arg);
1435 DECREF(arg);
1436 if (good == NULL)
1437 goto Fail_1;
1438 ok = testbool(good);
1439 DECREF(good);
1440 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001441 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001442 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001443 }
1444
Guido van Rossum12d12c51993-10-26 17:58:25 +00001445 if (resizestring(&result, j) < 0)
1446 return NULL;
1447
Guido van Rossum12d12c51993-10-26 17:58:25 +00001448 return result;
1449
Guido van Rossum12d12c51993-10-26 17:58:25 +00001450Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001451 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001452 return NULL;
1453}