blob: 551d009f459cc0b632e91d5c4051634ccb685122 [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 object *
91builtin_callable(self, args)
92 object *self;
93 object *args;
94{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000095 object *v;
96
97 if (!newgetargs(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +000098 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000099 return newintobject((long)callable(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000100}
101
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000102static object *
Guido van Rossume77a7571993-11-03 15:01:26 +0000103builtin_filter(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000104 object *self;
105 object *args;
106{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000107 object *func, *seq, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000108 sequence_methods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000109 int len;
110 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000111
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000112 if (!newgetargs(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000113 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000114
Guido van Rossum12d12c51993-10-26 17:58:25 +0000115 if (is_stringobject(seq)) {
116 object *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000117 return r;
118 }
119
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000120 if (is_tupleobject(seq)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000121 object *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000122 return r;
123 }
124
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000125 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000126 err_setstr(TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000127 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000128 goto Fail_2;
129 }
130
131 if ((len = (*sqf->sq_length)(seq)) < 0)
132 goto Fail_2;
133
134 if (is_listobject(seq) && seq->ob_refcnt == 1) {
135 INCREF(seq);
136 result = seq;
137 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000138 else {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000139 if ((result = newlistobject(len)) == NULL)
140 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000141 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000142
Guido van Rossum2d951851994-08-29 12:52:16 +0000143 for (i = j = 0; ; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000144 object *item, *good;
145 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000146
Guido van Rossum2d951851994-08-29 12:52:16 +0000147 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
148 if (i < len)
149 goto Fail_1;
150 if (err_occurred() == IndexError) {
151 err_clear();
152 break;
153 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000154 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000155 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000156
157 if (func == None) {
158 good = item;
Guido van Rossum58b68731995-01-10 17:40:55 +0000159 INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000160 }
161 else {
162 object *arg = mkvalue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000163 if (arg == NULL)
164 goto Fail_1;
165 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000166 DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000167 if (good == NULL) {
168 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000169 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000170 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000171 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000172 ok = testbool(good);
173 DECREF(good);
174 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000175 if (j < len) {
176 if (setlistitem(result, j++, item) < 0)
177 goto Fail_1;
178 }
179 else {
180 j++;
181 if (addlistitem(result, item) < 0)
182 goto Fail_1;
183 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000184 } else {
185 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000186 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000187 }
188
Guido van Rossum12d12c51993-10-26 17:58:25 +0000189
Guido van Rossum2d951851994-08-29 12:52:16 +0000190 if (j < len && setlistslice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000191 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000192
Guido van Rossum12d12c51993-10-26 17:58:25 +0000193 return result;
194
Guido van Rossum12d12c51993-10-26 17:58:25 +0000195Fail_1:
196 DECREF(result);
197Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000198 return NULL;
199}
200
201static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000202builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000203 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000204 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000205{
206 long x;
207 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000208
209 if (!newgetargs(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000210 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000211 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000212 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000213 return NULL;
214 }
215 s[0] = x;
216 return newsizedstringobject(s, 1);
217}
218
219static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000220builtin_cmp(self, args)
221 object *self;
222 object *args;
223{
224 object *a, *b;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000225
226 if (!newgetargs(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000227 return NULL;
228 return newintobject((long)cmpobject(a, b));
229}
230
231static object *
Guido van Rossum5524a591995-01-10 15:26:20 +0000232builtin_coerce(self, args)
233 object *self;
234 object *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000235{
Guido van Rossum5524a591995-01-10 15:26:20 +0000236 object *v, *w;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000237 object *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000238
239 if (!newgetargs(args, "OO:coerce", &v, &w))
240 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000241 if (coerce(&v, &w) < 0)
242 return NULL;
243 res = mkvalue("(OO)", v, w);
244 DECREF(v);
245 DECREF(w);
246 return res;
247}
248
249static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000250builtin_compile(self, args)
251 object *self;
252 object *args;
253{
254 char *str;
255 char *filename;
256 char *startstr;
257 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000258
259 if (!newgetargs(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000260 return NULL;
261 if (strcmp(startstr, "exec") == 0)
262 start = file_input;
263 else if (strcmp(startstr, "eval") == 0)
264 start = eval_input;
265 else {
266 err_setstr(ValueError,
267 "compile() mode must be 'exec' or 'eval'");
268 return NULL;
269 }
270 return compile_string(str, filename, start);
271}
272
273static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000274builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000275 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000276 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000277{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000278 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000279 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000280
281 if (!newgetargs(args, "|O:dir", &v))
282 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000283 if (v == NULL) {
284 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000285 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000286 }
287 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000288 d = getattr(v, "__dict__");
289 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000290 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000291 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000292 return NULL;
293 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000294 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000295 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000296 v = getdictkeys(d);
297 if (sortlist(v) != 0) {
298 DECREF(v);
299 v = NULL;
300 }
301 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000302 else {
303 v = newlistobject(0);
304 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000305 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000306 return v;
307}
308
309static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000310do_divmod(v, w)
311 object *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000312{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000313 object *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000314
Guido van Rossum180d7b41994-09-29 09:45:57 +0000315 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000316 return instancebinop(v, w, "__divmod__", "__rdivmod__",
317 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000318 if (v->ob_type->tp_as_number == NULL ||
319 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000320 err_setstr(TypeError,
321 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000322 return NULL;
323 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000324 if (coerce(&v, &w) != 0)
325 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000326 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000327 DECREF(v);
328 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000329 return res;
330}
331
332static object *
333builtin_divmod(self, args)
334 object *self;
335 object *args;
336{
337 object *v, *w;
338
339 if (!newgetargs(args, "OO:divmod", &v, &w))
340 return NULL;
341 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000342}
343
344static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000345builtin_eval(self, args)
346 object *self;
347 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000348{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000349 object *cmd;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000350 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000351 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000352
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000353 if (!newgetargs(args, "O|O!O!:eval",
354 &cmd,
355 &Mappingtype, &globals,
356 &Mappingtype, &locals))
357 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000358 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000359 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000360 if (locals == None)
361 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000362 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000363 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000364 locals = globals;
365 if (dictlookup(globals, "__builtins__") == NULL) {
366 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
367 return NULL;
368 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000369 if (is_codeobject(cmd))
370 return eval_code((codeobject *) cmd, globals, locals,
Guido van Rossum81daa321993-05-20 14:24:46 +0000371 (object *)NULL, (object *)NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000372 if (!is_stringobject(cmd)) {
373 err_setstr(TypeError,
374 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000375 return NULL;
376 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000377 str = getstringvalue(cmd);
378 if (strlen(str) != getstringsize(cmd)) {
379 err_setstr(ValueError,
380 "embedded '\\0' in string arg");
381 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000382 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000383 while (*str == ' ' || *str == '\t')
384 str++;
385 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000386}
387
388static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000389builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000390 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000391 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000392{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000393 char *filename;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000394 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000395 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000396 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000397
398 if (!newgetargs(args, "s|O!O!:execfile",
399 &filename,
400 &Mappingtype, &globals,
401 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000402 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000403 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000404 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000405 if (locals == None)
406 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000407 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000408 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000409 locals = globals;
410 if (dictlookup(globals, "__builtins__") == NULL) {
411 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
412 return NULL;
413 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000414 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000415 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000416 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000417 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000418 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000419 return NULL;
420 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000421 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000422 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000423 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000424 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000426}
427
428static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000429builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000430 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000431 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000432{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000433 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000434 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435
436 if (!newgetargs(args, "O:float", &v))
437 return NULL;
438 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000439 nb->nb_float == NULL) {
440 err_setstr(TypeError,
441 "float() argument can't be converted to float");
442 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000443 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000444 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000445}
446
447static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000448builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000449 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000450 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000451{
Guido van Rossum94390a41992-08-14 15:14:30 +0000452 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000453 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000454
455 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000456 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000457 return getattro(v, name);
458}
459
460static object *
461builtin_hasattr(self, args)
462 object *self;
463 object *args;
464{
465 object *v;
466 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000467
468 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000469 return NULL;
470 v = getattro(v, name);
471 if (v == NULL) {
472 err_clear();
473 return newintobject(0L);
474 }
475 DECREF(v);
476 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000477}
478
479static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000480builtin_id(self, args)
481 object *self;
482 object *args;
483{
484 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000485
486 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000487 return NULL;
488 return newintobject((long)v);
489}
490
491static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000492builtin_map(self, args)
493 object *self;
494 object *args;
495{
496 typedef struct {
497 object *seq;
498 sequence_methods *sqf;
499 int len;
500 } sequence;
501
502 object *func, *result;
503 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000504 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000505 register int i, j;
506
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000507 n = gettuplesize(args);
508 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000509 err_setstr(TypeError, "map() requires at least two args");
510 return NULL;
511 }
512
513 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000514 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000515
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000516 if ((seqs = NEW(sequence, n)) == NULL) {
517 err_nomem();
518 goto Fail_2;
519 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000520
Guido van Rossum2d951851994-08-29 12:52:16 +0000521 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000522 int curlen;
523
524 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
525 goto Fail_2;
526
527 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
528 static char errmsg[] =
529 "argument %d to map() must be a sequence object";
530 char errbuf[sizeof(errmsg) + 3];
531
532 sprintf(errbuf, errmsg, i+2);
533 err_setstr(TypeError, errbuf);
534 goto Fail_2;
535 }
536
537 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
538 goto Fail_2;
539
540 if (curlen > len)
541 len = curlen;
542 }
543
544 if ((result = (object *) newlistobject(len)) == NULL)
545 goto Fail_2;
546
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000547 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000548 for (i = 0; ; ++i) {
549 object *arglist, *item, *value;
550 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000551
Guido van Rossum2d951851994-08-29 12:52:16 +0000552 if (func == None && n == 1)
553 arglist = NULL;
554 else {
555 if ((arglist = newtupleobject(n)) == NULL)
556 goto Fail_1;
557 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000558
559 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000560 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000561 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000562 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000563 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000564 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000565 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000566 if (item == NULL) {
567 if (i < sqp->len)
568 goto Fail_0;
569 if (err_occurred() == IndexError) {
570 err_clear();
571 INCREF(None);
572 item = None;
573 sqp->len = -1;
574 }
575 else {
576 goto Fail_0;
577 }
578 }
579 else
580 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000581
Guido van Rossum12d12c51993-10-26 17:58:25 +0000582 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000583 if (!arglist)
584 break;
585 if (settupleitem(arglist, j, item) < 0) {
586 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000587 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000588 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000589 continue;
590
591 Fail_0:
Guido van Rossum2d951851994-08-29 12:52:16 +0000592 XDECREF(arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000593 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000594 }
595
Guido van Rossum2d951851994-08-29 12:52:16 +0000596 if (!arglist)
597 arglist = item;
598
599 if (!any) {
600 DECREF(arglist);
601 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000602 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000603
604 if (func == None)
605 value = arglist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000606 else {
Guido van Rossum2d951851994-08-29 12:52:16 +0000607 value = call_object(func, arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000608 DECREF(arglist);
609 if (value == NULL)
610 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000611 }
612 if (i >= len) {
613 if (addlistitem(result, value) < 0)
614 goto Fail_1;
615 }
616 else {
617 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000618 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000619 }
620 }
621
Guido van Rossum2d951851994-08-29 12:52:16 +0000622 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000623 return result;
624
Guido van Rossum12d12c51993-10-26 17:58:25 +0000625Fail_1:
626 DECREF(result);
627Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000628 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000629 return NULL;
630}
631
632static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000633builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000634 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000635 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000636{
Guido van Rossum94390a41992-08-14 15:14:30 +0000637 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000638 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000639 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000640
641 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000642 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000643 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000644 return NULL;
645 INCREF(None);
646 return None;
647}
648
649static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000650builtin_delattr(self, args)
651 object *self;
652 object *args;
653{
654 object *v;
655 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000656
657 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000658 return NULL;
659 if (setattro(v, name, (object *)NULL) != 0)
660 return NULL;
661 INCREF(None);
662 return None;
663}
664
665static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000666builtin_hash(self, args)
667 object *self;
668 object *args;
669{
670 object *v;
671 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000672
673 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000674 return NULL;
675 x = hashobject(v);
676 if (x == -1)
677 return NULL;
678 return newintobject(x);
679}
680
681static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000682builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000683 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000684 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000685{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000686 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000687 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000688
689 if (!newgetargs(args, "O:hex", &v))
690 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000691
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000692 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000693 nb->nb_hex == NULL) {
694 err_setstr(TypeError,
695 "hex() argument can't be converted to hex");
696 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000697 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000698 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000699}
700
Guido van Rossum3165fe61992-09-25 21:59:05 +0000701static object *builtin_raw_input PROTO((object *, object *));
702
Guido van Rossum006bcd41991-10-24 14:54:44 +0000703static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000704builtin_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000705 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000706 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000707{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000708 object *line;
709 char *str;
710 object *res;
Guido van Rossum6135a871995-01-09 17:53:26 +0000711 object *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000712
713 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000714 if (line == NULL)
715 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000716 if (!getargs(line, "s;embedded '\\0' in input line", &str))
717 return NULL;
718 while (*str == ' ' || *str == '\t')
719 str++;
Guido van Rossum6135a871995-01-09 17:53:26 +0000720 globals = getglobals();
721 locals = getlocals();
722 if (dictlookup(globals, "__builtins__") == NULL) {
723 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
724 return NULL;
725 }
726 res = run_string(str, eval_input, globals, locals);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000727 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000728 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000729}
730
731static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000732builtin_int(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 *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000737 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000738
739 if (!newgetargs(args, "O:int", &v))
740 return NULL;
741 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000742 nb->nb_int == NULL) {
743 err_setstr(TypeError,
744 "int() argument can't be converted to int");
745 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000746 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000747 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000748}
749
750static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000751builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000752 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000753 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000754{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000755 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000756 long len;
757 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000758
759 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000760 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000761 tp = v->ob_type;
762 if (tp->tp_as_sequence != NULL) {
763 len = (*tp->tp_as_sequence->sq_length)(v);
764 }
765 else if (tp->tp_as_mapping != NULL) {
766 len = (*tp->tp_as_mapping->mp_length)(v);
767 }
768 else {
769 err_setstr(TypeError, "len() of unsized object");
770 return NULL;
771 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000772 if (len < 0)
773 return NULL;
774 else
775 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000776}
777
778static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000779builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000780 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000781 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000782{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000783 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000784 number_methods *nb;
785
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000786 if (!newgetargs(args, "O:long", &v))
787 return NULL;
788 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000789 nb->nb_long == NULL) {
790 err_setstr(TypeError,
791 "long() argument can't be converted to long");
792 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000793 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000794 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000795}
796
797static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000798min_max(args, sign)
799 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000800 int sign;
801{
Guido van Rossum2d951851994-08-29 12:52:16 +0000802 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000803 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000804 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000805
806 if (gettuplesize(args) > 1)
807 v = args;
808 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000809 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000810 sq = v->ob_type->tp_as_sequence;
811 if (sq == NULL) {
812 err_setstr(TypeError, "min() or max() of non-sequence");
813 return NULL;
814 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000815 w = NULL;
816 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000817 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000818 if (x == NULL) {
819 if (err_occurred() == IndexError) {
820 err_clear();
821 break;
822 }
823 XDECREF(w);
824 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000825 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000826 if (w == NULL)
827 w = x;
828 else {
829 if (cmpobject(x, w) * sign > 0) {
830 DECREF(w);
831 w = x;
832 }
833 else
834 DECREF(x);
835 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000836 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000837 if (w == NULL)
838 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000839 return w;
840}
841
842static object *
843builtin_min(self, v)
844 object *self;
845 object *v;
846{
847 return min_max(v, -1);
848}
849
850static object *
851builtin_max(self, v)
852 object *self;
853 object *v;
854{
855 return min_max(v, 1);
856}
857
858static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000859builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000860 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000861 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000862{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000863 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000864 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000865
866 if (!newgetargs(args, "O:oct", &v))
867 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000868 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
869 nb->nb_oct == NULL) {
870 err_setstr(TypeError,
871 "oct() argument can't be converted to oct");
872 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000873 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000874 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000875}
876
877static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000878builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000879 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000880 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000881{
Guido van Rossum2d951851994-08-29 12:52:16 +0000882 char *name;
883 char *mode = "r";
884 int bufsize = -1;
885 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000886
887 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000888 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000889 f = newfileobject(name, mode);
890 if (f != NULL)
891 setfilebufsize(f, bufsize);
892 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000893}
894
895static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000896builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000897 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000898 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000899{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000900 char c;
901
902 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000903 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000904 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000905}
906
907static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000908do_pow(v, w)
909 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +0000910{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000911 object *res;
912 if (is_instanceobject(v) || is_instanceobject(w))
913 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000914 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000915 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000916 err_setstr(TypeError, "pow() requires numeric arguments");
917 return NULL;
918 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000919 if (coerce(&v, &w) != 0)
920 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000921 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000922 DECREF(v);
923 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000924 return res;
925}
926
927static object *
928builtin_pow(self, args)
929 object *self;
930 object *args;
931{
932 object *v, *w, *z = None, *res;
933 object *v1, *z1, *w2, *z2;
934
935 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
936 return NULL;
937 if (z == None)
938 return do_pow(v, w);
939 /* XXX The ternary version doesn't do class instance coercions */
940 if (is_instanceobject(v))
941 return v->ob_type->tp_as_number->nb_power(v, w, z);
942 if (v->ob_type->tp_as_number == NULL ||
943 z->ob_type->tp_as_number == NULL ||
944 w->ob_type->tp_as_number == NULL) {
945 err_setstr(TypeError, "pow() requires numeric arguments");
946 return NULL;
947 }
948 if (coerce(&v, &w) != 0)
949 return NULL;
950 res = NULL;
951 v1 = v;
952 z1 = z;
953 if (coerce(&v1, &z1) != 0)
954 goto error2;
955 w2 = w;
956 z2 = z1;
957 if (coerce(&w2, &z2) != 0)
958 goto error1;
959 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
960 DECREF(w2);
961 DECREF(z2);
962 error1:
963 DECREF(v1);
964 DECREF(z1);
965 error2:
966 DECREF(v);
967 DECREF(w);
968 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +0000969}
970
971static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000972builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000973 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000974 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000975{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000976 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000977 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000978 object *v;
979
980 if (gettuplesize(args) <= 1) {
981 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +0000982 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000983 &ihigh))
984 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000985 }
986 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000987 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +0000988 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000989 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000990 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000991 }
992 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000993 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000994 return NULL;
995 }
996 /* XXX ought to check overflow of subtraction */
997 if (istep > 0)
998 n = (ihigh - ilow + istep - 1) / istep;
999 else
1000 n = (ihigh - ilow + istep + 1) / istep;
1001 if (n < 0)
1002 n = 0;
1003 v = newlistobject(n);
1004 if (v == NULL)
1005 return NULL;
1006 for (i = 0; i < n; i++) {
1007 object *w = newintobject(ilow);
1008 if (w == NULL) {
1009 DECREF(v);
1010 return NULL;
1011 }
1012 setlistitem(v, i, w);
1013 ilow += istep;
1014 }
1015 return v;
1016}
1017
1018static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001019builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001020 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001021 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001022{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001023 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001024 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001025
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001026 if (gettuplesize(args) <= 1) {
1027 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001028 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001029 &ihigh))
1030 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001031 }
1032 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001033 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001034 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001035 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001036 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001037 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001038 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001039 err_setstr(ValueError, "zero step for xrange()");
1040 return NULL;
1041 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001042 /* XXX ought to check overflow of subtraction */
1043 if (istep > 0)
1044 n = (ihigh - ilow + istep - 1) / istep;
1045 else
1046 n = (ihigh - ilow + istep + 1) / istep;
1047 if (n < 0)
1048 n = 0;
1049 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001050}
1051
1052static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001053builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001054 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001055 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001056{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001057 object *v = NULL;
1058 object *f;
1059
1060 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001061 return NULL;
Guido van Rossum90933611991-06-07 16:10:43 +00001062 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001063 f = sysget("stdout");
1064 if (f == NULL) {
1065 err_setstr(RuntimeError, "lost sys.stdout");
1066 return NULL;
1067 }
1068 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001069 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001070 return NULL;
1071 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001072 f = sysget("stdin");
1073 if (f == NULL) {
1074 err_setstr(RuntimeError, "lost sys.stdin");
1075 return NULL;
1076 }
1077 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001078}
1079
1080static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001081builtin_reduce(self, args)
1082 object *self;
1083 object *args;
1084{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001085 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001086 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001087 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001088
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001089 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1090 return NULL;
1091 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001092 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001093
1094 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1095 err_setstr(TypeError,
1096 "2nd argument to reduce() must be a sequence object");
1097 return NULL;
1098 }
1099
Guido van Rossum12d12c51993-10-26 17:58:25 +00001100 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001101 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001102
Guido van Rossum2d951851994-08-29 12:52:16 +00001103 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001104 object *op2;
1105
1106 if (args->ob_refcnt > 1) {
1107 DECREF(args);
1108 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001109 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001110 }
1111
Guido van Rossum2d951851994-08-29 12:52:16 +00001112 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1113 if (err_occurred() == IndexError) {
1114 err_clear();
1115 break;
1116 }
1117 goto Fail;
1118 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001119
Guido van Rossum2d951851994-08-29 12:52:16 +00001120 if (result == NULL)
1121 result = op2;
1122 else {
1123 settupleitem(args, 0, result);
1124 settupleitem(args, 1, op2);
1125 if ((result = call_object(func, args)) == NULL)
1126 goto Fail;
1127 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001128 }
1129
1130 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001131
Guido van Rossum2d951851994-08-29 12:52:16 +00001132 if (result == NULL)
1133 err_setstr(TypeError,
1134 "reduce of empty sequence with no initial value");
1135
Guido van Rossum12d12c51993-10-26 17:58:25 +00001136 return result;
1137
Guido van Rossum2d951851994-08-29 12:52:16 +00001138Fail:
1139 XDECREF(args);
1140 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001141 return NULL;
1142}
1143
1144static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001145builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001146 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001147 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001148{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001149 object *v;
1150
1151 if (!newgetargs(args, "O:reload", &v))
1152 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001153 return reload_module(v);
1154}
1155
1156static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001157builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001158 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001159 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001160{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001161 object *v;
1162
1163 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001164 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001165 return reprobject(v);
1166}
1167
1168static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001169builtin_round(self, args)
1170 object *self;
1171 object *args;
1172{
1173 extern double floor PROTO((double));
1174 extern double ceil PROTO((double));
1175 double x;
1176 double f;
1177 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001178 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001179
1180 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001181 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001182 f = 1.0;
1183 for (i = ndigits; --i >= 0; )
1184 f = f*10.0;
1185 for (i = ndigits; ++i <= 0; )
1186 f = f*0.1;
1187 if (x >= 0.0)
1188 return newfloatobject(floor(x*f + 0.5) / f);
1189 else
1190 return newfloatobject(ceil(x*f - 0.5) / f);
1191}
1192
1193static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001194builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001195 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001196 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001197{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001198 object *v;
1199
1200 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001201 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001202 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001203}
1204
1205static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001206builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001207 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001208 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001209{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001210 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001211 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001212
1213 if (!newgetargs(args, "O:tuple", &v))
1214 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001215 if (is_tupleobject(v)) {
1216 INCREF(v);
1217 return v;
1218 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001219 if (is_listobject(v))
1220 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001221 if (is_stringobject(v)) {
1222 int n = getstringsize(v);
1223 object *t = newtupleobject(n);
1224 if (t != NULL) {
1225 int i;
1226 char *p = getstringvalue(v);
1227 for (i = 0; i < n; i++) {
1228 object *item = newsizedstringobject(p+i, 1);
1229 if (item == NULL) {
1230 DECREF(t);
1231 t = NULL;
1232 break;
1233 }
1234 settupleitem(t, i, item);
1235 }
1236 }
1237 return t;
1238 }
1239 /* Generic sequence object */
1240 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1241 int n = (*sqf->sq_length)(v);
1242 int i;
1243 object *t;
1244 if (n < 0)
1245 return NULL;
1246 t = newtupleobject(n);
1247 if (t == NULL)
1248 return NULL;
1249 for (i = 0; i < n; i++) {
1250 object *item = (*sqf->sq_item)(v, i);
1251 if (item == NULL) {
1252 DECREF(t);
1253 t = NULL;
1254 break;
1255 }
1256 settupleitem(t, i, item);
1257 }
1258 /* XXX Should support indefinite-length sequences */
1259 return t;
1260 }
1261 /* None of the above */
1262 err_setstr(TypeError, "tuple() argument must be a sequence");
1263 return NULL;
1264}
1265
1266static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001267builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001268 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001269 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001270{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001271 object *v;
1272
1273 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001274 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001275 v = (object *)v->ob_type;
1276 INCREF(v);
1277 return v;
1278}
1279
Guido van Rossum2d951851994-08-29 12:52:16 +00001280static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001281builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001282 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001283 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001284{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001285 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001286 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001287
1288 if (!newgetargs(args, "|O:vars", &v))
1289 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001290 if (v == NULL) {
1291 d = getlocals();
1292 INCREF(d);
1293 }
1294 else {
1295 d = getattr(v, "__dict__");
1296 if (d == NULL) {
1297 err_setstr(TypeError,
1298 "vars() argument must have __dict__ attribute");
1299 return NULL;
1300 }
1301 }
1302 return d;
1303}
1304
Guido van Rossum3f5da241990-12-20 15:06:42 +00001305static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001306 {"__import__", builtin___import__, 1},
1307 {"abs", builtin_abs, 1},
1308 {"apply", builtin_apply, 1},
1309 {"callable", builtin_callable, 1},
1310 {"chr", builtin_chr, 1},
1311 {"cmp", builtin_cmp, 1},
1312 {"coerce", builtin_coerce, 1},
1313 {"compile", builtin_compile, 1},
1314 {"delattr", builtin_delattr, 1},
1315 {"dir", builtin_dir, 1},
1316 {"divmod", builtin_divmod, 1},
1317 {"eval", builtin_eval, 1},
1318 {"execfile", builtin_execfile, 1},
1319 {"filter", builtin_filter, 1},
1320 {"float", builtin_float, 1},
1321 {"getattr", builtin_getattr, 1},
1322 {"hasattr", builtin_hasattr, 1},
1323 {"hash", builtin_hash, 1},
1324 {"hex", builtin_hex, 1},
1325 {"id", builtin_id, 1},
1326 {"input", builtin_input, 1},
1327 {"int", builtin_int, 1},
1328 {"len", builtin_len, 1},
1329 {"long", builtin_long, 1},
1330 {"map", builtin_map, 1},
1331 {"max", builtin_max, 1},
1332 {"min", builtin_min, 1},
1333 {"oct", builtin_oct, 1},
1334 {"open", builtin_open, 1},
1335 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001336 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001337 {"range", builtin_range, 1},
1338 {"raw_input", builtin_raw_input, 1},
1339 {"reduce", builtin_reduce, 1},
1340 {"reload", builtin_reload, 1},
1341 {"repr", builtin_repr, 1},
1342 {"round", builtin_round, 1},
1343 {"setattr", builtin_setattr, 1},
1344 {"str", builtin_str, 1},
1345 {"tuple", builtin_tuple, 1},
1346 {"type", builtin_type, 1},
1347 {"vars", builtin_vars, 1},
1348 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001349 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001350};
1351
Guido van Rossum0865dd91995-01-17 16:30:22 +00001352static object *builtin_mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001353static object *builtin_dict;
1354
1355object *
Guido van Rossum0865dd91995-01-17 16:30:22 +00001356getbuiltinmod()
1357{
1358 return builtin_mod;
1359}
1360
1361object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001362getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001363{
Guido van Rossum6135a871995-01-09 17:53:26 +00001364 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001365}
1366
1367/* Predefined exceptions */
1368
Guido van Rossum25831651993-05-19 14:50:45 +00001369object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001370object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001371object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001372object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001373object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001374object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001375object *IndexError;
1376object *KeyError;
1377object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001378object *MemoryError;
1379object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001380object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001381object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001382object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001383object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001384object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001385object *TypeError;
1386object *ValueError;
1387object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001388
Guido van Rossum3f5da241990-12-20 15:06:42 +00001389static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001390newstdexception(name)
1391 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001392{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001393 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001394 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1395 fatal("no mem for new standard exception");
1396 return v;
1397}
1398
1399static void
1400initerrors()
1401{
Guido van Rossum25831651993-05-19 14:50:45 +00001402 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001403 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001404 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001405 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001406 IOError = newstdexception("IOError");
1407 ImportError = newstdexception("ImportError");
1408 IndexError = newstdexception("IndexError");
1409 KeyError = newstdexception("KeyError");
1410 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001411 MemoryError = newstdexception("MemoryError");
1412 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001413 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001414 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001415 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001416 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001417 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001418 TypeError = newstdexception("TypeError");
1419 ValueError = newstdexception("ValueError");
1420 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001421}
1422
1423void
1424initbuiltin()
1425{
Guido van Rossum0865dd91995-01-17 16:30:22 +00001426 builtin_mod = initmodule("__builtin__", builtin_methods);
1427 builtin_dict = getmoduledict(builtin_mod);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001428 INCREF(builtin_dict);
1429 initerrors();
1430 (void) dictinsert(builtin_dict, "None", None);
1431}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001432
Guido van Rossum12d12c51993-10-26 17:58:25 +00001433
Guido van Rossume77a7571993-11-03 15:01:26 +00001434/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001435
1436static object *
1437filtertuple(func, tuple)
1438 object *func;
1439 object *tuple;
1440{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001441 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001442 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001443 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001444
Guido van Rossum2586bf01993-11-01 16:21:44 +00001445 if ((result = newtupleobject(len)) == NULL)
1446 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001447
Guido van Rossum12d12c51993-10-26 17:58:25 +00001448 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001449 object *item, *good;
1450 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001451
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001452 if ((item = gettupleitem(tuple, i)) == NULL)
1453 goto Fail_1;
1454 if (func == None) {
1455 INCREF(item);
1456 good = item;
1457 }
1458 else {
1459 object *arg = mkvalue("(O)", item);
1460 if (arg == NULL)
1461 goto Fail_1;
1462 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001463 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001464 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001465 goto Fail_1;
1466 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001467 ok = testbool(good);
1468 DECREF(good);
1469 if (ok) {
1470 INCREF(item);
1471 if (settupleitem(result, j++, item) < 0)
1472 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001473 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001474 }
1475
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001476 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001477 return NULL;
1478
Guido van Rossum12d12c51993-10-26 17:58:25 +00001479 return result;
1480
Guido van Rossum12d12c51993-10-26 17:58:25 +00001481Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001482 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001483 return NULL;
1484}
1485
1486
Guido van Rossume77a7571993-11-03 15:01:26 +00001487/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001488
1489static object *
1490filterstring(func, strobj)
1491 object *func;
1492 object *strobj;
1493{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001494 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001495 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001496 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001497
Guido van Rossum2586bf01993-11-01 16:21:44 +00001498 if (func == None) {
1499 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001500 INCREF(strobj);
1501 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001502 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001503 if ((result = newsizedstringobject(NULL, len)) == NULL)
1504 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001505
Guido van Rossum12d12c51993-10-26 17:58:25 +00001506 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001507 object *item, *arg, *good;
1508 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001509
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001510 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1511 if (item == NULL)
1512 goto Fail_1;
1513 arg = mkvalue("(O)", item);
1514 DECREF(item);
1515 if (arg == NULL)
1516 goto Fail_1;
1517 good = call_object(func, arg);
1518 DECREF(arg);
1519 if (good == NULL)
1520 goto Fail_1;
1521 ok = testbool(good);
1522 DECREF(good);
1523 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001524 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001525 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001526 }
1527
Guido van Rossum12d12c51993-10-26 17:58:25 +00001528 if (resizestring(&result, j) < 0)
1529 return NULL;
1530
Guido van Rossum12d12c51993-10-26 17:58:25 +00001531 return result;
1532
Guido van Rossum12d12c51993-10-26 17:58:25 +00001533Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001534 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001535 return NULL;
1536}