blob: 83eeecbe806d2ee60dc2e34a425b12151ade9976 [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 Rossum21651581995-02-10 16:57:16 +0000919 if ((w->ob_type==&Floattype) &&
920 (*v->ob_type->tp_as_number->nb_negative)(v)) {
921 err_setstr(ValueError, "negative number to float power");
922 return NULL;
923 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000924 if (coerce(&v, &w) != 0)
925 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000926 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000927 DECREF(v);
928 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000929 return res;
930}
931
932static object *
933builtin_pow(self, args)
934 object *self;
935 object *args;
936{
937 object *v, *w, *z = None, *res;
938 object *v1, *z1, *w2, *z2;
939
940 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
941 return NULL;
942 if (z == None)
943 return do_pow(v, w);
944 /* XXX The ternary version doesn't do class instance coercions */
945 if (is_instanceobject(v))
946 return v->ob_type->tp_as_number->nb_power(v, w, z);
947 if (v->ob_type->tp_as_number == NULL ||
948 z->ob_type->tp_as_number == NULL ||
949 w->ob_type->tp_as_number == NULL) {
950 err_setstr(TypeError, "pow() requires numeric arguments");
951 return NULL;
952 }
953 if (coerce(&v, &w) != 0)
954 return NULL;
955 res = NULL;
956 v1 = v;
957 z1 = z;
958 if (coerce(&v1, &z1) != 0)
959 goto error2;
960 w2 = w;
961 z2 = z1;
962 if (coerce(&w2, &z2) != 0)
963 goto error1;
964 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
965 DECREF(w2);
966 DECREF(z2);
967 error1:
968 DECREF(v1);
969 DECREF(z1);
970 error2:
971 DECREF(v);
972 DECREF(w);
973 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +0000974}
975
976static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000977builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000978 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000979 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000980{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000981 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000982 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000983 object *v;
984
985 if (gettuplesize(args) <= 1) {
986 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +0000987 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000988 &ihigh))
989 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000990 }
991 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000992 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +0000993 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000994 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000995 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000996 }
997 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000998 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000999 return NULL;
1000 }
1001 /* XXX ought to check overflow of subtraction */
1002 if (istep > 0)
1003 n = (ihigh - ilow + istep - 1) / istep;
1004 else
1005 n = (ihigh - ilow + istep + 1) / istep;
1006 if (n < 0)
1007 n = 0;
1008 v = newlistobject(n);
1009 if (v == NULL)
1010 return NULL;
1011 for (i = 0; i < n; i++) {
1012 object *w = newintobject(ilow);
1013 if (w == NULL) {
1014 DECREF(v);
1015 return NULL;
1016 }
1017 setlistitem(v, i, w);
1018 ilow += istep;
1019 }
1020 return v;
1021}
1022
1023static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001024builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001025 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001026 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001027{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001028 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001029 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001030
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001031 if (gettuplesize(args) <= 1) {
1032 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001033 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001034 &ihigh))
1035 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001036 }
1037 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001038 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001039 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001040 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001041 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001042 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001043 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001044 err_setstr(ValueError, "zero step for xrange()");
1045 return NULL;
1046 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001047 /* XXX ought to check overflow of subtraction */
1048 if (istep > 0)
1049 n = (ihigh - ilow + istep - 1) / istep;
1050 else
1051 n = (ihigh - ilow + istep + 1) / istep;
1052 if (n < 0)
1053 n = 0;
1054 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001055}
1056
1057static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001058builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001059 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001060 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001061{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001062 object *v = NULL;
1063 object *f;
1064
1065 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001066 return NULL;
Guido van Rossum90933611991-06-07 16:10:43 +00001067 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001068 f = sysget("stdout");
1069 if (f == NULL) {
1070 err_setstr(RuntimeError, "lost sys.stdout");
1071 return NULL;
1072 }
1073 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001074 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001075 return NULL;
1076 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001077 f = sysget("stdin");
1078 if (f == NULL) {
1079 err_setstr(RuntimeError, "lost sys.stdin");
1080 return NULL;
1081 }
1082 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001083}
1084
1085static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001086builtin_reduce(self, args)
1087 object *self;
1088 object *args;
1089{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001090 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001091 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001092 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001093
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001094 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1095 return NULL;
1096 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001097 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001098
1099 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1100 err_setstr(TypeError,
1101 "2nd argument to reduce() must be a sequence object");
1102 return NULL;
1103 }
1104
Guido van Rossum12d12c51993-10-26 17:58:25 +00001105 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001106 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001107
Guido van Rossum2d951851994-08-29 12:52:16 +00001108 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001109 object *op2;
1110
1111 if (args->ob_refcnt > 1) {
1112 DECREF(args);
1113 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001114 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001115 }
1116
Guido van Rossum2d951851994-08-29 12:52:16 +00001117 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1118 if (err_occurred() == IndexError) {
1119 err_clear();
1120 break;
1121 }
1122 goto Fail;
1123 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001124
Guido van Rossum2d951851994-08-29 12:52:16 +00001125 if (result == NULL)
1126 result = op2;
1127 else {
1128 settupleitem(args, 0, result);
1129 settupleitem(args, 1, op2);
1130 if ((result = call_object(func, args)) == NULL)
1131 goto Fail;
1132 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001133 }
1134
1135 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001136
Guido van Rossum2d951851994-08-29 12:52:16 +00001137 if (result == NULL)
1138 err_setstr(TypeError,
1139 "reduce of empty sequence with no initial value");
1140
Guido van Rossum12d12c51993-10-26 17:58:25 +00001141 return result;
1142
Guido van Rossum2d951851994-08-29 12:52:16 +00001143Fail:
1144 XDECREF(args);
1145 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001146 return NULL;
1147}
1148
1149static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001150builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001151 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001152 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001153{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001154 object *v;
1155
1156 if (!newgetargs(args, "O:reload", &v))
1157 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001158 return reload_module(v);
1159}
1160
1161static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001162builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001163 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001164 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001165{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001166 object *v;
1167
1168 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001169 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001170 return reprobject(v);
1171}
1172
1173static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001174builtin_round(self, args)
1175 object *self;
1176 object *args;
1177{
1178 extern double floor PROTO((double));
1179 extern double ceil PROTO((double));
1180 double x;
1181 double f;
1182 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001183 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001184
1185 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001186 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001187 f = 1.0;
1188 for (i = ndigits; --i >= 0; )
1189 f = f*10.0;
1190 for (i = ndigits; ++i <= 0; )
1191 f = f*0.1;
1192 if (x >= 0.0)
1193 return newfloatobject(floor(x*f + 0.5) / f);
1194 else
1195 return newfloatobject(ceil(x*f - 0.5) / f);
1196}
1197
1198static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001199builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001200 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001201 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001202{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001203 object *v;
1204
1205 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001206 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001207 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001208}
1209
1210static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001211builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001212 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001213 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001214{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001215 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001216 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001217
1218 if (!newgetargs(args, "O:tuple", &v))
1219 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001220 if (is_tupleobject(v)) {
1221 INCREF(v);
1222 return v;
1223 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001224 if (is_listobject(v))
1225 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001226 if (is_stringobject(v)) {
1227 int n = getstringsize(v);
1228 object *t = newtupleobject(n);
1229 if (t != NULL) {
1230 int i;
1231 char *p = getstringvalue(v);
1232 for (i = 0; i < n; i++) {
1233 object *item = newsizedstringobject(p+i, 1);
1234 if (item == NULL) {
1235 DECREF(t);
1236 t = NULL;
1237 break;
1238 }
1239 settupleitem(t, i, item);
1240 }
1241 }
1242 return t;
1243 }
1244 /* Generic sequence object */
1245 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1246 int n = (*sqf->sq_length)(v);
1247 int i;
1248 object *t;
1249 if (n < 0)
1250 return NULL;
1251 t = newtupleobject(n);
1252 if (t == NULL)
1253 return NULL;
1254 for (i = 0; i < n; i++) {
1255 object *item = (*sqf->sq_item)(v, i);
1256 if (item == NULL) {
1257 DECREF(t);
1258 t = NULL;
1259 break;
1260 }
1261 settupleitem(t, i, item);
1262 }
1263 /* XXX Should support indefinite-length sequences */
1264 return t;
1265 }
1266 /* None of the above */
1267 err_setstr(TypeError, "tuple() argument must be a sequence");
1268 return NULL;
1269}
1270
1271static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001272builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001273 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001274 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001275{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001276 object *v;
1277
1278 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001279 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001280 v = (object *)v->ob_type;
1281 INCREF(v);
1282 return v;
1283}
1284
Guido van Rossum2d951851994-08-29 12:52:16 +00001285static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001286builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001287 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001288 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001289{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001291 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001292
1293 if (!newgetargs(args, "|O:vars", &v))
1294 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001295 if (v == NULL) {
1296 d = getlocals();
1297 INCREF(d);
1298 }
1299 else {
1300 d = getattr(v, "__dict__");
1301 if (d == NULL) {
1302 err_setstr(TypeError,
1303 "vars() argument must have __dict__ attribute");
1304 return NULL;
1305 }
1306 }
1307 return d;
1308}
1309
Guido van Rossum3f5da241990-12-20 15:06:42 +00001310static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001311 {"__import__", builtin___import__, 1},
1312 {"abs", builtin_abs, 1},
1313 {"apply", builtin_apply, 1},
1314 {"callable", builtin_callable, 1},
1315 {"chr", builtin_chr, 1},
1316 {"cmp", builtin_cmp, 1},
1317 {"coerce", builtin_coerce, 1},
1318 {"compile", builtin_compile, 1},
1319 {"delattr", builtin_delattr, 1},
1320 {"dir", builtin_dir, 1},
1321 {"divmod", builtin_divmod, 1},
1322 {"eval", builtin_eval, 1},
1323 {"execfile", builtin_execfile, 1},
1324 {"filter", builtin_filter, 1},
1325 {"float", builtin_float, 1},
1326 {"getattr", builtin_getattr, 1},
1327 {"hasattr", builtin_hasattr, 1},
1328 {"hash", builtin_hash, 1},
1329 {"hex", builtin_hex, 1},
1330 {"id", builtin_id, 1},
1331 {"input", builtin_input, 1},
1332 {"int", builtin_int, 1},
1333 {"len", builtin_len, 1},
1334 {"long", builtin_long, 1},
1335 {"map", builtin_map, 1},
1336 {"max", builtin_max, 1},
1337 {"min", builtin_min, 1},
1338 {"oct", builtin_oct, 1},
1339 {"open", builtin_open, 1},
1340 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001341 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001342 {"range", builtin_range, 1},
1343 {"raw_input", builtin_raw_input, 1},
1344 {"reduce", builtin_reduce, 1},
1345 {"reload", builtin_reload, 1},
1346 {"repr", builtin_repr, 1},
1347 {"round", builtin_round, 1},
1348 {"setattr", builtin_setattr, 1},
1349 {"str", builtin_str, 1},
1350 {"tuple", builtin_tuple, 1},
1351 {"type", builtin_type, 1},
1352 {"vars", builtin_vars, 1},
1353 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001354 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001355};
1356
Guido van Rossum0865dd91995-01-17 16:30:22 +00001357static object *builtin_mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001358static object *builtin_dict;
1359
1360object *
Guido van Rossum0865dd91995-01-17 16:30:22 +00001361getbuiltinmod()
1362{
1363 return builtin_mod;
1364}
1365
1366object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001367getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001368{
Guido van Rossum6135a871995-01-09 17:53:26 +00001369 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001370}
1371
1372/* Predefined exceptions */
1373
Guido van Rossum25831651993-05-19 14:50:45 +00001374object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001375object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001376object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001377object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001378object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001379object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001380object *IndexError;
1381object *KeyError;
1382object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001383object *MemoryError;
1384object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001385object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001386object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001387object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001388object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001389object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001390object *TypeError;
1391object *ValueError;
1392object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001393
Guido van Rossum3f5da241990-12-20 15:06:42 +00001394static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001395newstdexception(name)
1396 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001397{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001398 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001399 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1400 fatal("no mem for new standard exception");
1401 return v;
1402}
1403
1404static void
1405initerrors()
1406{
Guido van Rossum25831651993-05-19 14:50:45 +00001407 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001408 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001409 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001410 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001411 IOError = newstdexception("IOError");
1412 ImportError = newstdexception("ImportError");
1413 IndexError = newstdexception("IndexError");
1414 KeyError = newstdexception("KeyError");
1415 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001416 MemoryError = newstdexception("MemoryError");
1417 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001418 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001419 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001420 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001421 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001422 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001423 TypeError = newstdexception("TypeError");
1424 ValueError = newstdexception("ValueError");
1425 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001426}
1427
1428void
1429initbuiltin()
1430{
Guido van Rossum0865dd91995-01-17 16:30:22 +00001431 builtin_mod = initmodule("__builtin__", builtin_methods);
1432 builtin_dict = getmoduledict(builtin_mod);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001433 INCREF(builtin_dict);
1434 initerrors();
1435 (void) dictinsert(builtin_dict, "None", None);
1436}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001437
Guido van Rossum12d12c51993-10-26 17:58:25 +00001438
Guido van Rossume77a7571993-11-03 15:01:26 +00001439/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001440
1441static object *
1442filtertuple(func, tuple)
1443 object *func;
1444 object *tuple;
1445{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001446 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001447 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001448 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001449
Guido van Rossum2586bf01993-11-01 16:21:44 +00001450 if ((result = newtupleobject(len)) == NULL)
1451 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001452
Guido van Rossum12d12c51993-10-26 17:58:25 +00001453 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001454 object *item, *good;
1455 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001456
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001457 if ((item = gettupleitem(tuple, i)) == NULL)
1458 goto Fail_1;
1459 if (func == None) {
1460 INCREF(item);
1461 good = item;
1462 }
1463 else {
1464 object *arg = mkvalue("(O)", item);
1465 if (arg == NULL)
1466 goto Fail_1;
1467 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001468 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001469 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001470 goto Fail_1;
1471 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001472 ok = testbool(good);
1473 DECREF(good);
1474 if (ok) {
1475 INCREF(item);
1476 if (settupleitem(result, j++, item) < 0)
1477 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001478 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001479 }
1480
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001481 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001482 return NULL;
1483
Guido van Rossum12d12c51993-10-26 17:58:25 +00001484 return result;
1485
Guido van Rossum12d12c51993-10-26 17:58:25 +00001486Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001487 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001488 return NULL;
1489}
1490
1491
Guido van Rossume77a7571993-11-03 15:01:26 +00001492/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001493
1494static object *
1495filterstring(func, strobj)
1496 object *func;
1497 object *strobj;
1498{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001499 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001500 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001501 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001502
Guido van Rossum2586bf01993-11-01 16:21:44 +00001503 if (func == None) {
1504 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001505 INCREF(strobj);
1506 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001507 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001508 if ((result = newsizedstringobject(NULL, len)) == NULL)
1509 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001510
Guido van Rossum12d12c51993-10-26 17:58:25 +00001511 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001512 object *item, *arg, *good;
1513 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001514
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001515 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1516 if (item == NULL)
1517 goto Fail_1;
1518 arg = mkvalue("(O)", item);
1519 DECREF(item);
1520 if (arg == NULL)
1521 goto Fail_1;
1522 good = call_object(func, arg);
1523 DECREF(arg);
1524 if (good == NULL)
1525 goto Fail_1;
1526 ok = testbool(good);
1527 DECREF(good);
1528 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001529 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001530 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001531 }
1532
Guido van Rossum12d12c51993-10-26 17:58:25 +00001533 if (resizestring(&result, j) < 0)
1534 return NULL;
1535
Guido van Rossum12d12c51993-10-26 17:58:25 +00001536 return result;
1537
Guido van Rossum12d12c51993-10-26 17:58:25 +00001538Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001539 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001540 return NULL;
1541}