blob: f47b4085e29e01f3a01283c2f1ada32a0e74f190 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum3f5da241990-12-20 15:06:42 +000025/* Built-in functions */
26
27#include "allobjects.h"
28
29#include "node.h"
30#include "graminit.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000031#include "sysmodule.h"
Guido van Rossum86cd6e61991-01-21 15:12:35 +000032#include "bltinmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000033#include "import.h"
34#include "pythonrun.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035#include "ceval.h"
36#include "modsupport.h"
Guido van Rossum5b722181993-03-30 17:46:03 +000037#include "compile.h"
38#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000039
Guido van Rossum12d12c51993-10-26 17:58:25 +000040/* Forward */
41static object *filterstring PROTO((object *, object *));
42static object *filtertuple PROTO((object *, object *));
Guido van Rossum12d12c51993-10-26 17:58:25 +000043
Guido van Rossum3f5da241990-12-20 15:06:42 +000044static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000045builtin___import__(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000046 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000047 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000048{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000049 char *name;
50 object *m;
51
52 if (!newgetargs(args, "s:__import__", &name))
53 return NULL;
54 m = import_module(name);
55 XINCREF(m);
56
57 return m;
58}
59
60
61static object *
62builtin_abs(self, args)
63 object *self;
64 object *args;
65{
66 object *v;
Guido van Rossumd4905451991-05-05 20:00:36 +000067 number_methods *nm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000068
69 if (!newgetargs(args, "O:abs", &v))
70 return NULL;
71 if ((nm = v->ob_type->tp_as_number) == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +000072 err_setstr(TypeError, "abs() requires numeric argument");
73 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000074 }
Guido van Rossumd4905451991-05-05 20:00:36 +000075 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000076}
77
78static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000079builtin_apply(self, args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000080 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000081 object *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000082{
Guido van Rossum94390a41992-08-14 15:14:30 +000083 object *func, *arglist;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000084
85 if (!newgetargs(args, "OO:apply", &func, &arglist))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000086 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +000087 if (!is_tupleobject(arglist)) {
88 err_setstr(TypeError, "apply() 2nd argument must be tuple");
89 return NULL;
90 }
Guido van Rossum94390a41992-08-14 15:14:30 +000091 return call_object(func, arglist);
Guido van Rossumc02e15c1991-12-16 13:03:00 +000092}
93
Guido van Rossum2d951851994-08-29 12:52:16 +000094static int
95callable(x)
96 object *x;
97{
98 if (x == NULL)
99 return 0;
100 if (x->ob_type->tp_call != NULL ||
101 is_funcobject(x) ||
102 is_instancemethodobject(x) ||
103 is_methodobject(x) ||
104 is_classobject(x))
105 return 1;
106 if (is_instanceobject(x)) {
107 object *call = getattr(x, "__call__");
108 if (call == NULL) {
109 err_clear();
110 return 0;
111 }
112 /* Could test recursively but don't, for fear of endless
113 recursion if some joker sets self.__call__ = self */
114 DECREF(call);
115 return 1;
116 }
117 return 0;
118}
119
120static object *
121builtin_callable(self, args)
122 object *self;
123 object *args;
124{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000125 object *v;
126
127 if (!newgetargs(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000128 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000129 return newintobject((long)callable(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000130}
131
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000132static object *
Guido van Rossume77a7571993-11-03 15:01:26 +0000133builtin_filter(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000134 object *self;
135 object *args;
136{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000137 object *func, *seq, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000138 sequence_methods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000139 int len;
140 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000141
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000142 if (!newgetargs(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000143 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000144
Guido van Rossum12d12c51993-10-26 17:58:25 +0000145 if (is_stringobject(seq)) {
146 object *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000147 return r;
148 }
149
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000150 if (is_tupleobject(seq)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000151 object *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000152 return r;
153 }
154
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000155 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000156 err_setstr(TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000157 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000158 goto Fail_2;
159 }
160
161 if ((len = (*sqf->sq_length)(seq)) < 0)
162 goto Fail_2;
163
164 if (is_listobject(seq) && seq->ob_refcnt == 1) {
165 INCREF(seq);
166 result = seq;
167 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000168 else {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000169 if ((result = newlistobject(len)) == NULL)
170 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000171 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000172
Guido van Rossum2d951851994-08-29 12:52:16 +0000173 for (i = j = 0; ; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000174 object *item, *good;
175 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000176
Guido van Rossum2d951851994-08-29 12:52:16 +0000177 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
178 if (i < len)
179 goto Fail_1;
180 if (err_occurred() == IndexError) {
181 err_clear();
182 break;
183 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000184 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000185 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000186
187 if (func == None) {
188 good = item;
189 }
190 else {
191 object *arg = mkvalue("(O)", item);
192 DECREF(item);
193 if (arg == NULL)
194 goto Fail_1;
195 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000196 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000197 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000198 goto Fail_1;
199 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000200 ok = testbool(good);
201 DECREF(good);
202 if (ok) {
203 INCREF(item);
Guido van Rossum2d951851994-08-29 12:52:16 +0000204 if (j < len) {
205 if (setlistitem(result, j++, item) < 0)
206 goto Fail_1;
207 }
208 else {
209 j++;
210 if (addlistitem(result, item) < 0)
211 goto Fail_1;
212 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000213 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000214 }
215
Guido van Rossum12d12c51993-10-26 17:58:25 +0000216
Guido van Rossum2d951851994-08-29 12:52:16 +0000217 if (j < len && setlistslice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000218 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000219
Guido van Rossum12d12c51993-10-26 17:58:25 +0000220 return result;
221
Guido van Rossum12d12c51993-10-26 17:58:25 +0000222Fail_1:
223 DECREF(result);
224Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000225 return NULL;
226}
227
228static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000229builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000230 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000231 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000232{
233 long x;
234 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000235
236 if (!newgetargs(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000237 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000238 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000239 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000240 return NULL;
241 }
242 s[0] = x;
243 return newsizedstringobject(s, 1);
244}
245
246static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000247builtin_cmp(self, args)
248 object *self;
249 object *args;
250{
251 object *a, *b;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000252
253 if (!newgetargs(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000254 return NULL;
255 return newintobject((long)cmpobject(a, b));
256}
257
258static object *
Guido van Rossum5524a591995-01-10 15:26:20 +0000259builtin_coerce(self, args)
260 object *self;
261 object *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000262{
Guido van Rossum5524a591995-01-10 15:26:20 +0000263 object *v, *w;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000264 object *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000265
266 if (!newgetargs(args, "OO:coerce", &v, &w))
267 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000268 if (coerce(&v, &w) < 0)
269 return NULL;
270 res = mkvalue("(OO)", v, w);
271 DECREF(v);
272 DECREF(w);
273 return res;
274}
275
276static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000277builtin_compile(self, args)
278 object *self;
279 object *args;
280{
281 char *str;
282 char *filename;
283 char *startstr;
284 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000285
286 if (!newgetargs(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000287 return NULL;
288 if (strcmp(startstr, "exec") == 0)
289 start = file_input;
290 else if (strcmp(startstr, "eval") == 0)
291 start = eval_input;
292 else {
293 err_setstr(ValueError,
294 "compile() mode must be 'exec' or 'eval'");
295 return NULL;
296 }
297 return compile_string(str, filename, start);
298}
299
300static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000301builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000302 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000303 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000304{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000305 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000306 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000307
308 if (!newgetargs(args, "|O:dir", &v))
309 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000310 if (v == NULL) {
311 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000312 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000313 }
314 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000315 d = getattr(v, "__dict__");
316 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000317 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000318 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000319 return NULL;
320 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000321 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000322 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000323 v = getdictkeys(d);
324 if (sortlist(v) != 0) {
325 DECREF(v);
326 v = NULL;
327 }
328 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000329 else {
330 v = newlistobject(0);
331 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000332 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000333 return v;
334}
335
336static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000337do_divmod(v, w)
338 object *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000339{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000340 object *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000341
Guido van Rossum180d7b41994-09-29 09:45:57 +0000342 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000343 return instancebinop(v, w, "__divmod__", "__rdivmod__",
344 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000345 if (v->ob_type->tp_as_number == NULL ||
346 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000347 err_setstr(TypeError,
348 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000349 return NULL;
350 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000351 if (coerce(&v, &w) != 0)
352 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000353 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000354 DECREF(v);
355 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000356 return res;
357}
358
359static object *
360builtin_divmod(self, args)
361 object *self;
362 object *args;
363{
364 object *v, *w;
365
366 if (!newgetargs(args, "OO:divmod", &v, &w))
367 return NULL;
368 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000369}
370
371static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000372builtin_eval(self, args)
373 object *self;
374 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000375{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000376 object *cmd;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000377 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000378 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000379
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000380 if (!newgetargs(args, "O|O!O!:eval",
381 &cmd,
382 &Mappingtype, &globals,
383 &Mappingtype, &locals))
384 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000385 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000386 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000387 if (locals == None)
388 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000389 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000390 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000391 locals = globals;
392 if (dictlookup(globals, "__builtins__") == NULL) {
393 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
394 return NULL;
395 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000396 if (is_codeobject(cmd))
397 return eval_code((codeobject *) cmd, globals, locals,
Guido van Rossum81daa321993-05-20 14:24:46 +0000398 (object *)NULL, (object *)NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000399 if (!is_stringobject(cmd)) {
400 err_setstr(TypeError,
401 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000402 return NULL;
403 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000404 str = getstringvalue(cmd);
405 if (strlen(str) != getstringsize(cmd)) {
406 err_setstr(ValueError,
407 "embedded '\\0' in string arg");
408 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000409 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000410 while (*str == ' ' || *str == '\t')
411 str++;
412 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000413}
414
415static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000416builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000417 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000418 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000419{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000420 char *filename;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000421 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000422 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000423 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000424 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000425 int n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000426
427 if (!newgetargs(args, "s|O!O!:execfile",
428 &filename,
429 &Mappingtype, &globals,
430 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000431 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000432 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000433 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000434 if (locals == None)
435 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000436 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000437 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000438 locals = globals;
439 if (dictlookup(globals, "__builtins__") == NULL) {
440 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
441 return NULL;
442 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000443 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000444 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000445 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000446 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000447 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000448 return NULL;
449 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000451 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000452 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000453 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000454 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000455}
456
457static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000459 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000460 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000461{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000462 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000463 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000464
465 if (!newgetargs(args, "O:float", &v))
466 return NULL;
467 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000468 nb->nb_float == NULL) {
469 err_setstr(TypeError,
470 "float() argument can't be converted to float");
471 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000472 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000473 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000474}
475
476static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000477builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000478 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000479 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000480{
Guido van Rossum94390a41992-08-14 15:14:30 +0000481 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000482 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000483
484 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000485 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000486 return getattro(v, name);
487}
488
489static object *
490builtin_hasattr(self, args)
491 object *self;
492 object *args;
493{
494 object *v;
495 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000496
497 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000498 return NULL;
499 v = getattro(v, name);
500 if (v == NULL) {
501 err_clear();
502 return newintobject(0L);
503 }
504 DECREF(v);
505 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000506}
507
508static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000509builtin_id(self, args)
510 object *self;
511 object *args;
512{
513 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000514
515 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000516 return NULL;
517 return newintobject((long)v);
518}
519
520static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000521builtin_map(self, args)
522 object *self;
523 object *args;
524{
525 typedef struct {
526 object *seq;
527 sequence_methods *sqf;
528 int len;
529 } sequence;
530
531 object *func, *result;
532 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000533 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000534 register int i, j;
535
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000536 n = gettuplesize(args);
537 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000538 err_setstr(TypeError, "map() requires at least two args");
539 return NULL;
540 }
541
542 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000543 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000544
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000545 if ((seqs = NEW(sequence, n)) == NULL) {
546 err_nomem();
547 goto Fail_2;
548 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000549
Guido van Rossum2d951851994-08-29 12:52:16 +0000550 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000551 int curlen;
552
553 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
554 goto Fail_2;
555
556 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
557 static char errmsg[] =
558 "argument %d to map() must be a sequence object";
559 char errbuf[sizeof(errmsg) + 3];
560
561 sprintf(errbuf, errmsg, i+2);
562 err_setstr(TypeError, errbuf);
563 goto Fail_2;
564 }
565
566 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
567 goto Fail_2;
568
569 if (curlen > len)
570 len = curlen;
571 }
572
573 if ((result = (object *) newlistobject(len)) == NULL)
574 goto Fail_2;
575
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000576 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000577 for (i = 0; ; ++i) {
578 object *arglist, *item, *value;
579 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000580
Guido van Rossum2d951851994-08-29 12:52:16 +0000581 if (func == None && n == 1)
582 arglist = NULL;
583 else {
584 if ((arglist = newtupleobject(n)) == NULL)
585 goto Fail_1;
586 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000587
588 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000589 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000590 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000591 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000592 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000593 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000594 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000595 if (item == NULL) {
596 if (i < sqp->len)
597 goto Fail_0;
598 if (err_occurred() == IndexError) {
599 err_clear();
600 INCREF(None);
601 item = None;
602 sqp->len = -1;
603 }
604 else {
605 goto Fail_0;
606 }
607 }
608 else
609 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000610
Guido van Rossum12d12c51993-10-26 17:58:25 +0000611 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000612 if (!arglist)
613 break;
614 if (settupleitem(arglist, j, item) < 0) {
615 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000616 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000617 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000618 continue;
619
620 Fail_0:
Guido van Rossum2d951851994-08-29 12:52:16 +0000621 XDECREF(arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000622 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000623 }
624
Guido van Rossum2d951851994-08-29 12:52:16 +0000625 if (!arglist)
626 arglist = item;
627
628 if (!any) {
629 DECREF(arglist);
630 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000631 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000632
633 if (func == None)
634 value = arglist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000635 else {
Guido van Rossum2d951851994-08-29 12:52:16 +0000636 value = call_object(func, arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000637 DECREF(arglist);
638 if (value == NULL)
639 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000640 }
641 if (i >= len) {
642 if (addlistitem(result, value) < 0)
643 goto Fail_1;
644 }
645 else {
646 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000647 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000648 }
649 }
650
Guido van Rossum2d951851994-08-29 12:52:16 +0000651 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000652 return result;
653
Guido van Rossum12d12c51993-10-26 17:58:25 +0000654Fail_1:
655 DECREF(result);
656Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000657 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000658 return NULL;
659}
660
661static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000662builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000663 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000664 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000665{
Guido van Rossum94390a41992-08-14 15:14:30 +0000666 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000667 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000668 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000669
670 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000671 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000672 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000673 return NULL;
674 INCREF(None);
675 return None;
676}
677
678static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000679builtin_delattr(self, args)
680 object *self;
681 object *args;
682{
683 object *v;
684 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000685
686 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000687 return NULL;
688 if (setattro(v, name, (object *)NULL) != 0)
689 return NULL;
690 INCREF(None);
691 return None;
692}
693
694static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000695builtin_hash(self, args)
696 object *self;
697 object *args;
698{
699 object *v;
700 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000701
702 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000703 return NULL;
704 x = hashobject(v);
705 if (x == -1)
706 return NULL;
707 return newintobject(x);
708}
709
710static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000711builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000712 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000713 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000714{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000715 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000716 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000717
718 if (!newgetargs(args, "O:hex", &v))
719 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000720
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000721 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000722 nb->nb_hex == NULL) {
723 err_setstr(TypeError,
724 "hex() argument can't be converted to hex");
725 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000726 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000727 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000728}
729
Guido van Rossum3165fe61992-09-25 21:59:05 +0000730static object *builtin_raw_input PROTO((object *, object *));
731
Guido van Rossum006bcd41991-10-24 14:54:44 +0000732static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000733builtin_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000734 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000735 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000736{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000737 object *line;
738 char *str;
739 object *res;
Guido van Rossum6135a871995-01-09 17:53:26 +0000740 object *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000741
742 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000743 if (line == NULL)
744 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000745 if (!getargs(line, "s;embedded '\\0' in input line", &str))
746 return NULL;
747 while (*str == ' ' || *str == '\t')
748 str++;
Guido van Rossum6135a871995-01-09 17:53:26 +0000749 globals = getglobals();
750 locals = getlocals();
751 if (dictlookup(globals, "__builtins__") == NULL) {
752 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
753 return NULL;
754 }
755 res = run_string(str, eval_input, globals, locals);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000756 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000757 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000758}
759
760static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000761builtin_int(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000762 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000763 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000764{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000765 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000766 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000767
768 if (!newgetargs(args, "O:int", &v))
769 return NULL;
770 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000771 nb->nb_int == NULL) {
772 err_setstr(TypeError,
773 "int() argument can't be converted to int");
774 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000775 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000776 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000777}
778
779static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000780builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000781 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000782 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000783{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000784 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000785 long len;
786 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000787
788 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000789 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000790 tp = v->ob_type;
791 if (tp->tp_as_sequence != NULL) {
792 len = (*tp->tp_as_sequence->sq_length)(v);
793 }
794 else if (tp->tp_as_mapping != NULL) {
795 len = (*tp->tp_as_mapping->mp_length)(v);
796 }
797 else {
798 err_setstr(TypeError, "len() of unsized object");
799 return NULL;
800 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000801 if (len < 0)
802 return NULL;
803 else
804 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000805}
806
807static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000808builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000809 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000810 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000811{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000812 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000813 number_methods *nb;
814
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000815 if (!newgetargs(args, "O:long", &v))
816 return NULL;
817 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000818 nb->nb_long == NULL) {
819 err_setstr(TypeError,
820 "long() argument can't be converted to long");
821 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000822 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000823 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000824}
825
826static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000827min_max(args, sign)
828 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000829 int sign;
830{
Guido van Rossum2d951851994-08-29 12:52:16 +0000831 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000832 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000833 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000834
835 if (gettuplesize(args) > 1)
836 v = args;
837 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000838 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000839 sq = v->ob_type->tp_as_sequence;
840 if (sq == NULL) {
841 err_setstr(TypeError, "min() or max() of non-sequence");
842 return NULL;
843 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000844 w = NULL;
845 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000846 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000847 if (x == NULL) {
848 if (err_occurred() == IndexError) {
849 err_clear();
850 break;
851 }
852 XDECREF(w);
853 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000854 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000855 if (w == NULL)
856 w = x;
857 else {
858 if (cmpobject(x, w) * sign > 0) {
859 DECREF(w);
860 w = x;
861 }
862 else
863 DECREF(x);
864 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000865 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000866 if (w == NULL)
867 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000868 return w;
869}
870
871static object *
872builtin_min(self, v)
873 object *self;
874 object *v;
875{
876 return min_max(v, -1);
877}
878
879static object *
880builtin_max(self, v)
881 object *self;
882 object *v;
883{
884 return min_max(v, 1);
885}
886
887static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000888builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000889 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000890 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000891{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000892 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000893 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000894
895 if (!newgetargs(args, "O:oct", &v))
896 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000897 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
898 nb->nb_oct == NULL) {
899 err_setstr(TypeError,
900 "oct() argument can't be converted to oct");
901 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000902 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000903 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000904}
905
906static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000907builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000908 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000909 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000910{
Guido van Rossum2d951851994-08-29 12:52:16 +0000911 char *name;
912 char *mode = "r";
913 int bufsize = -1;
914 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000915
916 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000917 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000918 f = newfileobject(name, mode);
919 if (f != NULL)
920 setfilebufsize(f, bufsize);
921 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000922}
923
924static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000925builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000926 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000927 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000928{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000929 char c;
930
931 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000932 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000933 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000934}
935
936static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000937do_pow(v, w)
938 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +0000939{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000940 object *res;
941 if (is_instanceobject(v) || is_instanceobject(w))
942 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000943 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000944 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000945 err_setstr(TypeError, "pow() requires numeric arguments");
946 return NULL;
947 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000948 if (coerce(&v, &w) != 0)
949 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000950 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000951 DECREF(v);
952 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000953 return res;
954}
955
956static object *
957builtin_pow(self, args)
958 object *self;
959 object *args;
960{
961 object *v, *w, *z = None, *res;
962 object *v1, *z1, *w2, *z2;
963
964 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
965 return NULL;
966 if (z == None)
967 return do_pow(v, w);
968 /* XXX The ternary version doesn't do class instance coercions */
969 if (is_instanceobject(v))
970 return v->ob_type->tp_as_number->nb_power(v, w, z);
971 if (v->ob_type->tp_as_number == NULL ||
972 z->ob_type->tp_as_number == NULL ||
973 w->ob_type->tp_as_number == NULL) {
974 err_setstr(TypeError, "pow() requires numeric arguments");
975 return NULL;
976 }
977 if (coerce(&v, &w) != 0)
978 return NULL;
979 res = NULL;
980 v1 = v;
981 z1 = z;
982 if (coerce(&v1, &z1) != 0)
983 goto error2;
984 w2 = w;
985 z2 = z1;
986 if (coerce(&w2, &z2) != 0)
987 goto error1;
988 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
989 DECREF(w2);
990 DECREF(z2);
991 error1:
992 DECREF(v1);
993 DECREF(z1);
994 error2:
995 DECREF(v);
996 DECREF(w);
997 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +0000998}
999
1000static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001001builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001002 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001003 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001004{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001005 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001006 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001007 object *v;
1008
1009 if (gettuplesize(args) <= 1) {
1010 if (!newgetargs(args,
1011 "i;range() requires 1-3 int arguments",
1012 &ihigh))
1013 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001014 }
1015 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001016 if (!newgetargs(args,
1017 "ii|i;range() requires 1-3 int arguments",
1018 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001019 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001020 }
1021 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001022 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001023 return NULL;
1024 }
1025 /* XXX ought to check overflow of subtraction */
1026 if (istep > 0)
1027 n = (ihigh - ilow + istep - 1) / istep;
1028 else
1029 n = (ihigh - ilow + istep + 1) / istep;
1030 if (n < 0)
1031 n = 0;
1032 v = newlistobject(n);
1033 if (v == NULL)
1034 return NULL;
1035 for (i = 0; i < n; i++) {
1036 object *w = newintobject(ilow);
1037 if (w == NULL) {
1038 DECREF(v);
1039 return NULL;
1040 }
1041 setlistitem(v, i, w);
1042 ilow += istep;
1043 }
1044 return v;
1045}
1046
1047static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001048builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001049 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001050 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001051{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001052 long ilow = 0, ihigh = 0, istep = 1;
1053 int n;
1054 object *v;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001055
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001056 if (gettuplesize(args) <= 1) {
1057 if (!newgetargs(args,
1058 "i;xrange() requires 1-3 int arguments",
1059 &ihigh))
1060 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001061 }
1062 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001063 if (!newgetargs(args,
1064 "ii|i;xrange() requires 1-3 int arguments",
1065 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001066 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001067 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001068 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001069 err_setstr(ValueError, "zero step for xrange()");
1070 return NULL;
1071 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001072 /* XXX ought to check overflow of subtraction */
1073 if (istep > 0)
1074 n = (ihigh - ilow + istep - 1) / istep;
1075 else
1076 n = (ihigh - ilow + istep + 1) / istep;
1077 if (n < 0)
1078 n = 0;
1079 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001080}
1081
1082static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001083builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001084 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001085 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001086{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001087 object *v = NULL;
1088 object *f;
1089
1090 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001091 return NULL;
Guido van Rossum90933611991-06-07 16:10:43 +00001092 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001093 f = sysget("stdout");
1094 if (f == NULL) {
1095 err_setstr(RuntimeError, "lost sys.stdout");
1096 return NULL;
1097 }
1098 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001099 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001100 return NULL;
1101 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001102 f = sysget("stdin");
1103 if (f == NULL) {
1104 err_setstr(RuntimeError, "lost sys.stdin");
1105 return NULL;
1106 }
1107 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001108}
1109
1110static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001111builtin_reduce(self, args)
1112 object *self;
1113 object *args;
1114{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001115 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001116 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001117 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001118
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001119 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1120 return NULL;
1121 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001122 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001123
1124 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1125 err_setstr(TypeError,
1126 "2nd argument to reduce() must be a sequence object");
1127 return NULL;
1128 }
1129
Guido van Rossum12d12c51993-10-26 17:58:25 +00001130 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001131 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001132
Guido van Rossum2d951851994-08-29 12:52:16 +00001133 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001134 object *op2;
1135
1136 if (args->ob_refcnt > 1) {
1137 DECREF(args);
1138 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001139 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001140 }
1141
Guido van Rossum2d951851994-08-29 12:52:16 +00001142 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1143 if (err_occurred() == IndexError) {
1144 err_clear();
1145 break;
1146 }
1147 goto Fail;
1148 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001149
Guido van Rossum2d951851994-08-29 12:52:16 +00001150 if (result == NULL)
1151 result = op2;
1152 else {
1153 settupleitem(args, 0, result);
1154 settupleitem(args, 1, op2);
1155 if ((result = call_object(func, args)) == NULL)
1156 goto Fail;
1157 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001158 }
1159
1160 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001161
Guido van Rossum2d951851994-08-29 12:52:16 +00001162 if (result == NULL)
1163 err_setstr(TypeError,
1164 "reduce of empty sequence with no initial value");
1165
Guido van Rossum12d12c51993-10-26 17:58:25 +00001166 return result;
1167
Guido van Rossum2d951851994-08-29 12:52:16 +00001168Fail:
1169 XDECREF(args);
1170 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001171 return NULL;
1172}
1173
1174static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001175builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001176 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001177 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001178{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001179 object *v;
1180
1181 if (!newgetargs(args, "O:reload", &v))
1182 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001183 return reload_module(v);
1184}
1185
1186static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001187builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001188 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001189 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001190{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001191 object *v;
1192
1193 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001194 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001195 return reprobject(v);
1196}
1197
1198static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001199builtin_round(self, args)
1200 object *self;
1201 object *args;
1202{
1203 extern double floor PROTO((double));
1204 extern double ceil PROTO((double));
1205 double x;
1206 double f;
1207 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001208 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001209
1210 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001211 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001212 f = 1.0;
1213 for (i = ndigits; --i >= 0; )
1214 f = f*10.0;
1215 for (i = ndigits; ++i <= 0; )
1216 f = f*0.1;
1217 if (x >= 0.0)
1218 return newfloatobject(floor(x*f + 0.5) / f);
1219 else
1220 return newfloatobject(ceil(x*f - 0.5) / f);
1221}
1222
1223static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001224builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001225 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001226 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001227{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001228 object *v;
1229
1230 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001231 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001232 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001233}
1234
1235static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001236builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001237 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001238 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001239{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001240 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001241 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001242
1243 if (!newgetargs(args, "O:tuple", &v))
1244 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001245 if (is_tupleobject(v)) {
1246 INCREF(v);
1247 return v;
1248 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001249 if (is_listobject(v))
1250 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001251 if (is_stringobject(v)) {
1252 int n = getstringsize(v);
1253 object *t = newtupleobject(n);
1254 if (t != NULL) {
1255 int i;
1256 char *p = getstringvalue(v);
1257 for (i = 0; i < n; i++) {
1258 object *item = newsizedstringobject(p+i, 1);
1259 if (item == NULL) {
1260 DECREF(t);
1261 t = NULL;
1262 break;
1263 }
1264 settupleitem(t, i, item);
1265 }
1266 }
1267 return t;
1268 }
1269 /* Generic sequence object */
1270 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1271 int n = (*sqf->sq_length)(v);
1272 int i;
1273 object *t;
1274 if (n < 0)
1275 return NULL;
1276 t = newtupleobject(n);
1277 if (t == NULL)
1278 return NULL;
1279 for (i = 0; i < n; i++) {
1280 object *item = (*sqf->sq_item)(v, i);
1281 if (item == NULL) {
1282 DECREF(t);
1283 t = NULL;
1284 break;
1285 }
1286 settupleitem(t, i, item);
1287 }
1288 /* XXX Should support indefinite-length sequences */
1289 return t;
1290 }
1291 /* None of the above */
1292 err_setstr(TypeError, "tuple() argument must be a sequence");
1293 return NULL;
1294}
1295
1296static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001297builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001298 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001299 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001300{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001301 object *v;
1302
1303 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001304 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001305 v = (object *)v->ob_type;
1306 INCREF(v);
1307 return v;
1308}
1309
Guido van Rossum2d951851994-08-29 12:52:16 +00001310static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001311builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001312 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001313 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001314{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001315 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001316 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001317
1318 if (!newgetargs(args, "|O:vars", &v))
1319 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001320 if (v == NULL) {
1321 d = getlocals();
1322 INCREF(d);
1323 }
1324 else {
1325 d = getattr(v, "__dict__");
1326 if (d == NULL) {
1327 err_setstr(TypeError,
1328 "vars() argument must have __dict__ attribute");
1329 return NULL;
1330 }
1331 }
1332 return d;
1333}
1334
Guido van Rossum3f5da241990-12-20 15:06:42 +00001335static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001336 {"__import__", builtin___import__, 1},
1337 {"abs", builtin_abs, 1},
1338 {"apply", builtin_apply, 1},
1339 {"callable", builtin_callable, 1},
1340 {"chr", builtin_chr, 1},
1341 {"cmp", builtin_cmp, 1},
1342 {"coerce", builtin_coerce, 1},
1343 {"compile", builtin_compile, 1},
1344 {"delattr", builtin_delattr, 1},
1345 {"dir", builtin_dir, 1},
1346 {"divmod", builtin_divmod, 1},
1347 {"eval", builtin_eval, 1},
1348 {"execfile", builtin_execfile, 1},
1349 {"filter", builtin_filter, 1},
1350 {"float", builtin_float, 1},
1351 {"getattr", builtin_getattr, 1},
1352 {"hasattr", builtin_hasattr, 1},
1353 {"hash", builtin_hash, 1},
1354 {"hex", builtin_hex, 1},
1355 {"id", builtin_id, 1},
1356 {"input", builtin_input, 1},
1357 {"int", builtin_int, 1},
1358 {"len", builtin_len, 1},
1359 {"long", builtin_long, 1},
1360 {"map", builtin_map, 1},
1361 {"max", builtin_max, 1},
1362 {"min", builtin_min, 1},
1363 {"oct", builtin_oct, 1},
1364 {"open", builtin_open, 1},
1365 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001366 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001367 {"range", builtin_range, 1},
1368 {"raw_input", builtin_raw_input, 1},
1369 {"reduce", builtin_reduce, 1},
1370 {"reload", builtin_reload, 1},
1371 {"repr", builtin_repr, 1},
1372 {"round", builtin_round, 1},
1373 {"setattr", builtin_setattr, 1},
1374 {"str", builtin_str, 1},
1375 {"tuple", builtin_tuple, 1},
1376 {"type", builtin_type, 1},
1377 {"vars", builtin_vars, 1},
1378 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001379 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001380};
1381
1382static object *builtin_dict;
1383
1384object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001385getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001386{
Guido van Rossum6135a871995-01-09 17:53:26 +00001387 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001388}
1389
1390/* Predefined exceptions */
1391
Guido van Rossum25831651993-05-19 14:50:45 +00001392object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001393object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001394object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001395object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001396object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001397object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001398object *IndexError;
1399object *KeyError;
1400object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001401object *MemoryError;
1402object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001403object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001404object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001405object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001406object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001407object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001408object *TypeError;
1409object *ValueError;
1410object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001411
Guido van Rossum3f5da241990-12-20 15:06:42 +00001412static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001413newstdexception(name)
1414 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001415{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001416 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001417 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1418 fatal("no mem for new standard exception");
1419 return v;
1420}
1421
1422static void
1423initerrors()
1424{
Guido van Rossum25831651993-05-19 14:50:45 +00001425 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001426 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001427 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001428 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001429 IOError = newstdexception("IOError");
1430 ImportError = newstdexception("ImportError");
1431 IndexError = newstdexception("IndexError");
1432 KeyError = newstdexception("KeyError");
1433 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001434 MemoryError = newstdexception("MemoryError");
1435 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001436 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001437 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001438 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001439 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001440 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001441 TypeError = newstdexception("TypeError");
1442 ValueError = newstdexception("ValueError");
1443 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001444}
1445
1446void
1447initbuiltin()
1448{
1449 object *m;
Guido van Rossum89b33251993-10-22 14:26:06 +00001450 m = initmodule("__builtin__", builtin_methods);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001451 builtin_dict = getmoduledict(m);
1452 INCREF(builtin_dict);
1453 initerrors();
1454 (void) dictinsert(builtin_dict, "None", None);
1455}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001456
Guido van Rossum12d12c51993-10-26 17:58:25 +00001457
Guido van Rossume77a7571993-11-03 15:01:26 +00001458/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001459
1460static object *
1461filtertuple(func, tuple)
1462 object *func;
1463 object *tuple;
1464{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001465 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001466 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001467 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001468
Guido van Rossum2586bf01993-11-01 16:21:44 +00001469 if ((result = newtupleobject(len)) == NULL)
1470 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001471
Guido van Rossum12d12c51993-10-26 17:58:25 +00001472 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001473 object *item, *good;
1474 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001475
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001476 if ((item = gettupleitem(tuple, i)) == NULL)
1477 goto Fail_1;
1478 if (func == None) {
1479 INCREF(item);
1480 good = item;
1481 }
1482 else {
1483 object *arg = mkvalue("(O)", item);
1484 if (arg == NULL)
1485 goto Fail_1;
1486 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001487 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001488 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001489 goto Fail_1;
1490 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001491 ok = testbool(good);
1492 DECREF(good);
1493 if (ok) {
1494 INCREF(item);
1495 if (settupleitem(result, j++, item) < 0)
1496 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001497 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001498 }
1499
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001500 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001501 return NULL;
1502
Guido van Rossum12d12c51993-10-26 17:58:25 +00001503 return result;
1504
Guido van Rossum12d12c51993-10-26 17:58:25 +00001505Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001506 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001507 return NULL;
1508}
1509
1510
Guido van Rossume77a7571993-11-03 15:01:26 +00001511/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001512
1513static object *
1514filterstring(func, strobj)
1515 object *func;
1516 object *strobj;
1517{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001518 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001519 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001520 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001521
Guido van Rossum2586bf01993-11-01 16:21:44 +00001522 if (func == None) {
1523 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001524 INCREF(strobj);
1525 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001526 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001527 if ((result = newsizedstringobject(NULL, len)) == NULL)
1528 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001529
Guido van Rossum12d12c51993-10-26 17:58:25 +00001530 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001531 object *item, *arg, *good;
1532 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001533
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001534 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1535 if (item == NULL)
1536 goto Fail_1;
1537 arg = mkvalue("(O)", item);
1538 DECREF(item);
1539 if (arg == NULL)
1540 goto Fail_1;
1541 good = call_object(func, arg);
1542 DECREF(arg);
1543 if (good == NULL)
1544 goto Fail_1;
1545 ok = testbool(good);
1546 DECREF(good);
1547 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001548 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001549 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001550 }
1551
Guido van Rossum12d12c51993-10-26 17:58:25 +00001552 if (resizestring(&result, j) < 0)
1553 return NULL;
1554
Guido van Rossum12d12c51993-10-26 17:58:25 +00001555 return result;
1556
Guido van Rossum12d12c51993-10-26 17:58:25 +00001557Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001558 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001559 return NULL;
1560}