blob: d8e0d2692324cc38cbf8c6fcbacb879985f53531 [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 Rossumc6bb8f71991-07-01 18:42:41 +0000862 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000863 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossumd4905451991-05-05 20:00:36 +0000864 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000865 if (v->ob_type->tp_as_number == NULL ||
866 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000867 err_setstr(TypeError, "pow() requires numeric arguments");
868 return NULL;
869 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000870 if (coerce(&v, &w) != 0)
871 return NULL;
872 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
873 DECREF(v);
874 DECREF(w);
875 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000876}
877
878static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000879builtin_range(self, v)
880 object *self;
881 object *v;
882{
883 static char *errmsg = "range() requires 1-3 int arguments";
884 int i, n;
885 long ilow, ihigh, istep;
886 if (v != NULL && is_intobject(v)) {
887 ilow = 0; ihigh = getintvalue(v); istep = 1;
888 }
889 else if (v == NULL || !is_tupleobject(v)) {
890 err_setstr(TypeError, errmsg);
891 return NULL;
892 }
893 else {
894 n = gettuplesize(v);
895 if (n < 1 || n > 3) {
896 err_setstr(TypeError, errmsg);
897 return NULL;
898 }
899 for (i = 0; i < n; i++) {
900 if (!is_intobject(gettupleitem(v, i))) {
901 err_setstr(TypeError, errmsg);
902 return NULL;
903 }
904 }
905 if (n == 3) {
906 istep = getintvalue(gettupleitem(v, 2));
907 --n;
908 }
909 else
910 istep = 1;
911 ihigh = getintvalue(gettupleitem(v, --n));
912 if (n > 0)
913 ilow = getintvalue(gettupleitem(v, 0));
914 else
915 ilow = 0;
916 }
917 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000918 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000919 return NULL;
920 }
921 /* XXX ought to check overflow of subtraction */
922 if (istep > 0)
923 n = (ihigh - ilow + istep - 1) / istep;
924 else
925 n = (ihigh - ilow + istep + 1) / istep;
926 if (n < 0)
927 n = 0;
928 v = newlistobject(n);
929 if (v == NULL)
930 return NULL;
931 for (i = 0; i < n; i++) {
932 object *w = newintobject(ilow);
933 if (w == NULL) {
934 DECREF(v);
935 return NULL;
936 }
937 setlistitem(v, i, w);
938 ilow += istep;
939 }
940 return v;
941}
942
943static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000944builtin_xrange(self, v)
945 object *self;
946 object *v;
947{
948 static char *errmsg = "xrange() requires 1-3 int arguments";
949 int i, n;
950 long start, stop, step, len;
951 if (v != NULL && is_intobject(v))
952 start = 0, stop = getintvalue(v), step = 1;
953
954 else if (v == NULL || !is_tupleobject(v)) {
955 err_setstr(TypeError, errmsg);
956 return NULL;
957 }
958 else {
959 n = gettuplesize(v);
960 if (n < 1 || n > 3) {
961 err_setstr(TypeError, errmsg);
962 return NULL;
963 }
964 for (i = 0; i < n; i++) {
965 if (!is_intobject(gettupleitem(v, i))) {
966 err_setstr(TypeError, errmsg);
967 return NULL;
968 }
969 }
970 if (n == 3) {
971 step = getintvalue(gettupleitem(v, 2));
972 --n;
973 }
974 else
975 step = 1;
976 stop = getintvalue(gettupleitem(v, --n));
977 if (n > 0)
978 start = getintvalue(gettupleitem(v, 0));
979 else
980 start = 0;
981 }
982
983 if (step == 0) {
984 err_setstr(ValueError, "zero step for xrange()");
985 return NULL;
986 }
987
988 len = (stop - start + step + ((step > 0) ? -1 : 1)) / step;
989 if (len < 0)
990 len = 0;
991
Guido van Rossum7d6aa511993-12-21 22:50:31 +0000992 return newrangeobject(start, len, step, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000993}
994
995static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000996builtin_raw_input(self, v)
997 object *self;
998 object *v;
999{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001000 object *f = sysget("stdout");
1001 if (f == NULL) {
1002 err_setstr(RuntimeError, "lost sys.stdout");
1003 return NULL;
1004 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001005 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +00001006 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001007 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001008 return NULL;
1009 }
Guido van Rossum26203aa1991-04-04 15:20:41 +00001010 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001011}
1012
1013static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001014builtin_reduce(self, args)
1015 object *self;
1016 object *args;
1017{
1018 object *seq, *func, *result;
1019 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001020 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001021
Guido van Rossum2d951851994-08-29 12:52:16 +00001022 if (getargs(args, "(OO)", &func, &seq))
1023 result = NULL;
1024 else {
1025 err_clear();
1026 if (!getargs(args, "(OOO)", &func, &seq, &result))
1027 return NULL;
1028 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001029 }
1030
1031 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1032 err_setstr(TypeError,
1033 "2nd argument to reduce() must be a sequence object");
1034 return NULL;
1035 }
1036
Guido van Rossum12d12c51993-10-26 17:58:25 +00001037 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001038 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001039
Guido van Rossum2d951851994-08-29 12:52:16 +00001040 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001041 object *op2;
1042
1043 if (args->ob_refcnt > 1) {
1044 DECREF(args);
1045 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001046 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001047 }
1048
Guido van Rossum2d951851994-08-29 12:52:16 +00001049 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1050 if (err_occurred() == IndexError) {
1051 err_clear();
1052 break;
1053 }
1054 goto Fail;
1055 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001056
Guido van Rossum2d951851994-08-29 12:52:16 +00001057 if (result == NULL)
1058 result = op2;
1059 else {
1060 settupleitem(args, 0, result);
1061 settupleitem(args, 1, op2);
1062 if ((result = call_object(func, args)) == NULL)
1063 goto Fail;
1064 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001065 }
1066
1067 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001068
Guido van Rossum2d951851994-08-29 12:52:16 +00001069 if (result == NULL)
1070 err_setstr(TypeError,
1071 "reduce of empty sequence with no initial value");
1072
Guido van Rossum12d12c51993-10-26 17:58:25 +00001073 return result;
1074
Guido van Rossum2d951851994-08-29 12:52:16 +00001075Fail:
1076 XDECREF(args);
1077 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001078 return NULL;
1079}
1080
1081static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001082builtin_reload(self, v)
1083 object *self;
1084 object *v;
1085{
1086 return reload_module(v);
1087}
1088
1089static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +00001090builtin_repr(self, v)
1091 object *self;
1092 object *v;
1093{
1094 if (v == NULL) {
1095 err_badarg();
1096 return NULL;
1097 }
1098 return reprobject(v);
1099}
1100
1101static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001102builtin_round(self, args)
1103 object *self;
1104 object *args;
1105{
1106 extern double floor PROTO((double));
1107 extern double ceil PROTO((double));
1108 double x;
1109 double f;
1110 int ndigits = 0;
1111 int sign = 1;
1112 int i;
1113 if (!getargs(args, "d", &x)) {
1114 err_clear();
1115 if (!getargs(args, "(di)", &x, &ndigits))
1116 return NULL;
1117 }
1118 f = 1.0;
1119 for (i = ndigits; --i >= 0; )
1120 f = f*10.0;
1121 for (i = ndigits; ++i <= 0; )
1122 f = f*0.1;
1123 if (x >= 0.0)
1124 return newfloatobject(floor(x*f + 0.5) / f);
1125 else
1126 return newfloatobject(ceil(x*f - 0.5) / f);
1127}
1128
1129static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +00001130builtin_str(self, v)
1131 object *self;
1132 object *v;
1133{
1134 if (v == NULL) {
1135 err_badarg();
1136 return NULL;
1137 }
Guido van Rossumc6004111993-11-05 10:22:19 +00001138 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001139}
1140
1141static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001142builtin_type(self, v)
1143 object *self;
1144 object *v;
1145{
1146 if (v == NULL) {
Guido van Rossumc89705d1992-11-26 08:54:07 +00001147 err_setstr(TypeError, "type() requires an argument");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001148 return NULL;
1149 }
1150 v = (object *)v->ob_type;
1151 INCREF(v);
1152 return v;
1153}
1154
Guido van Rossum2d951851994-08-29 12:52:16 +00001155static object *
1156builtin_vars(self, v)
1157 object *self;
1158 object *v;
1159{
1160 object *d;
1161 if (v == NULL) {
1162 d = getlocals();
1163 INCREF(d);
1164 }
1165 else {
1166 d = getattr(v, "__dict__");
1167 if (d == NULL) {
1168 err_setstr(TypeError,
1169 "vars() argument must have __dict__ attribute");
1170 return NULL;
1171 }
1172 }
1173 return d;
1174}
1175
Guido van Rossum3f5da241990-12-20 15:06:42 +00001176static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001177 {"abs", builtin_abs},
1178 {"apply", builtin_apply},
Guido van Rossum2d951851994-08-29 12:52:16 +00001179 {"callable", builtin_callable},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001180 {"chr", builtin_chr},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001181 {"cmp", builtin_cmp},
Guido van Rossum04691fc1992-08-12 15:35:34 +00001182 {"coerce", builtin_coerce},
Guido van Rossum5b722181993-03-30 17:46:03 +00001183 {"compile", builtin_compile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001184 {"dir", builtin_dir},
1185 {"divmod", builtin_divmod},
1186 {"eval", builtin_eval},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +00001187 {"execfile", builtin_execfile},
Guido van Rossume77a7571993-11-03 15:01:26 +00001188 {"filter", builtin_filter},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001189 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +00001190 {"getattr", builtin_getattr},
Guido van Rossum9bfef441993-03-29 10:43:31 +00001191 {"hasattr", builtin_hasattr},
1192 {"hash", builtin_hash},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001193 {"hex", builtin_hex},
Guido van Rossum5b722181993-03-30 17:46:03 +00001194 {"id", builtin_id},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001195 {"input", builtin_input},
1196 {"int", builtin_int},
1197 {"len", builtin_len},
1198 {"long", builtin_long},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001199 {"map", builtin_map},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001200 {"max", builtin_max},
1201 {"min", builtin_min},
1202 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +00001203 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001204 {"ord", builtin_ord},
1205 {"pow", builtin_pow},
1206 {"range", builtin_range},
1207 {"raw_input", builtin_raw_input},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001208 {"reduce", builtin_reduce},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001209 {"reload", builtin_reload},
Guido van Rossumc89705d1992-11-26 08:54:07 +00001210 {"repr", builtin_repr},
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001211 {"round", builtin_round},
Guido van Rossum33894be1992-01-27 16:53:09 +00001212 {"setattr", builtin_setattr},
Guido van Rossumc89705d1992-11-26 08:54:07 +00001213 {"str", builtin_str},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001214 {"type", builtin_type},
Guido van Rossum2d951851994-08-29 12:52:16 +00001215 {"vars", builtin_vars},
Guido van Rossum12d12c51993-10-26 17:58:25 +00001216 {"xrange", builtin_xrange},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001217 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001218};
1219
1220static object *builtin_dict;
1221
1222object *
1223getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +00001224 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001225{
Guido van Rossum2d951851994-08-29 12:52:16 +00001226 return mappinglookup(builtin_dict, name);
1227}
1228
1229int
1230setbuiltin(cname, value)
1231 char *cname;
1232 object *value;
1233{
1234 return dictinsert(builtin_dict, cname, value);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001235}
1236
1237/* Predefined exceptions */
1238
Guido van Rossum25831651993-05-19 14:50:45 +00001239object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001240object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001241object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001242object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001243object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001244object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001245object *IndexError;
1246object *KeyError;
1247object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001248object *MemoryError;
1249object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001250object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001251object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001252object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001253object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001254object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001255object *TypeError;
1256object *ValueError;
1257object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001258
Guido van Rossum3f5da241990-12-20 15:06:42 +00001259static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001260newstdexception(name)
1261 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001262{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001263 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001264 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1265 fatal("no mem for new standard exception");
1266 return v;
1267}
1268
1269static void
1270initerrors()
1271{
Guido van Rossum25831651993-05-19 14:50:45 +00001272 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001273 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001274 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001275 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001276 IOError = newstdexception("IOError");
1277 ImportError = newstdexception("ImportError");
1278 IndexError = newstdexception("IndexError");
1279 KeyError = newstdexception("KeyError");
1280 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001281 MemoryError = newstdexception("MemoryError");
1282 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001283 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001284 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001285 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001286 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001287 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001288 TypeError = newstdexception("TypeError");
1289 ValueError = newstdexception("ValueError");
1290 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001291}
1292
1293void
1294initbuiltin()
1295{
1296 object *m;
Guido van Rossum89b33251993-10-22 14:26:06 +00001297 m = initmodule("__builtin__", builtin_methods);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001298 builtin_dict = getmoduledict(m);
1299 INCREF(builtin_dict);
1300 initerrors();
1301 (void) dictinsert(builtin_dict, "None", None);
1302}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001303
1304/* Coerce two numeric types to the "larger" one.
1305 Increment the reference count on each argument.
1306 Return -1 and raise an exception if no coercion is possible
1307 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +00001308*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001309
1310int
1311coerce(pv, pw)
1312 object **pv, **pw;
1313{
1314 register object *v = *pv;
1315 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001316 int res;
1317
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001318 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001319 INCREF(v);
1320 INCREF(w);
1321 return 0;
1322 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001323 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
1324 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
1325 if (res <= 0)
1326 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001327 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001328 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
1329 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
1330 if (res <= 0)
1331 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001332 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001333 err_setstr(TypeError, "number coercion failed");
1334 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001335}
Guido van Rossum12d12c51993-10-26 17:58:25 +00001336
1337
Guido van Rossume77a7571993-11-03 15:01:26 +00001338/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001339
1340static object *
1341filtertuple(func, tuple)
1342 object *func;
1343 object *tuple;
1344{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001345 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001346 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001347 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001348
Guido van Rossum2586bf01993-11-01 16:21:44 +00001349 if ((result = newtupleobject(len)) == NULL)
1350 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001351
Guido van Rossum12d12c51993-10-26 17:58:25 +00001352 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001353 object *item, *good;
1354 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001355
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001356 if ((item = gettupleitem(tuple, i)) == NULL)
1357 goto Fail_1;
1358 if (func == None) {
1359 INCREF(item);
1360 good = item;
1361 }
1362 else {
1363 object *arg = mkvalue("(O)", item);
1364 if (arg == NULL)
1365 goto Fail_1;
1366 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001367 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001368 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001369 goto Fail_1;
1370 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001371 ok = testbool(good);
1372 DECREF(good);
1373 if (ok) {
1374 INCREF(item);
1375 if (settupleitem(result, j++, item) < 0)
1376 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001377 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001378 }
1379
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001380 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001381 return NULL;
1382
Guido van Rossum12d12c51993-10-26 17:58:25 +00001383 return result;
1384
Guido van Rossum12d12c51993-10-26 17:58:25 +00001385Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001386 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001387 return NULL;
1388}
1389
1390
Guido van Rossume77a7571993-11-03 15:01:26 +00001391/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001392
1393static object *
1394filterstring(func, strobj)
1395 object *func;
1396 object *strobj;
1397{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001398 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001399 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001400 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001401
Guido van Rossum2586bf01993-11-01 16:21:44 +00001402 if (func == None) {
1403 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001404 INCREF(strobj);
1405 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001406 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001407 if ((result = newsizedstringobject(NULL, len)) == NULL)
1408 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001409
Guido van Rossum12d12c51993-10-26 17:58:25 +00001410 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001411 object *item, *arg, *good;
1412 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001413
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001414 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1415 if (item == NULL)
1416 goto Fail_1;
1417 arg = mkvalue("(O)", item);
1418 DECREF(item);
1419 if (arg == NULL)
1420 goto Fail_1;
1421 good = call_object(func, arg);
1422 DECREF(arg);
1423 if (good == NULL)
1424 goto Fail_1;
1425 ok = testbool(good);
1426 DECREF(good);
1427 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001428 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001429 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001430 }
1431
Guido van Rossum12d12c51993-10-26 17:58:25 +00001432 if (resizestring(&result, j) < 0)
1433 return NULL;
1434
Guido van Rossum12d12c51993-10-26 17:58:25 +00001435 return result;
1436
Guido van Rossum12d12c51993-10-26 17:58:25 +00001437Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001438 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001439 return NULL;
1440}