blob: 517aea187411ce27024fc84ea62de88d99be42ff [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;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000050
51 if (!newgetargs(args, "s:__import__", &name))
52 return NULL;
Guido van Rossum7f9fa971995-01-20 16:53:12 +000053 return import_module(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000054}
55
56
57static object *
58builtin_abs(self, args)
59 object *self;
60 object *args;
61{
62 object *v;
Guido van Rossumd4905451991-05-05 20:00:36 +000063 number_methods *nm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000064
65 if (!newgetargs(args, "O:abs", &v))
66 return NULL;
67 if ((nm = v->ob_type->tp_as_number) == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +000068 err_setstr(TypeError, "abs() requires numeric argument");
69 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000070 }
Guido van Rossumd4905451991-05-05 20:00:36 +000071 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000072}
73
74static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000075builtin_apply(self, args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000076 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000077 object *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000078{
Guido van Rossum94390a41992-08-14 15:14:30 +000079 object *func, *arglist;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000080
81 if (!newgetargs(args, "OO:apply", &func, &arglist))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000082 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +000083 if (!is_tupleobject(arglist)) {
84 err_setstr(TypeError, "apply() 2nd argument must be tuple");
85 return NULL;
86 }
Guido van Rossum94390a41992-08-14 15:14:30 +000087 return call_object(func, arglist);
Guido van Rossumc02e15c1991-12-16 13:03:00 +000088}
89
Guido van Rossum2d951851994-08-29 12:52:16 +000090static int
91callable(x)
92 object *x;
93{
94 if (x == NULL)
95 return 0;
96 if (x->ob_type->tp_call != NULL ||
97 is_funcobject(x) ||
98 is_instancemethodobject(x) ||
99 is_methodobject(x) ||
100 is_classobject(x))
101 return 1;
102 if (is_instanceobject(x)) {
103 object *call = getattr(x, "__call__");
104 if (call == NULL) {
105 err_clear();
106 return 0;
107 }
108 /* Could test recursively but don't, for fear of endless
109 recursion if some joker sets self.__call__ = self */
110 DECREF(call);
111 return 1;
112 }
113 return 0;
114}
115
116static object *
117builtin_callable(self, args)
118 object *self;
119 object *args;
120{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000121 object *v;
122
123 if (!newgetargs(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000124 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000125 return newintobject((long)callable(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000126}
127
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000128static object *
Guido van Rossume77a7571993-11-03 15:01:26 +0000129builtin_filter(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000130 object *self;
131 object *args;
132{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000133 object *func, *seq, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000134 sequence_methods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000135 int len;
136 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000137
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000138 if (!newgetargs(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000139 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000140
Guido van Rossum12d12c51993-10-26 17:58:25 +0000141 if (is_stringobject(seq)) {
142 object *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000143 return r;
144 }
145
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000146 if (is_tupleobject(seq)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000147 object *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000148 return r;
149 }
150
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000151 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000152 err_setstr(TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000153 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000154 goto Fail_2;
155 }
156
157 if ((len = (*sqf->sq_length)(seq)) < 0)
158 goto Fail_2;
159
160 if (is_listobject(seq) && seq->ob_refcnt == 1) {
161 INCREF(seq);
162 result = seq;
163 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000164 else {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000165 if ((result = newlistobject(len)) == NULL)
166 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000167 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000168
Guido van Rossum2d951851994-08-29 12:52:16 +0000169 for (i = j = 0; ; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000170 object *item, *good;
171 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000172
Guido van Rossum2d951851994-08-29 12:52:16 +0000173 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
174 if (i < len)
175 goto Fail_1;
176 if (err_occurred() == IndexError) {
177 err_clear();
178 break;
179 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000180 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000181 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000182
183 if (func == None) {
184 good = item;
Guido van Rossum58b68731995-01-10 17:40:55 +0000185 INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000186 }
187 else {
188 object *arg = mkvalue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000189 if (arg == NULL)
190 goto Fail_1;
191 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000192 DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000193 if (good == NULL) {
194 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000195 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000196 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000197 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000198 ok = testbool(good);
199 DECREF(good);
200 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000201 if (j < len) {
202 if (setlistitem(result, j++, item) < 0)
203 goto Fail_1;
204 }
205 else {
206 j++;
207 if (addlistitem(result, item) < 0)
208 goto Fail_1;
209 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000210 } else {
211 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000212 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000213 }
214
Guido van Rossum12d12c51993-10-26 17:58:25 +0000215
Guido van Rossum2d951851994-08-29 12:52:16 +0000216 if (j < len && setlistslice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000217 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000218
Guido van Rossum12d12c51993-10-26 17:58:25 +0000219 return result;
220
Guido van Rossum12d12c51993-10-26 17:58:25 +0000221Fail_1:
222 DECREF(result);
223Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000224 return NULL;
225}
226
227static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000228builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000229 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000230 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000231{
232 long x;
233 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000234
235 if (!newgetargs(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000236 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000237 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000238 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000239 return NULL;
240 }
241 s[0] = x;
242 return newsizedstringobject(s, 1);
243}
244
245static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000246builtin_cmp(self, args)
247 object *self;
248 object *args;
249{
250 object *a, *b;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000251
252 if (!newgetargs(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000253 return NULL;
254 return newintobject((long)cmpobject(a, b));
255}
256
257static object *
Guido van Rossum5524a591995-01-10 15:26:20 +0000258builtin_coerce(self, args)
259 object *self;
260 object *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000261{
Guido van Rossum5524a591995-01-10 15:26:20 +0000262 object *v, *w;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000263 object *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000264
265 if (!newgetargs(args, "OO:coerce", &v, &w))
266 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000267 if (coerce(&v, &w) < 0)
268 return NULL;
269 res = mkvalue("(OO)", v, w);
270 DECREF(v);
271 DECREF(w);
272 return res;
273}
274
275static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000276builtin_compile(self, args)
277 object *self;
278 object *args;
279{
280 char *str;
281 char *filename;
282 char *startstr;
283 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000284
285 if (!newgetargs(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000286 return NULL;
287 if (strcmp(startstr, "exec") == 0)
288 start = file_input;
289 else if (strcmp(startstr, "eval") == 0)
290 start = eval_input;
291 else {
292 err_setstr(ValueError,
293 "compile() mode must be 'exec' or 'eval'");
294 return NULL;
295 }
296 return compile_string(str, filename, start);
297}
298
299static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000300builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000301 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000302 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000303{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000304 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000305 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000306
307 if (!newgetargs(args, "|O:dir", &v))
308 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000309 if (v == NULL) {
310 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000311 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000312 }
313 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000314 d = getattr(v, "__dict__");
315 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000316 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000317 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000318 return NULL;
319 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000320 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000321 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000322 v = getdictkeys(d);
323 if (sortlist(v) != 0) {
324 DECREF(v);
325 v = NULL;
326 }
327 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000328 else {
329 v = newlistobject(0);
330 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000331 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000332 return v;
333}
334
335static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000336do_divmod(v, w)
337 object *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000338{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000339 object *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000340
Guido van Rossum180d7b41994-09-29 09:45:57 +0000341 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000342 return instancebinop(v, w, "__divmod__", "__rdivmod__",
343 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000344 if (v->ob_type->tp_as_number == NULL ||
345 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000346 err_setstr(TypeError,
347 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000348 return NULL;
349 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000350 if (coerce(&v, &w) != 0)
351 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000352 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000353 DECREF(v);
354 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000355 return res;
356}
357
358static object *
359builtin_divmod(self, args)
360 object *self;
361 object *args;
362{
363 object *v, *w;
364
365 if (!newgetargs(args, "OO:divmod", &v, &w))
366 return NULL;
367 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000368}
369
370static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000371builtin_eval(self, args)
372 object *self;
373 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000374{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000375 object *cmd;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000376 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000377 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000378
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000379 if (!newgetargs(args, "O|O!O!:eval",
380 &cmd,
381 &Mappingtype, &globals,
382 &Mappingtype, &locals))
383 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000384 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000385 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000386 if (locals == None)
387 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000388 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000389 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000390 locals = globals;
391 if (dictlookup(globals, "__builtins__") == NULL) {
392 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
393 return NULL;
394 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000395 if (is_codeobject(cmd))
396 return eval_code((codeobject *) cmd, globals, locals,
Guido van Rossum81daa321993-05-20 14:24:46 +0000397 (object *)NULL, (object *)NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000398 if (!is_stringobject(cmd)) {
399 err_setstr(TypeError,
400 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000401 return NULL;
402 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000403 str = getstringvalue(cmd);
404 if (strlen(str) != getstringsize(cmd)) {
405 err_setstr(ValueError,
406 "embedded '\\0' in string arg");
407 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000408 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000409 while (*str == ' ' || *str == '\t')
410 str++;
411 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000412}
413
414static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000415builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000416 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000417 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000418{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000419 char *filename;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000420 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000421 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000422 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000423 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000424 int n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425
426 if (!newgetargs(args, "s|O!O!:execfile",
427 &filename,
428 &Mappingtype, &globals,
429 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000430 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000431 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000432 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000433 if (locals == None)
434 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000435 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000436 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000437 locals = globals;
438 if (dictlookup(globals, "__builtins__") == NULL) {
439 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
440 return NULL;
441 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000442 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000443 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000444 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000445 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000446 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000447 return NULL;
448 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000449 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000450 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000451 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000452 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000453 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000454}
455
456static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000457builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000458 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000459 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000460{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000461 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000462 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000463
464 if (!newgetargs(args, "O:float", &v))
465 return NULL;
466 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000467 nb->nb_float == NULL) {
468 err_setstr(TypeError,
469 "float() argument can't be converted to float");
470 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000471 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000472 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000473}
474
475static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000476builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000477 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000478 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000479{
Guido van Rossum94390a41992-08-14 15:14:30 +0000480 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000481 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000482
483 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000484 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000485 return getattro(v, name);
486}
487
488static object *
489builtin_hasattr(self, args)
490 object *self;
491 object *args;
492{
493 object *v;
494 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000495
496 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000497 return NULL;
498 v = getattro(v, name);
499 if (v == NULL) {
500 err_clear();
501 return newintobject(0L);
502 }
503 DECREF(v);
504 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000505}
506
507static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000508builtin_id(self, args)
509 object *self;
510 object *args;
511{
512 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000513
514 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000515 return NULL;
516 return newintobject((long)v);
517}
518
519static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000520builtin_map(self, args)
521 object *self;
522 object *args;
523{
524 typedef struct {
525 object *seq;
526 sequence_methods *sqf;
527 int len;
528 } sequence;
529
530 object *func, *result;
531 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000532 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000533 register int i, j;
534
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000535 n = gettuplesize(args);
536 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000537 err_setstr(TypeError, "map() requires at least two args");
538 return NULL;
539 }
540
541 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000542 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000543
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000544 if ((seqs = NEW(sequence, n)) == NULL) {
545 err_nomem();
546 goto Fail_2;
547 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000548
Guido van Rossum2d951851994-08-29 12:52:16 +0000549 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000550 int curlen;
551
552 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
553 goto Fail_2;
554
555 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
556 static char errmsg[] =
557 "argument %d to map() must be a sequence object";
558 char errbuf[sizeof(errmsg) + 3];
559
560 sprintf(errbuf, errmsg, i+2);
561 err_setstr(TypeError, errbuf);
562 goto Fail_2;
563 }
564
565 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
566 goto Fail_2;
567
568 if (curlen > len)
569 len = curlen;
570 }
571
572 if ((result = (object *) newlistobject(len)) == NULL)
573 goto Fail_2;
574
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000575 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000576 for (i = 0; ; ++i) {
577 object *arglist, *item, *value;
578 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000579
Guido van Rossum2d951851994-08-29 12:52:16 +0000580 if (func == None && n == 1)
581 arglist = NULL;
582 else {
583 if ((arglist = newtupleobject(n)) == NULL)
584 goto Fail_1;
585 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000586
587 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000588 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000589 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000590 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000591 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000592 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000593 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000594 if (item == NULL) {
595 if (i < sqp->len)
596 goto Fail_0;
597 if (err_occurred() == IndexError) {
598 err_clear();
599 INCREF(None);
600 item = None;
601 sqp->len = -1;
602 }
603 else {
604 goto Fail_0;
605 }
606 }
607 else
608 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000609
Guido van Rossum12d12c51993-10-26 17:58:25 +0000610 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000611 if (!arglist)
612 break;
613 if (settupleitem(arglist, j, item) < 0) {
614 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000615 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000616 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000617 continue;
618
619 Fail_0:
Guido van Rossum2d951851994-08-29 12:52:16 +0000620 XDECREF(arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000621 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000622 }
623
Guido van Rossum2d951851994-08-29 12:52:16 +0000624 if (!arglist)
625 arglist = item;
626
627 if (!any) {
628 DECREF(arglist);
629 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000630 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000631
632 if (func == None)
633 value = arglist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000634 else {
Guido van Rossum2d951851994-08-29 12:52:16 +0000635 value = call_object(func, arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000636 DECREF(arglist);
637 if (value == NULL)
638 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000639 }
640 if (i >= len) {
641 if (addlistitem(result, value) < 0)
642 goto Fail_1;
643 }
644 else {
645 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000646 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000647 }
648 }
649
Guido van Rossum2d951851994-08-29 12:52:16 +0000650 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000651 return result;
652
Guido van Rossum12d12c51993-10-26 17:58:25 +0000653Fail_1:
654 DECREF(result);
655Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000656 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000657 return NULL;
658}
659
660static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000661builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000662 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000663 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000664{
Guido van Rossum94390a41992-08-14 15:14:30 +0000665 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000666 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000667 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000668
669 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000670 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000671 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000672 return NULL;
673 INCREF(None);
674 return None;
675}
676
677static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000678builtin_delattr(self, args)
679 object *self;
680 object *args;
681{
682 object *v;
683 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000684
685 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000686 return NULL;
687 if (setattro(v, name, (object *)NULL) != 0)
688 return NULL;
689 INCREF(None);
690 return None;
691}
692
693static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000694builtin_hash(self, args)
695 object *self;
696 object *args;
697{
698 object *v;
699 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000700
701 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000702 return NULL;
703 x = hashobject(v);
704 if (x == -1)
705 return NULL;
706 return newintobject(x);
707}
708
709static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000710builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000711 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000712 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000713{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000714 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000715 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000716
717 if (!newgetargs(args, "O:hex", &v))
718 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000719
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000720 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000721 nb->nb_hex == NULL) {
722 err_setstr(TypeError,
723 "hex() argument can't be converted to hex");
724 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000725 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000726 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000727}
728
Guido van Rossum3165fe61992-09-25 21:59:05 +0000729static object *builtin_raw_input PROTO((object *, object *));
730
Guido van Rossum006bcd41991-10-24 14:54:44 +0000731static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000732builtin_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000733 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000734 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000735{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000736 object *line;
737 char *str;
738 object *res;
Guido van Rossum6135a871995-01-09 17:53:26 +0000739 object *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000740
741 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000742 if (line == NULL)
743 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744 if (!getargs(line, "s;embedded '\\0' in input line", &str))
745 return NULL;
746 while (*str == ' ' || *str == '\t')
747 str++;
Guido van Rossum6135a871995-01-09 17:53:26 +0000748 globals = getglobals();
749 locals = getlocals();
750 if (dictlookup(globals, "__builtins__") == NULL) {
751 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
752 return NULL;
753 }
754 res = run_string(str, eval_input, globals, locals);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000755 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000756 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000757}
758
759static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000760builtin_int(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000761 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000762 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000763{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000764 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000765 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000766
767 if (!newgetargs(args, "O:int", &v))
768 return NULL;
769 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000770 nb->nb_int == NULL) {
771 err_setstr(TypeError,
772 "int() argument can't be converted to int");
773 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000774 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000775 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000776}
777
778static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000779builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000780 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000781 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000782{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000783 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000784 long len;
785 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000786
787 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000788 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000789 tp = v->ob_type;
790 if (tp->tp_as_sequence != NULL) {
791 len = (*tp->tp_as_sequence->sq_length)(v);
792 }
793 else if (tp->tp_as_mapping != NULL) {
794 len = (*tp->tp_as_mapping->mp_length)(v);
795 }
796 else {
797 err_setstr(TypeError, "len() of unsized object");
798 return NULL;
799 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000800 if (len < 0)
801 return NULL;
802 else
803 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000804}
805
806static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000808 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000809 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000810{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000811 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000812 number_methods *nb;
813
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000814 if (!newgetargs(args, "O:long", &v))
815 return NULL;
816 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000817 nb->nb_long == NULL) {
818 err_setstr(TypeError,
819 "long() argument can't be converted to long");
820 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000821 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000822 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000823}
824
825static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000826min_max(args, sign)
827 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000828 int sign;
829{
Guido van Rossum2d951851994-08-29 12:52:16 +0000830 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000831 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000832 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000833
834 if (gettuplesize(args) > 1)
835 v = args;
836 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000837 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000838 sq = v->ob_type->tp_as_sequence;
839 if (sq == NULL) {
840 err_setstr(TypeError, "min() or max() of non-sequence");
841 return NULL;
842 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000843 w = NULL;
844 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000845 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000846 if (x == NULL) {
847 if (err_occurred() == IndexError) {
848 err_clear();
849 break;
850 }
851 XDECREF(w);
852 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000853 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000854 if (w == NULL)
855 w = x;
856 else {
857 if (cmpobject(x, w) * sign > 0) {
858 DECREF(w);
859 w = x;
860 }
861 else
862 DECREF(x);
863 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000864 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000865 if (w == NULL)
866 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000867 return w;
868}
869
870static object *
871builtin_min(self, v)
872 object *self;
873 object *v;
874{
875 return min_max(v, -1);
876}
877
878static object *
879builtin_max(self, v)
880 object *self;
881 object *v;
882{
883 return min_max(v, 1);
884}
885
886static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000887builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000888 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000889 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000890{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000891 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000892 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000893
894 if (!newgetargs(args, "O:oct", &v))
895 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000896 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
897 nb->nb_oct == NULL) {
898 err_setstr(TypeError,
899 "oct() argument can't be converted to oct");
900 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000901 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000902 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000903}
904
905static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000906builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000907 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000908 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000909{
Guido van Rossum2d951851994-08-29 12:52:16 +0000910 char *name;
911 char *mode = "r";
912 int bufsize = -1;
913 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000914
915 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000916 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000917 f = newfileobject(name, mode);
918 if (f != NULL)
919 setfilebufsize(f, bufsize);
920 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000921}
922
923static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000924builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000925 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000926 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000927{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000928 char c;
929
930 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000931 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000932 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000933}
934
935static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000936do_pow(v, w)
937 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +0000938{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000939 object *res;
940 if (is_instanceobject(v) || is_instanceobject(w))
941 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000942 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000943 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000944 err_setstr(TypeError, "pow() requires numeric arguments");
945 return NULL;
946 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000947 if (coerce(&v, &w) != 0)
948 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000949 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000950 DECREF(v);
951 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000952 return res;
953}
954
955static object *
956builtin_pow(self, args)
957 object *self;
958 object *args;
959{
960 object *v, *w, *z = None, *res;
961 object *v1, *z1, *w2, *z2;
962
963 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
964 return NULL;
965 if (z == None)
966 return do_pow(v, w);
967 /* XXX The ternary version doesn't do class instance coercions */
968 if (is_instanceobject(v))
969 return v->ob_type->tp_as_number->nb_power(v, w, z);
970 if (v->ob_type->tp_as_number == NULL ||
971 z->ob_type->tp_as_number == NULL ||
972 w->ob_type->tp_as_number == NULL) {
973 err_setstr(TypeError, "pow() requires numeric arguments");
974 return NULL;
975 }
976 if (coerce(&v, &w) != 0)
977 return NULL;
978 res = NULL;
979 v1 = v;
980 z1 = z;
981 if (coerce(&v1, &z1) != 0)
982 goto error2;
983 w2 = w;
984 z2 = z1;
985 if (coerce(&w2, &z2) != 0)
986 goto error1;
987 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
988 DECREF(w2);
989 DECREF(z2);
990 error1:
991 DECREF(v1);
992 DECREF(z1);
993 error2:
994 DECREF(v);
995 DECREF(w);
996 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +0000997}
998
999static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001000builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001001 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001002 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001003{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001004 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001005 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001006 object *v;
1007
1008 if (gettuplesize(args) <= 1) {
1009 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001010 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001011 &ihigh))
1012 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001013 }
1014 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001015 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001016 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001017 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001018 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001019 }
1020 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001021 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001022 return NULL;
1023 }
1024 /* XXX ought to check overflow of subtraction */
1025 if (istep > 0)
1026 n = (ihigh - ilow + istep - 1) / istep;
1027 else
1028 n = (ihigh - ilow + istep + 1) / istep;
1029 if (n < 0)
1030 n = 0;
1031 v = newlistobject(n);
1032 if (v == NULL)
1033 return NULL;
1034 for (i = 0; i < n; i++) {
1035 object *w = newintobject(ilow);
1036 if (w == NULL) {
1037 DECREF(v);
1038 return NULL;
1039 }
1040 setlistitem(v, i, w);
1041 ilow += istep;
1042 }
1043 return v;
1044}
1045
1046static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001047builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001048 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001049 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001050{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001051 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001052 long n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001053 object *v;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001054
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001055 if (gettuplesize(args) <= 1) {
1056 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001057 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001058 &ihigh))
1059 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001060 }
1061 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001062 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001063 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001064 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001065 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001066 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001067 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001068 err_setstr(ValueError, "zero step for xrange()");
1069 return NULL;
1070 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001071 /* XXX ought to check overflow of subtraction */
1072 if (istep > 0)
1073 n = (ihigh - ilow + istep - 1) / istep;
1074 else
1075 n = (ihigh - ilow + istep + 1) / istep;
1076 if (n < 0)
1077 n = 0;
1078 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001079}
1080
1081static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001082builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001083 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001084 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001085{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001086 object *v = NULL;
1087 object *f;
1088
1089 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001090 return NULL;
Guido van Rossum90933611991-06-07 16:10:43 +00001091 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001092 f = sysget("stdout");
1093 if (f == NULL) {
1094 err_setstr(RuntimeError, "lost sys.stdout");
1095 return NULL;
1096 }
1097 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001098 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001099 return NULL;
1100 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001101 f = sysget("stdin");
1102 if (f == NULL) {
1103 err_setstr(RuntimeError, "lost sys.stdin");
1104 return NULL;
1105 }
1106 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001107}
1108
1109static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001110builtin_reduce(self, args)
1111 object *self;
1112 object *args;
1113{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001114 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001115 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001116 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001117
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001118 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1119 return NULL;
1120 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001121 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001122
1123 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1124 err_setstr(TypeError,
1125 "2nd argument to reduce() must be a sequence object");
1126 return NULL;
1127 }
1128
Guido van Rossum12d12c51993-10-26 17:58:25 +00001129 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001130 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001131
Guido van Rossum2d951851994-08-29 12:52:16 +00001132 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001133 object *op2;
1134
1135 if (args->ob_refcnt > 1) {
1136 DECREF(args);
1137 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001138 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001139 }
1140
Guido van Rossum2d951851994-08-29 12:52:16 +00001141 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1142 if (err_occurred() == IndexError) {
1143 err_clear();
1144 break;
1145 }
1146 goto Fail;
1147 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001148
Guido van Rossum2d951851994-08-29 12:52:16 +00001149 if (result == NULL)
1150 result = op2;
1151 else {
1152 settupleitem(args, 0, result);
1153 settupleitem(args, 1, op2);
1154 if ((result = call_object(func, args)) == NULL)
1155 goto Fail;
1156 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001157 }
1158
1159 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001160
Guido van Rossum2d951851994-08-29 12:52:16 +00001161 if (result == NULL)
1162 err_setstr(TypeError,
1163 "reduce of empty sequence with no initial value");
1164
Guido van Rossum12d12c51993-10-26 17:58:25 +00001165 return result;
1166
Guido van Rossum2d951851994-08-29 12:52:16 +00001167Fail:
1168 XDECREF(args);
1169 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001170 return NULL;
1171}
1172
1173static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001174builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001175 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001176 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001177{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001178 object *v;
1179
1180 if (!newgetargs(args, "O:reload", &v))
1181 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001182 return reload_module(v);
1183}
1184
1185static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001186builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001187 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001188 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001189{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001190 object *v;
1191
1192 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001193 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001194 return reprobject(v);
1195}
1196
1197static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001198builtin_round(self, args)
1199 object *self;
1200 object *args;
1201{
1202 extern double floor PROTO((double));
1203 extern double ceil PROTO((double));
1204 double x;
1205 double f;
1206 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001207 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001208
1209 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001210 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001211 f = 1.0;
1212 for (i = ndigits; --i >= 0; )
1213 f = f*10.0;
1214 for (i = ndigits; ++i <= 0; )
1215 f = f*0.1;
1216 if (x >= 0.0)
1217 return newfloatobject(floor(x*f + 0.5) / f);
1218 else
1219 return newfloatobject(ceil(x*f - 0.5) / f);
1220}
1221
1222static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001223builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001224 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001225 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001226{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001227 object *v;
1228
1229 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001230 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001231 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001232}
1233
1234static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001235builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001236 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001237 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001238{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001239 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001240 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001241
1242 if (!newgetargs(args, "O:tuple", &v))
1243 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001244 if (is_tupleobject(v)) {
1245 INCREF(v);
1246 return v;
1247 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001248 if (is_listobject(v))
1249 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001250 if (is_stringobject(v)) {
1251 int n = getstringsize(v);
1252 object *t = newtupleobject(n);
1253 if (t != NULL) {
1254 int i;
1255 char *p = getstringvalue(v);
1256 for (i = 0; i < n; i++) {
1257 object *item = newsizedstringobject(p+i, 1);
1258 if (item == NULL) {
1259 DECREF(t);
1260 t = NULL;
1261 break;
1262 }
1263 settupleitem(t, i, item);
1264 }
1265 }
1266 return t;
1267 }
1268 /* Generic sequence object */
1269 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1270 int n = (*sqf->sq_length)(v);
1271 int i;
1272 object *t;
1273 if (n < 0)
1274 return NULL;
1275 t = newtupleobject(n);
1276 if (t == NULL)
1277 return NULL;
1278 for (i = 0; i < n; i++) {
1279 object *item = (*sqf->sq_item)(v, i);
1280 if (item == NULL) {
1281 DECREF(t);
1282 t = NULL;
1283 break;
1284 }
1285 settupleitem(t, i, item);
1286 }
1287 /* XXX Should support indefinite-length sequences */
1288 return t;
1289 }
1290 /* None of the above */
1291 err_setstr(TypeError, "tuple() argument must be a sequence");
1292 return NULL;
1293}
1294
1295static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001296builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001297 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001298 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001299{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001300 object *v;
1301
1302 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001303 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001304 v = (object *)v->ob_type;
1305 INCREF(v);
1306 return v;
1307}
1308
Guido van Rossum2d951851994-08-29 12:52:16 +00001309static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001310builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001311 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001312 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001313{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001314 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001315 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001316
1317 if (!newgetargs(args, "|O:vars", &v))
1318 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001319 if (v == NULL) {
1320 d = getlocals();
1321 INCREF(d);
1322 }
1323 else {
1324 d = getattr(v, "__dict__");
1325 if (d == NULL) {
1326 err_setstr(TypeError,
1327 "vars() argument must have __dict__ attribute");
1328 return NULL;
1329 }
1330 }
1331 return d;
1332}
1333
Guido van Rossum3f5da241990-12-20 15:06:42 +00001334static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001335 {"__import__", builtin___import__, 1},
1336 {"abs", builtin_abs, 1},
1337 {"apply", builtin_apply, 1},
1338 {"callable", builtin_callable, 1},
1339 {"chr", builtin_chr, 1},
1340 {"cmp", builtin_cmp, 1},
1341 {"coerce", builtin_coerce, 1},
1342 {"compile", builtin_compile, 1},
1343 {"delattr", builtin_delattr, 1},
1344 {"dir", builtin_dir, 1},
1345 {"divmod", builtin_divmod, 1},
1346 {"eval", builtin_eval, 1},
1347 {"execfile", builtin_execfile, 1},
1348 {"filter", builtin_filter, 1},
1349 {"float", builtin_float, 1},
1350 {"getattr", builtin_getattr, 1},
1351 {"hasattr", builtin_hasattr, 1},
1352 {"hash", builtin_hash, 1},
1353 {"hex", builtin_hex, 1},
1354 {"id", builtin_id, 1},
1355 {"input", builtin_input, 1},
1356 {"int", builtin_int, 1},
1357 {"len", builtin_len, 1},
1358 {"long", builtin_long, 1},
1359 {"map", builtin_map, 1},
1360 {"max", builtin_max, 1},
1361 {"min", builtin_min, 1},
1362 {"oct", builtin_oct, 1},
1363 {"open", builtin_open, 1},
1364 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001365 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001366 {"range", builtin_range, 1},
1367 {"raw_input", builtin_raw_input, 1},
1368 {"reduce", builtin_reduce, 1},
1369 {"reload", builtin_reload, 1},
1370 {"repr", builtin_repr, 1},
1371 {"round", builtin_round, 1},
1372 {"setattr", builtin_setattr, 1},
1373 {"str", builtin_str, 1},
1374 {"tuple", builtin_tuple, 1},
1375 {"type", builtin_type, 1},
1376 {"vars", builtin_vars, 1},
1377 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001378 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001379};
1380
Guido van Rossum0865dd91995-01-17 16:30:22 +00001381static object *builtin_mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001382static object *builtin_dict;
1383
1384object *
Guido van Rossum0865dd91995-01-17 16:30:22 +00001385getbuiltinmod()
1386{
1387 return builtin_mod;
1388}
1389
1390object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001391getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001392{
Guido van Rossum6135a871995-01-09 17:53:26 +00001393 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001394}
1395
1396/* Predefined exceptions */
1397
Guido van Rossum25831651993-05-19 14:50:45 +00001398object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001399object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001400object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001401object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001402object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001403object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001404object *IndexError;
1405object *KeyError;
1406object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001407object *MemoryError;
1408object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001409object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001410object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001411object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001412object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001413object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001414object *TypeError;
1415object *ValueError;
1416object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001417
Guido van Rossum3f5da241990-12-20 15:06:42 +00001418static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001419newstdexception(name)
1420 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001421{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001422 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001423 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1424 fatal("no mem for new standard exception");
1425 return v;
1426}
1427
1428static void
1429initerrors()
1430{
Guido van Rossum25831651993-05-19 14:50:45 +00001431 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001432 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001433 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001434 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001435 IOError = newstdexception("IOError");
1436 ImportError = newstdexception("ImportError");
1437 IndexError = newstdexception("IndexError");
1438 KeyError = newstdexception("KeyError");
1439 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001440 MemoryError = newstdexception("MemoryError");
1441 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001442 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001443 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001444 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001445 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001446 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001447 TypeError = newstdexception("TypeError");
1448 ValueError = newstdexception("ValueError");
1449 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001450}
1451
1452void
1453initbuiltin()
1454{
Guido van Rossum0865dd91995-01-17 16:30:22 +00001455 builtin_mod = initmodule("__builtin__", builtin_methods);
1456 builtin_dict = getmoduledict(builtin_mod);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001457 INCREF(builtin_dict);
1458 initerrors();
1459 (void) dictinsert(builtin_dict, "None", None);
1460}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001461
Guido van Rossum12d12c51993-10-26 17:58:25 +00001462
Guido van Rossume77a7571993-11-03 15:01:26 +00001463/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001464
1465static object *
1466filtertuple(func, tuple)
1467 object *func;
1468 object *tuple;
1469{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001470 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001471 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001472 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001473
Guido van Rossum2586bf01993-11-01 16:21:44 +00001474 if ((result = newtupleobject(len)) == NULL)
1475 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001476
Guido van Rossum12d12c51993-10-26 17:58:25 +00001477 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001478 object *item, *good;
1479 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001480
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001481 if ((item = gettupleitem(tuple, i)) == NULL)
1482 goto Fail_1;
1483 if (func == None) {
1484 INCREF(item);
1485 good = item;
1486 }
1487 else {
1488 object *arg = mkvalue("(O)", item);
1489 if (arg == NULL)
1490 goto Fail_1;
1491 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001492 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001493 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001494 goto Fail_1;
1495 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001496 ok = testbool(good);
1497 DECREF(good);
1498 if (ok) {
1499 INCREF(item);
1500 if (settupleitem(result, j++, item) < 0)
1501 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001502 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001503 }
1504
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001505 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001506 return NULL;
1507
Guido van Rossum12d12c51993-10-26 17:58:25 +00001508 return result;
1509
Guido van Rossum12d12c51993-10-26 17:58:25 +00001510Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001511 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001512 return NULL;
1513}
1514
1515
Guido van Rossume77a7571993-11-03 15:01:26 +00001516/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001517
1518static object *
1519filterstring(func, strobj)
1520 object *func;
1521 object *strobj;
1522{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001523 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001524 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001525 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001526
Guido van Rossum2586bf01993-11-01 16:21:44 +00001527 if (func == None) {
1528 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001529 INCREF(strobj);
1530 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001531 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001532 if ((result = newsizedstringobject(NULL, len)) == NULL)
1533 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001534
Guido van Rossum12d12c51993-10-26 17:58:25 +00001535 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001536 object *item, *arg, *good;
1537 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001538
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001539 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1540 if (item == NULL)
1541 goto Fail_1;
1542 arg = mkvalue("(O)", item);
1543 DECREF(item);
1544 if (arg == NULL)
1545 goto Fail_1;
1546 good = call_object(func, arg);
1547 DECREF(arg);
1548 if (good == NULL)
1549 goto Fail_1;
1550 ok = testbool(good);
1551 DECREF(good);
1552 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001553 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001554 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001555 }
1556
Guido van Rossum12d12c51993-10-26 17:58:25 +00001557 if (resizestring(&result, j) < 0)
1558 return NULL;
1559
Guido van Rossum12d12c51993-10-26 17:58:25 +00001560 return result;
1561
Guido van Rossum12d12c51993-10-26 17:58:25 +00001562Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001563 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001564 return NULL;
1565}