blob: b3ac3c6a555cf7a2e5ff81d351a766e44f20ca49 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The 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 *));
Guido van Rossum12d12c51993-10-26 17:58:25 +000043
Guido van Rossum3f5da241990-12-20 15:06:42 +000044static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000045builtin___import__(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000046 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000047 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000048{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000049 char *name;
50 object *m;
51
52 if (!newgetargs(args, "s:__import__", &name))
53 return NULL;
54 m = import_module(name);
55 XINCREF(m);
56
57 return m;
58}
59
60
61static object *
62builtin_abs(self, args)
63 object *self;
64 object *args;
65{
66 object *v;
Guido van Rossumd4905451991-05-05 20:00:36 +000067 number_methods *nm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000068
69 if (!newgetargs(args, "O:abs", &v))
70 return NULL;
71 if ((nm = v->ob_type->tp_as_number) == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +000072 err_setstr(TypeError, "abs() requires numeric argument");
73 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000074 }
Guido van Rossumd4905451991-05-05 20:00:36 +000075 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000076}
77
78static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000079builtin_apply(self, args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000080 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000081 object *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000082{
Guido van Rossum94390a41992-08-14 15:14:30 +000083 object *func, *arglist;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000084
85 if (!newgetargs(args, "OO:apply", &func, &arglist))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000086 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +000087 if (!is_tupleobject(arglist)) {
88 err_setstr(TypeError, "apply() 2nd argument must be tuple");
89 return NULL;
90 }
Guido van Rossum94390a41992-08-14 15:14:30 +000091 return call_object(func, arglist);
Guido van Rossumc02e15c1991-12-16 13:03:00 +000092}
93
Guido van Rossum2d951851994-08-29 12:52:16 +000094static int
95callable(x)
96 object *x;
97{
98 if (x == NULL)
99 return 0;
100 if (x->ob_type->tp_call != NULL ||
101 is_funcobject(x) ||
102 is_instancemethodobject(x) ||
103 is_methodobject(x) ||
104 is_classobject(x))
105 return 1;
106 if (is_instanceobject(x)) {
107 object *call = getattr(x, "__call__");
108 if (call == NULL) {
109 err_clear();
110 return 0;
111 }
112 /* Could test recursively but don't, for fear of endless
113 recursion if some joker sets self.__call__ = self */
114 DECREF(call);
115 return 1;
116 }
117 return 0;
118}
119
120static object *
121builtin_callable(self, args)
122 object *self;
123 object *args;
124{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000125 object *v;
126
127 if (!newgetargs(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000128 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000129 return newintobject((long)callable(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000130}
131
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000132static object *
Guido van Rossume77a7571993-11-03 15:01:26 +0000133builtin_filter(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000134 object *self;
135 object *args;
136{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000137 object *func, *seq, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000138 sequence_methods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000139 int len;
140 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000141
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000142 if (!newgetargs(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000143 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000144
Guido van Rossum12d12c51993-10-26 17:58:25 +0000145 if (is_stringobject(seq)) {
146 object *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000147 return r;
148 }
149
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000150 if (is_tupleobject(seq)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000151 object *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000152 return r;
153 }
154
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000155 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000156 err_setstr(TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000157 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000158 goto Fail_2;
159 }
160
161 if ((len = (*sqf->sq_length)(seq)) < 0)
162 goto Fail_2;
163
164 if (is_listobject(seq) && seq->ob_refcnt == 1) {
165 INCREF(seq);
166 result = seq;
167 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000168 else {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000169 if ((result = newlistobject(len)) == NULL)
170 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000171 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000172
Guido van Rossum2d951851994-08-29 12:52:16 +0000173 for (i = j = 0; ; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000174 object *item, *good;
175 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000176
Guido van Rossum2d951851994-08-29 12:52:16 +0000177 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
178 if (i < len)
179 goto Fail_1;
180 if (err_occurred() == IndexError) {
181 err_clear();
182 break;
183 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000184 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000185 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000186
187 if (func == None) {
188 good = item;
Guido van Rossum58b68731995-01-10 17:40:55 +0000189 INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000190 }
191 else {
192 object *arg = mkvalue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000193 if (arg == NULL)
194 goto Fail_1;
195 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000196 DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000197 if (good == NULL) {
198 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000199 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000200 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000201 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000202 ok = testbool(good);
203 DECREF(good);
204 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000205 if (j < len) {
206 if (setlistitem(result, j++, item) < 0)
207 goto Fail_1;
208 }
209 else {
210 j++;
211 if (addlistitem(result, item) < 0)
212 goto Fail_1;
213 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000214 } else {
215 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000216 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000217 }
218
Guido van Rossum12d12c51993-10-26 17:58:25 +0000219
Guido van Rossum2d951851994-08-29 12:52:16 +0000220 if (j < len && setlistslice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000221 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000222
Guido van Rossum12d12c51993-10-26 17:58:25 +0000223 return result;
224
Guido van Rossum12d12c51993-10-26 17:58:25 +0000225Fail_1:
226 DECREF(result);
227Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000228 return NULL;
229}
230
231static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000232builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000233 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000234 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000235{
236 long x;
237 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000238
239 if (!newgetargs(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000240 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000241 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000242 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000243 return NULL;
244 }
245 s[0] = x;
246 return newsizedstringobject(s, 1);
247}
248
249static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000250builtin_cmp(self, args)
251 object *self;
252 object *args;
253{
254 object *a, *b;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000255
256 if (!newgetargs(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000257 return NULL;
258 return newintobject((long)cmpobject(a, b));
259}
260
261static object *
Guido van Rossum5524a591995-01-10 15:26:20 +0000262builtin_coerce(self, args)
263 object *self;
264 object *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000265{
Guido van Rossum5524a591995-01-10 15:26:20 +0000266 object *v, *w;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000267 object *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000268
269 if (!newgetargs(args, "OO:coerce", &v, &w))
270 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000271 if (coerce(&v, &w) < 0)
272 return NULL;
273 res = mkvalue("(OO)", v, w);
274 DECREF(v);
275 DECREF(w);
276 return res;
277}
278
279static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000280builtin_compile(self, args)
281 object *self;
282 object *args;
283{
284 char *str;
285 char *filename;
286 char *startstr;
287 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000288
289 if (!newgetargs(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000290 return NULL;
291 if (strcmp(startstr, "exec") == 0)
292 start = file_input;
293 else if (strcmp(startstr, "eval") == 0)
294 start = eval_input;
295 else {
296 err_setstr(ValueError,
297 "compile() mode must be 'exec' or 'eval'");
298 return NULL;
299 }
300 return compile_string(str, filename, start);
301}
302
303static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000304builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000305 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000306 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000307{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000308 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000309 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000310
311 if (!newgetargs(args, "|O:dir", &v))
312 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000313 if (v == NULL) {
314 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000315 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000316 }
317 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000318 d = getattr(v, "__dict__");
319 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000320 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000321 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000322 return NULL;
323 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000324 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000325 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000326 v = getdictkeys(d);
327 if (sortlist(v) != 0) {
328 DECREF(v);
329 v = NULL;
330 }
331 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000332 else {
333 v = newlistobject(0);
334 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000335 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000336 return v;
337}
338
339static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000340do_divmod(v, w)
341 object *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000342{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000343 object *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000344
Guido van Rossum180d7b41994-09-29 09:45:57 +0000345 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000346 return instancebinop(v, w, "__divmod__", "__rdivmod__",
347 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000348 if (v->ob_type->tp_as_number == NULL ||
349 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000350 err_setstr(TypeError,
351 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000352 return NULL;
353 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000354 if (coerce(&v, &w) != 0)
355 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000356 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000357 DECREF(v);
358 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000359 return res;
360}
361
362static object *
363builtin_divmod(self, args)
364 object *self;
365 object *args;
366{
367 object *v, *w;
368
369 if (!newgetargs(args, "OO:divmod", &v, &w))
370 return NULL;
371 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000372}
373
374static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000375builtin_eval(self, args)
376 object *self;
377 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000378{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000379 object *cmd;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000380 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000381 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000382
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000383 if (!newgetargs(args, "O|O!O!:eval",
384 &cmd,
385 &Mappingtype, &globals,
386 &Mappingtype, &locals))
387 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000388 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000389 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000390 if (locals == None)
391 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000392 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000393 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000394 locals = globals;
395 if (dictlookup(globals, "__builtins__") == NULL) {
396 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
397 return NULL;
398 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000399 if (is_codeobject(cmd))
400 return eval_code((codeobject *) cmd, globals, locals,
Guido van Rossum81daa321993-05-20 14:24:46 +0000401 (object *)NULL, (object *)NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000402 if (!is_stringobject(cmd)) {
403 err_setstr(TypeError,
404 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000405 return NULL;
406 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000407 str = getstringvalue(cmd);
408 if (strlen(str) != getstringsize(cmd)) {
409 err_setstr(ValueError,
410 "embedded '\\0' in string arg");
411 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000412 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000413 while (*str == ' ' || *str == '\t')
414 str++;
415 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000416}
417
418static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000419builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000420 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000421 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000422{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000423 char *filename;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000424 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000426 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000427 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000428 int n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000429
430 if (!newgetargs(args, "s|O!O!:execfile",
431 &filename,
432 &Mappingtype, &globals,
433 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000434 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000435 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000436 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000437 if (locals == None)
438 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000439 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000440 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000441 locals = globals;
442 if (dictlookup(globals, "__builtins__") == NULL) {
443 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
444 return NULL;
445 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000446 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000447 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000448 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000449 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000451 return NULL;
452 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000453 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000454 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000455 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000456 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000457 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000458}
459
460static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000461builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000462 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000463 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000464{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000465 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000466 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000467
468 if (!newgetargs(args, "O:float", &v))
469 return NULL;
470 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000471 nb->nb_float == NULL) {
472 err_setstr(TypeError,
473 "float() argument can't be converted to float");
474 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000475 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000476 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000477}
478
479static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000480builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000481 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000482 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000483{
Guido van Rossum94390a41992-08-14 15:14:30 +0000484 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000485 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000486
487 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000488 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000489 return getattro(v, name);
490}
491
492static object *
493builtin_hasattr(self, args)
494 object *self;
495 object *args;
496{
497 object *v;
498 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000499
500 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000501 return NULL;
502 v = getattro(v, name);
503 if (v == NULL) {
504 err_clear();
505 return newintobject(0L);
506 }
507 DECREF(v);
508 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000509}
510
511static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000512builtin_id(self, args)
513 object *self;
514 object *args;
515{
516 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000517
518 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000519 return NULL;
520 return newintobject((long)v);
521}
522
523static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000524builtin_map(self, args)
525 object *self;
526 object *args;
527{
528 typedef struct {
529 object *seq;
530 sequence_methods *sqf;
531 int len;
532 } sequence;
533
534 object *func, *result;
535 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000536 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000537 register int i, j;
538
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000539 n = gettuplesize(args);
540 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000541 err_setstr(TypeError, "map() requires at least two args");
542 return NULL;
543 }
544
545 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000546 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000547
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000548 if ((seqs = NEW(sequence, n)) == NULL) {
549 err_nomem();
550 goto Fail_2;
551 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000552
Guido van Rossum2d951851994-08-29 12:52:16 +0000553 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000554 int curlen;
555
556 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
557 goto Fail_2;
558
559 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
560 static char errmsg[] =
561 "argument %d to map() must be a sequence object";
562 char errbuf[sizeof(errmsg) + 3];
563
564 sprintf(errbuf, errmsg, i+2);
565 err_setstr(TypeError, errbuf);
566 goto Fail_2;
567 }
568
569 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
570 goto Fail_2;
571
572 if (curlen > len)
573 len = curlen;
574 }
575
576 if ((result = (object *) newlistobject(len)) == NULL)
577 goto Fail_2;
578
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000579 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000580 for (i = 0; ; ++i) {
581 object *arglist, *item, *value;
582 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000583
Guido van Rossum2d951851994-08-29 12:52:16 +0000584 if (func == None && n == 1)
585 arglist = NULL;
586 else {
587 if ((arglist = newtupleobject(n)) == NULL)
588 goto Fail_1;
589 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000590
591 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000592 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000593 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000594 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000595 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000596 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000597 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000598 if (item == NULL) {
599 if (i < sqp->len)
600 goto Fail_0;
601 if (err_occurred() == IndexError) {
602 err_clear();
603 INCREF(None);
604 item = None;
605 sqp->len = -1;
606 }
607 else {
608 goto Fail_0;
609 }
610 }
611 else
612 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000613
Guido van Rossum12d12c51993-10-26 17:58:25 +0000614 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000615 if (!arglist)
616 break;
617 if (settupleitem(arglist, j, item) < 0) {
618 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000619 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000620 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000621 continue;
622
623 Fail_0:
Guido van Rossum2d951851994-08-29 12:52:16 +0000624 XDECREF(arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000625 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000626 }
627
Guido van Rossum2d951851994-08-29 12:52:16 +0000628 if (!arglist)
629 arglist = item;
630
631 if (!any) {
632 DECREF(arglist);
633 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000634 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000635
636 if (func == None)
637 value = arglist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000638 else {
Guido van Rossum2d951851994-08-29 12:52:16 +0000639 value = call_object(func, arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000640 DECREF(arglist);
641 if (value == NULL)
642 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000643 }
644 if (i >= len) {
645 if (addlistitem(result, value) < 0)
646 goto Fail_1;
647 }
648 else {
649 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000650 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000651 }
652 }
653
Guido van Rossum2d951851994-08-29 12:52:16 +0000654 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000655 return result;
656
Guido van Rossum12d12c51993-10-26 17:58:25 +0000657Fail_1:
658 DECREF(result);
659Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000660 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000661 return NULL;
662}
663
664static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000665builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000666 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000667 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000668{
Guido van Rossum94390a41992-08-14 15:14:30 +0000669 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000670 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000671 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000672
673 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000674 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000675 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000676 return NULL;
677 INCREF(None);
678 return None;
679}
680
681static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000682builtin_delattr(self, args)
683 object *self;
684 object *args;
685{
686 object *v;
687 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000688
689 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000690 return NULL;
691 if (setattro(v, name, (object *)NULL) != 0)
692 return NULL;
693 INCREF(None);
694 return None;
695}
696
697static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000698builtin_hash(self, args)
699 object *self;
700 object *args;
701{
702 object *v;
703 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000704
705 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000706 return NULL;
707 x = hashobject(v);
708 if (x == -1)
709 return NULL;
710 return newintobject(x);
711}
712
713static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000714builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000715 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000716 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000717{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000718 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000719 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000720
721 if (!newgetargs(args, "O:hex", &v))
722 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000723
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000724 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000725 nb->nb_hex == NULL) {
726 err_setstr(TypeError,
727 "hex() argument can't be converted to hex");
728 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000729 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000730 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000731}
732
Guido van Rossum3165fe61992-09-25 21:59:05 +0000733static object *builtin_raw_input PROTO((object *, object *));
734
Guido van Rossum006bcd41991-10-24 14:54:44 +0000735static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000736builtin_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000737 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000738 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000739{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000740 object *line;
741 char *str;
742 object *res;
Guido van Rossum6135a871995-01-09 17:53:26 +0000743 object *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744
745 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000746 if (line == NULL)
747 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000748 if (!getargs(line, "s;embedded '\\0' in input line", &str))
749 return NULL;
750 while (*str == ' ' || *str == '\t')
751 str++;
Guido van Rossum6135a871995-01-09 17:53:26 +0000752 globals = getglobals();
753 locals = getlocals();
754 if (dictlookup(globals, "__builtins__") == NULL) {
755 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
756 return NULL;
757 }
758 res = run_string(str, eval_input, globals, locals);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000759 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000760 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000761}
762
763static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000764builtin_int(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000765 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000766 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000767{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000768 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000769 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000770
771 if (!newgetargs(args, "O:int", &v))
772 return NULL;
773 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000774 nb->nb_int == NULL) {
775 err_setstr(TypeError,
776 "int() argument can't be converted to int");
777 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000778 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000779 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000780}
781
782static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000783builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000784 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000785 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000786{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000787 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000788 long len;
789 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000790
791 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000792 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000793 tp = v->ob_type;
794 if (tp->tp_as_sequence != NULL) {
795 len = (*tp->tp_as_sequence->sq_length)(v);
796 }
797 else if (tp->tp_as_mapping != NULL) {
798 len = (*tp->tp_as_mapping->mp_length)(v);
799 }
800 else {
801 err_setstr(TypeError, "len() of unsized object");
802 return NULL;
803 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000804 if (len < 0)
805 return NULL;
806 else
807 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000808}
809
810static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000811builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000812 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000813 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000814{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000815 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000816 number_methods *nb;
817
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000818 if (!newgetargs(args, "O:long", &v))
819 return NULL;
820 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000821 nb->nb_long == NULL) {
822 err_setstr(TypeError,
823 "long() argument can't be converted to long");
824 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000825 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000826 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000827}
828
829static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000830min_max(args, sign)
831 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000832 int sign;
833{
Guido van Rossum2d951851994-08-29 12:52:16 +0000834 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000835 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000836 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000837
838 if (gettuplesize(args) > 1)
839 v = args;
840 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000841 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000842 sq = v->ob_type->tp_as_sequence;
843 if (sq == NULL) {
844 err_setstr(TypeError, "min() or max() of non-sequence");
845 return NULL;
846 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000847 w = NULL;
848 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000849 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000850 if (x == NULL) {
851 if (err_occurred() == IndexError) {
852 err_clear();
853 break;
854 }
855 XDECREF(w);
856 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000857 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000858 if (w == NULL)
859 w = x;
860 else {
861 if (cmpobject(x, w) * sign > 0) {
862 DECREF(w);
863 w = x;
864 }
865 else
866 DECREF(x);
867 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000868 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000869 if (w == NULL)
870 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000871 return w;
872}
873
874static object *
875builtin_min(self, v)
876 object *self;
877 object *v;
878{
879 return min_max(v, -1);
880}
881
882static object *
883builtin_max(self, v)
884 object *self;
885 object *v;
886{
887 return min_max(v, 1);
888}
889
890static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000891builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000892 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000893 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000894{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000895 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000896 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000897
898 if (!newgetargs(args, "O:oct", &v))
899 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000900 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
901 nb->nb_oct == NULL) {
902 err_setstr(TypeError,
903 "oct() argument can't be converted to oct");
904 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000905 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000906 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000907}
908
909static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000910builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000911 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000912 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000913{
Guido van Rossum2d951851994-08-29 12:52:16 +0000914 char *name;
915 char *mode = "r";
916 int bufsize = -1;
917 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000918
919 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000920 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000921 f = newfileobject(name, mode);
922 if (f != NULL)
923 setfilebufsize(f, bufsize);
924 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000925}
926
927static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000928builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000929 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000930 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000931{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000932 char c;
933
934 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000935 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000936 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000937}
938
939static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000940do_pow(v, w)
941 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +0000942{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000943 object *res;
944 if (is_instanceobject(v) || is_instanceobject(w))
945 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000946 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000947 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000948 err_setstr(TypeError, "pow() requires numeric arguments");
949 return NULL;
950 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000951 if (coerce(&v, &w) != 0)
952 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000953 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000954 DECREF(v);
955 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000956 return res;
957}
958
959static object *
960builtin_pow(self, args)
961 object *self;
962 object *args;
963{
964 object *v, *w, *z = None, *res;
965 object *v1, *z1, *w2, *z2;
966
967 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
968 return NULL;
969 if (z == None)
970 return do_pow(v, w);
971 /* XXX The ternary version doesn't do class instance coercions */
972 if (is_instanceobject(v))
973 return v->ob_type->tp_as_number->nb_power(v, w, z);
974 if (v->ob_type->tp_as_number == NULL ||
975 z->ob_type->tp_as_number == NULL ||
976 w->ob_type->tp_as_number == NULL) {
977 err_setstr(TypeError, "pow() requires numeric arguments");
978 return NULL;
979 }
980 if (coerce(&v, &w) != 0)
981 return NULL;
982 res = NULL;
983 v1 = v;
984 z1 = z;
985 if (coerce(&v1, &z1) != 0)
986 goto error2;
987 w2 = w;
988 z2 = z1;
989 if (coerce(&w2, &z2) != 0)
990 goto error1;
991 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
992 DECREF(w2);
993 DECREF(z2);
994 error1:
995 DECREF(v1);
996 DECREF(z1);
997 error2:
998 DECREF(v);
999 DECREF(w);
1000 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001001}
1002
1003static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001004builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001005 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001006 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001007{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001008 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001009 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001010 object *v;
1011
1012 if (gettuplesize(args) <= 1) {
1013 if (!newgetargs(args,
1014 "i;range() requires 1-3 int arguments",
1015 &ihigh))
1016 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001017 }
1018 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001019 if (!newgetargs(args,
1020 "ii|i;range() requires 1-3 int arguments",
1021 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001022 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001023 }
1024 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001025 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001026 return NULL;
1027 }
1028 /* XXX ought to check overflow of subtraction */
1029 if (istep > 0)
1030 n = (ihigh - ilow + istep - 1) / istep;
1031 else
1032 n = (ihigh - ilow + istep + 1) / istep;
1033 if (n < 0)
1034 n = 0;
1035 v = newlistobject(n);
1036 if (v == NULL)
1037 return NULL;
1038 for (i = 0; i < n; i++) {
1039 object *w = newintobject(ilow);
1040 if (w == NULL) {
1041 DECREF(v);
1042 return NULL;
1043 }
1044 setlistitem(v, i, w);
1045 ilow += istep;
1046 }
1047 return v;
1048}
1049
1050static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001051builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001052 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001053 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001054{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001055 long ilow = 0, ihigh = 0, istep = 1;
1056 int n;
1057 object *v;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001058
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001059 if (gettuplesize(args) <= 1) {
1060 if (!newgetargs(args,
1061 "i;xrange() requires 1-3 int arguments",
1062 &ihigh))
1063 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001064 }
1065 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001066 if (!newgetargs(args,
1067 "ii|i;xrange() requires 1-3 int arguments",
1068 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001069 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001070 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001071 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001072 err_setstr(ValueError, "zero step for xrange()");
1073 return NULL;
1074 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001075 /* XXX ought to check overflow of subtraction */
1076 if (istep > 0)
1077 n = (ihigh - ilow + istep - 1) / istep;
1078 else
1079 n = (ihigh - ilow + istep + 1) / istep;
1080 if (n < 0)
1081 n = 0;
1082 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001083}
1084
1085static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001086builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001087 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001088 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001089{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001090 object *v = NULL;
1091 object *f;
1092
1093 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001094 return NULL;
Guido van Rossum90933611991-06-07 16:10:43 +00001095 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001096 f = sysget("stdout");
1097 if (f == NULL) {
1098 err_setstr(RuntimeError, "lost sys.stdout");
1099 return NULL;
1100 }
1101 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001102 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001103 return NULL;
1104 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001105 f = sysget("stdin");
1106 if (f == NULL) {
1107 err_setstr(RuntimeError, "lost sys.stdin");
1108 return NULL;
1109 }
1110 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001111}
1112
1113static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001114builtin_reduce(self, args)
1115 object *self;
1116 object *args;
1117{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001118 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001119 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001120 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001121
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001122 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1123 return NULL;
1124 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001125 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001126
1127 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1128 err_setstr(TypeError,
1129 "2nd argument to reduce() must be a sequence object");
1130 return NULL;
1131 }
1132
Guido van Rossum12d12c51993-10-26 17:58:25 +00001133 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001134 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001135
Guido van Rossum2d951851994-08-29 12:52:16 +00001136 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001137 object *op2;
1138
1139 if (args->ob_refcnt > 1) {
1140 DECREF(args);
1141 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001142 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001143 }
1144
Guido van Rossum2d951851994-08-29 12:52:16 +00001145 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1146 if (err_occurred() == IndexError) {
1147 err_clear();
1148 break;
1149 }
1150 goto Fail;
1151 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001152
Guido van Rossum2d951851994-08-29 12:52:16 +00001153 if (result == NULL)
1154 result = op2;
1155 else {
1156 settupleitem(args, 0, result);
1157 settupleitem(args, 1, op2);
1158 if ((result = call_object(func, args)) == NULL)
1159 goto Fail;
1160 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001161 }
1162
1163 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001164
Guido van Rossum2d951851994-08-29 12:52:16 +00001165 if (result == NULL)
1166 err_setstr(TypeError,
1167 "reduce of empty sequence with no initial value");
1168
Guido van Rossum12d12c51993-10-26 17:58:25 +00001169 return result;
1170
Guido van Rossum2d951851994-08-29 12:52:16 +00001171Fail:
1172 XDECREF(args);
1173 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001174 return NULL;
1175}
1176
1177static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001178builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001179 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001180 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001181{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001182 object *v;
1183
1184 if (!newgetargs(args, "O:reload", &v))
1185 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001186 return reload_module(v);
1187}
1188
1189static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001190builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001191 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001192 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001193{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001194 object *v;
1195
1196 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001197 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001198 return reprobject(v);
1199}
1200
1201static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001202builtin_round(self, args)
1203 object *self;
1204 object *args;
1205{
1206 extern double floor PROTO((double));
1207 extern double ceil PROTO((double));
1208 double x;
1209 double f;
1210 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001211 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001212
1213 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001214 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001215 f = 1.0;
1216 for (i = ndigits; --i >= 0; )
1217 f = f*10.0;
1218 for (i = ndigits; ++i <= 0; )
1219 f = f*0.1;
1220 if (x >= 0.0)
1221 return newfloatobject(floor(x*f + 0.5) / f);
1222 else
1223 return newfloatobject(ceil(x*f - 0.5) / f);
1224}
1225
1226static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001227builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001228 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001229 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001230{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001231 object *v;
1232
1233 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001234 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001235 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001236}
1237
1238static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001239builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001240 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001241 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001242{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001243 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001244 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001245
1246 if (!newgetargs(args, "O:tuple", &v))
1247 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001248 if (is_tupleobject(v)) {
1249 INCREF(v);
1250 return v;
1251 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001252 if (is_listobject(v))
1253 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001254 if (is_stringobject(v)) {
1255 int n = getstringsize(v);
1256 object *t = newtupleobject(n);
1257 if (t != NULL) {
1258 int i;
1259 char *p = getstringvalue(v);
1260 for (i = 0; i < n; i++) {
1261 object *item = newsizedstringobject(p+i, 1);
1262 if (item == NULL) {
1263 DECREF(t);
1264 t = NULL;
1265 break;
1266 }
1267 settupleitem(t, i, item);
1268 }
1269 }
1270 return t;
1271 }
1272 /* Generic sequence object */
1273 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1274 int n = (*sqf->sq_length)(v);
1275 int i;
1276 object *t;
1277 if (n < 0)
1278 return NULL;
1279 t = newtupleobject(n);
1280 if (t == NULL)
1281 return NULL;
1282 for (i = 0; i < n; i++) {
1283 object *item = (*sqf->sq_item)(v, i);
1284 if (item == NULL) {
1285 DECREF(t);
1286 t = NULL;
1287 break;
1288 }
1289 settupleitem(t, i, item);
1290 }
1291 /* XXX Should support indefinite-length sequences */
1292 return t;
1293 }
1294 /* None of the above */
1295 err_setstr(TypeError, "tuple() argument must be a sequence");
1296 return NULL;
1297}
1298
1299static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001300builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001301 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001302 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001303{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001304 object *v;
1305
1306 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001307 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001308 v = (object *)v->ob_type;
1309 INCREF(v);
1310 return v;
1311}
1312
Guido van Rossum2d951851994-08-29 12:52:16 +00001313static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001314builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001315 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001316 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001317{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001318 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001319 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001320
1321 if (!newgetargs(args, "|O:vars", &v))
1322 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001323 if (v == NULL) {
1324 d = getlocals();
1325 INCREF(d);
1326 }
1327 else {
1328 d = getattr(v, "__dict__");
1329 if (d == NULL) {
1330 err_setstr(TypeError,
1331 "vars() argument must have __dict__ attribute");
1332 return NULL;
1333 }
1334 }
1335 return d;
1336}
1337
Guido van Rossum3f5da241990-12-20 15:06:42 +00001338static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001339 {"__import__", builtin___import__, 1},
1340 {"abs", builtin_abs, 1},
1341 {"apply", builtin_apply, 1},
1342 {"callable", builtin_callable, 1},
1343 {"chr", builtin_chr, 1},
1344 {"cmp", builtin_cmp, 1},
1345 {"coerce", builtin_coerce, 1},
1346 {"compile", builtin_compile, 1},
1347 {"delattr", builtin_delattr, 1},
1348 {"dir", builtin_dir, 1},
1349 {"divmod", builtin_divmod, 1},
1350 {"eval", builtin_eval, 1},
1351 {"execfile", builtin_execfile, 1},
1352 {"filter", builtin_filter, 1},
1353 {"float", builtin_float, 1},
1354 {"getattr", builtin_getattr, 1},
1355 {"hasattr", builtin_hasattr, 1},
1356 {"hash", builtin_hash, 1},
1357 {"hex", builtin_hex, 1},
1358 {"id", builtin_id, 1},
1359 {"input", builtin_input, 1},
1360 {"int", builtin_int, 1},
1361 {"len", builtin_len, 1},
1362 {"long", builtin_long, 1},
1363 {"map", builtin_map, 1},
1364 {"max", builtin_max, 1},
1365 {"min", builtin_min, 1},
1366 {"oct", builtin_oct, 1},
1367 {"open", builtin_open, 1},
1368 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001369 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001370 {"range", builtin_range, 1},
1371 {"raw_input", builtin_raw_input, 1},
1372 {"reduce", builtin_reduce, 1},
1373 {"reload", builtin_reload, 1},
1374 {"repr", builtin_repr, 1},
1375 {"round", builtin_round, 1},
1376 {"setattr", builtin_setattr, 1},
1377 {"str", builtin_str, 1},
1378 {"tuple", builtin_tuple, 1},
1379 {"type", builtin_type, 1},
1380 {"vars", builtin_vars, 1},
1381 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001382 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001383};
1384
1385static object *builtin_dict;
1386
1387object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001388getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001389{
Guido van Rossum6135a871995-01-09 17:53:26 +00001390 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001391}
1392
1393/* Predefined exceptions */
1394
Guido van Rossum25831651993-05-19 14:50:45 +00001395object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001396object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001397object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001398object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001399object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001400object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001401object *IndexError;
1402object *KeyError;
1403object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001404object *MemoryError;
1405object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001406object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001407object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001408object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001409object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001410object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001411object *TypeError;
1412object *ValueError;
1413object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001414
Guido van Rossum3f5da241990-12-20 15:06:42 +00001415static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001416newstdexception(name)
1417 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001418{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001419 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001420 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1421 fatal("no mem for new standard exception");
1422 return v;
1423}
1424
1425static void
1426initerrors()
1427{
Guido van Rossum25831651993-05-19 14:50:45 +00001428 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001429 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001430 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001431 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001432 IOError = newstdexception("IOError");
1433 ImportError = newstdexception("ImportError");
1434 IndexError = newstdexception("IndexError");
1435 KeyError = newstdexception("KeyError");
1436 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001437 MemoryError = newstdexception("MemoryError");
1438 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001439 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001440 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001441 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001442 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001443 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001444 TypeError = newstdexception("TypeError");
1445 ValueError = newstdexception("ValueError");
1446 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001447}
1448
1449void
1450initbuiltin()
1451{
1452 object *m;
Guido van Rossum89b33251993-10-22 14:26:06 +00001453 m = initmodule("__builtin__", builtin_methods);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001454 builtin_dict = getmoduledict(m);
1455 INCREF(builtin_dict);
1456 initerrors();
1457 (void) dictinsert(builtin_dict, "None", None);
1458}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001459
Guido van Rossum12d12c51993-10-26 17:58:25 +00001460
Guido van Rossume77a7571993-11-03 15:01:26 +00001461/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001462
1463static object *
1464filtertuple(func, tuple)
1465 object *func;
1466 object *tuple;
1467{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001468 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001469 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001470 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001471
Guido van Rossum2586bf01993-11-01 16:21:44 +00001472 if ((result = newtupleobject(len)) == NULL)
1473 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001474
Guido van Rossum12d12c51993-10-26 17:58:25 +00001475 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001476 object *item, *good;
1477 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001478
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001479 if ((item = gettupleitem(tuple, i)) == NULL)
1480 goto Fail_1;
1481 if (func == None) {
1482 INCREF(item);
1483 good = item;
1484 }
1485 else {
1486 object *arg = mkvalue("(O)", item);
1487 if (arg == NULL)
1488 goto Fail_1;
1489 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001490 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001491 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001492 goto Fail_1;
1493 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001494 ok = testbool(good);
1495 DECREF(good);
1496 if (ok) {
1497 INCREF(item);
1498 if (settupleitem(result, j++, item) < 0)
1499 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001500 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001501 }
1502
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001503 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001504 return NULL;
1505
Guido van Rossum12d12c51993-10-26 17:58:25 +00001506 return result;
1507
Guido van Rossum12d12c51993-10-26 17:58:25 +00001508Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001509 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001510 return NULL;
1511}
1512
1513
Guido van Rossume77a7571993-11-03 15:01:26 +00001514/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001515
1516static object *
1517filterstring(func, strobj)
1518 object *func;
1519 object *strobj;
1520{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001521 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001522 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001523 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001524
Guido van Rossum2586bf01993-11-01 16:21:44 +00001525 if (func == None) {
1526 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001527 INCREF(strobj);
1528 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001529 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001530 if ((result = newsizedstringobject(NULL, len)) == NULL)
1531 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001532
Guido van Rossum12d12c51993-10-26 17:58:25 +00001533 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001534 object *item, *arg, *good;
1535 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001536
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001537 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1538 if (item == NULL)
1539 goto Fail_1;
1540 arg = mkvalue("(O)", item);
1541 DECREF(item);
1542 if (arg == NULL)
1543 goto Fail_1;
1544 good = call_object(func, arg);
1545 DECREF(arg);
1546 if (good == NULL)
1547 goto Fail_1;
1548 ok = testbool(good);
1549 DECREF(good);
1550 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001551 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001552 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001553 }
1554
Guido van Rossum12d12c51993-10-26 17:58:25 +00001555 if (resizestring(&result, j) < 0)
1556 return NULL;
1557
Guido van Rossum12d12c51993-10-26 17:58:25 +00001558 return result;
1559
Guido van Rossum12d12c51993-10-26 17:58:25 +00001560Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001561 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001562 return NULL;
1563}