blob: 0dc6f00bffabe707f81ef9c75b70c4d7d9573703 [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 Rossum24c13741995-02-14 09:42:43 +000050 object *globals = NULL;
51 object *locals = NULL;
52 object *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000053
Guido van Rossum24c13741995-02-14 09:42:43 +000054 if (!newgetargs(args, "s|OOO:__import__",
55 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000056 return NULL;
Guido van Rossum7f9fa971995-01-20 16:53:12 +000057 return import_module(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000058}
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 object *
95builtin_callable(self, args)
96 object *self;
97 object *args;
98{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000099 object *v;
100
101 if (!newgetargs(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000102 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000103 return newintobject((long)callable(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000104}
105
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000106static object *
Guido van Rossume77a7571993-11-03 15:01:26 +0000107builtin_filter(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000108 object *self;
109 object *args;
110{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000111 object *func, *seq, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000112 sequence_methods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000113 int len;
114 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000115
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000116 if (!newgetargs(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000117 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000118
Guido van Rossum12d12c51993-10-26 17:58:25 +0000119 if (is_stringobject(seq)) {
120 object *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000121 return r;
122 }
123
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000124 if (is_tupleobject(seq)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000125 object *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000126 return r;
127 }
128
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000129 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000130 err_setstr(TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000131 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000132 goto Fail_2;
133 }
134
135 if ((len = (*sqf->sq_length)(seq)) < 0)
136 goto Fail_2;
137
138 if (is_listobject(seq) && seq->ob_refcnt == 1) {
139 INCREF(seq);
140 result = seq;
141 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000142 else {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000143 if ((result = newlistobject(len)) == NULL)
144 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000145 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000146
Guido van Rossum2d951851994-08-29 12:52:16 +0000147 for (i = j = 0; ; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000148 object *item, *good;
149 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000150
Guido van Rossum2d951851994-08-29 12:52:16 +0000151 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
152 if (i < len)
153 goto Fail_1;
154 if (err_occurred() == IndexError) {
155 err_clear();
156 break;
157 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000158 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000159 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000160
161 if (func == None) {
162 good = item;
Guido van Rossum58b68731995-01-10 17:40:55 +0000163 INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000164 }
165 else {
166 object *arg = mkvalue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000167 if (arg == NULL)
168 goto Fail_1;
169 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000170 DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000171 if (good == NULL) {
172 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000173 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000174 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000175 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000176 ok = testbool(good);
177 DECREF(good);
178 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000179 if (j < len) {
180 if (setlistitem(result, j++, item) < 0)
181 goto Fail_1;
182 }
183 else {
184 j++;
185 if (addlistitem(result, item) < 0)
186 goto Fail_1;
187 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000188 } else {
189 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000190 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000191 }
192
Guido van Rossum12d12c51993-10-26 17:58:25 +0000193
Guido van Rossum2d951851994-08-29 12:52:16 +0000194 if (j < len && setlistslice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000195 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000196
Guido van Rossum12d12c51993-10-26 17:58:25 +0000197 return result;
198
Guido van Rossum12d12c51993-10-26 17:58:25 +0000199Fail_1:
200 DECREF(result);
201Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000202 return NULL;
203}
204
205static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000206builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000207 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000208 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000209{
210 long x;
211 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000212
213 if (!newgetargs(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000214 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000215 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000216 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000217 return NULL;
218 }
219 s[0] = x;
220 return newsizedstringobject(s, 1);
221}
222
223static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000224builtin_cmp(self, args)
225 object *self;
226 object *args;
227{
228 object *a, *b;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000229
230 if (!newgetargs(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000231 return NULL;
232 return newintobject((long)cmpobject(a, b));
233}
234
235static object *
Guido van Rossum5524a591995-01-10 15:26:20 +0000236builtin_coerce(self, args)
237 object *self;
238 object *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000239{
Guido van Rossum5524a591995-01-10 15:26:20 +0000240 object *v, *w;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000241 object *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000242
243 if (!newgetargs(args, "OO:coerce", &v, &w))
244 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000245 if (coerce(&v, &w) < 0)
246 return NULL;
247 res = mkvalue("(OO)", v, w);
248 DECREF(v);
249 DECREF(w);
250 return res;
251}
252
253static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000254builtin_compile(self, args)
255 object *self;
256 object *args;
257{
258 char *str;
259 char *filename;
260 char *startstr;
261 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000262
263 if (!newgetargs(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000264 return NULL;
265 if (strcmp(startstr, "exec") == 0)
266 start = file_input;
267 else if (strcmp(startstr, "eval") == 0)
268 start = eval_input;
269 else {
270 err_setstr(ValueError,
271 "compile() mode must be 'exec' or 'eval'");
272 return NULL;
273 }
274 return compile_string(str, filename, start);
275}
276
277static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000278builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000279 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000280 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000281{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000282 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000283 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000284
285 if (!newgetargs(args, "|O:dir", &v))
286 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000287 if (v == NULL) {
288 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000289 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000290 }
291 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000292 d = getattr(v, "__dict__");
293 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000294 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000295 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000296 return NULL;
297 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000298 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000299 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000300 v = getdictkeys(d);
301 if (sortlist(v) != 0) {
302 DECREF(v);
303 v = NULL;
304 }
305 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000306 else {
307 v = newlistobject(0);
308 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000309 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000310 return v;
311}
312
313static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000314do_divmod(v, w)
315 object *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000316{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000317 object *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000318
Guido van Rossum180d7b41994-09-29 09:45:57 +0000319 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000320 return instancebinop(v, w, "__divmod__", "__rdivmod__",
321 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000322 if (v->ob_type->tp_as_number == NULL ||
323 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000324 err_setstr(TypeError,
325 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000326 return NULL;
327 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000328 if (coerce(&v, &w) != 0)
329 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000330 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000331 DECREF(v);
332 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000333 return res;
334}
335
336static object *
337builtin_divmod(self, args)
338 object *self;
339 object *args;
340{
341 object *v, *w;
342
343 if (!newgetargs(args, "OO:divmod", &v, &w))
344 return NULL;
345 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000346}
347
348static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000349builtin_eval(self, args)
350 object *self;
351 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000352{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000353 object *cmd;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000354 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000355 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000356
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000357 if (!newgetargs(args, "O|O!O!:eval",
358 &cmd,
359 &Mappingtype, &globals,
360 &Mappingtype, &locals))
361 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000362 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000363 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000364 if (locals == None)
365 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000366 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000367 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000368 locals = globals;
369 if (dictlookup(globals, "__builtins__") == NULL) {
370 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
371 return NULL;
372 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000373 if (is_codeobject(cmd))
374 return eval_code((codeobject *) cmd, globals, locals,
Guido van Rossum81daa321993-05-20 14:24:46 +0000375 (object *)NULL, (object *)NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000376 if (!is_stringobject(cmd)) {
377 err_setstr(TypeError,
378 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000379 return NULL;
380 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000381 str = getstringvalue(cmd);
382 if (strlen(str) != getstringsize(cmd)) {
383 err_setstr(ValueError,
384 "embedded '\\0' in string arg");
385 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000386 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000387 while (*str == ' ' || *str == '\t')
388 str++;
389 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000390}
391
392static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000393builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000394 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000395 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000396{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000397 char *filename;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000398 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000399 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000400 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000401
402 if (!newgetargs(args, "s|O!O!:execfile",
403 &filename,
404 &Mappingtype, &globals,
405 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000406 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000407 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000408 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000409 if (locals == None)
410 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000411 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000412 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000413 locals = globals;
414 if (dictlookup(globals, "__builtins__") == NULL) {
415 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
416 return NULL;
417 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000418 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000419 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000420 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000421 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000422 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000423 return NULL;
424 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000426 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000427 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000428 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000429 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000430}
431
432static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000433builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000434 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000436{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000437 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000438 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000439
440 if (!newgetargs(args, "O:float", &v))
441 return NULL;
442 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000443 nb->nb_float == NULL) {
444 err_setstr(TypeError,
445 "float() argument can't be converted to float");
446 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000447 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000448 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000449}
450
451static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000452builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000453 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000454 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000455{
Guido van Rossum94390a41992-08-14 15:14:30 +0000456 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000457 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458
459 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000460 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000461 return getattro(v, name);
462}
463
464static object *
465builtin_hasattr(self, args)
466 object *self;
467 object *args;
468{
469 object *v;
470 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000471
472 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000473 return NULL;
474 v = getattro(v, name);
475 if (v == NULL) {
476 err_clear();
477 return newintobject(0L);
478 }
479 DECREF(v);
480 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000481}
482
483static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000484builtin_id(self, args)
485 object *self;
486 object *args;
487{
488 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000489
490 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000491 return NULL;
492 return newintobject((long)v);
493}
494
495static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000496builtin_map(self, args)
497 object *self;
498 object *args;
499{
500 typedef struct {
501 object *seq;
502 sequence_methods *sqf;
503 int len;
504 } sequence;
505
506 object *func, *result;
507 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000508 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000509 register int i, j;
510
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000511 n = gettuplesize(args);
512 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000513 err_setstr(TypeError, "map() requires at least two args");
514 return NULL;
515 }
516
517 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000518 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000519
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000520 if ((seqs = NEW(sequence, n)) == NULL) {
521 err_nomem();
522 goto Fail_2;
523 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000524
Guido van Rossum2d951851994-08-29 12:52:16 +0000525 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000526 int curlen;
527
528 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
529 goto Fail_2;
530
531 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
532 static char errmsg[] =
533 "argument %d to map() must be a sequence object";
534 char errbuf[sizeof(errmsg) + 3];
535
536 sprintf(errbuf, errmsg, i+2);
537 err_setstr(TypeError, errbuf);
538 goto Fail_2;
539 }
540
541 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
542 goto Fail_2;
543
544 if (curlen > len)
545 len = curlen;
546 }
547
548 if ((result = (object *) newlistobject(len)) == NULL)
549 goto Fail_2;
550
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000551 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000552 for (i = 0; ; ++i) {
553 object *arglist, *item, *value;
554 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000555
Guido van Rossum2d951851994-08-29 12:52:16 +0000556 if (func == None && n == 1)
557 arglist = NULL;
558 else {
559 if ((arglist = newtupleobject(n)) == NULL)
560 goto Fail_1;
561 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000562
563 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000564 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000565 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000566 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000567 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000568 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000569 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000570 if (item == NULL) {
571 if (i < sqp->len)
572 goto Fail_0;
573 if (err_occurred() == IndexError) {
574 err_clear();
575 INCREF(None);
576 item = None;
577 sqp->len = -1;
578 }
579 else {
580 goto Fail_0;
581 }
582 }
583 else
584 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000585
Guido van Rossum12d12c51993-10-26 17:58:25 +0000586 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000587 if (!arglist)
588 break;
589 if (settupleitem(arglist, j, item) < 0) {
590 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000591 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000592 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000593 continue;
594
595 Fail_0:
Guido van Rossum2d951851994-08-29 12:52:16 +0000596 XDECREF(arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000597 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000598 }
599
Guido van Rossum2d951851994-08-29 12:52:16 +0000600 if (!arglist)
601 arglist = item;
602
603 if (!any) {
604 DECREF(arglist);
605 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000606 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000607
608 if (func == None)
609 value = arglist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000610 else {
Guido van Rossum2d951851994-08-29 12:52:16 +0000611 value = call_object(func, arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000612 DECREF(arglist);
613 if (value == NULL)
614 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000615 }
616 if (i >= len) {
617 if (addlistitem(result, value) < 0)
618 goto Fail_1;
619 }
620 else {
621 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000622 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000623 }
624 }
625
Guido van Rossum2d951851994-08-29 12:52:16 +0000626 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000627 return result;
628
Guido van Rossum12d12c51993-10-26 17:58:25 +0000629Fail_1:
630 DECREF(result);
631Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000632 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000633 return NULL;
634}
635
636static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000637builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000638 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000639 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000640{
Guido van Rossum94390a41992-08-14 15:14:30 +0000641 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000642 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000643 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000644
645 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000646 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000647 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000648 return NULL;
649 INCREF(None);
650 return None;
651}
652
653static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000654builtin_delattr(self, args)
655 object *self;
656 object *args;
657{
658 object *v;
659 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000660
661 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000662 return NULL;
663 if (setattro(v, name, (object *)NULL) != 0)
664 return NULL;
665 INCREF(None);
666 return None;
667}
668
669static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000670builtin_hash(self, args)
671 object *self;
672 object *args;
673{
674 object *v;
675 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000676
677 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000678 return NULL;
679 x = hashobject(v);
680 if (x == -1)
681 return NULL;
682 return newintobject(x);
683}
684
685static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000686builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000687 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000688 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000689{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000690 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000691 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000692
693 if (!newgetargs(args, "O:hex", &v))
694 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000695
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000696 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000697 nb->nb_hex == NULL) {
698 err_setstr(TypeError,
699 "hex() argument can't be converted to hex");
700 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000701 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000702 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000703}
704
Guido van Rossum3165fe61992-09-25 21:59:05 +0000705static object *builtin_raw_input PROTO((object *, object *));
706
Guido van Rossum006bcd41991-10-24 14:54:44 +0000707static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000708builtin_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000709 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000710 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000711{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000712 object *line;
713 char *str;
714 object *res;
Guido van Rossum6135a871995-01-09 17:53:26 +0000715 object *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000716
717 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000718 if (line == NULL)
719 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000720 if (!getargs(line, "s;embedded '\\0' in input line", &str))
721 return NULL;
722 while (*str == ' ' || *str == '\t')
723 str++;
Guido van Rossum6135a871995-01-09 17:53:26 +0000724 globals = getglobals();
725 locals = getlocals();
726 if (dictlookup(globals, "__builtins__") == NULL) {
727 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
728 return NULL;
729 }
730 res = run_string(str, eval_input, globals, locals);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000731 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000732 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000733}
734
735static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000736builtin_int(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000737 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000738 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000739{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000740 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000741 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000742
743 if (!newgetargs(args, "O:int", &v))
744 return NULL;
745 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000746 nb->nb_int == NULL) {
747 err_setstr(TypeError,
748 "int() argument can't be converted to int");
749 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000750 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000751 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000752}
753
754static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000755builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000756 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000757 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000758{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000759 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000760 long len;
761 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000762
763 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000764 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000765 tp = v->ob_type;
766 if (tp->tp_as_sequence != NULL) {
767 len = (*tp->tp_as_sequence->sq_length)(v);
768 }
769 else if (tp->tp_as_mapping != NULL) {
770 len = (*tp->tp_as_mapping->mp_length)(v);
771 }
772 else {
773 err_setstr(TypeError, "len() of unsized object");
774 return NULL;
775 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000776 if (len < 0)
777 return NULL;
778 else
779 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000780}
781
782static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000783builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000784 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000785 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000786{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000787 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000788 number_methods *nb;
789
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000790 if (!newgetargs(args, "O:long", &v))
791 return NULL;
792 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000793 nb->nb_long == NULL) {
794 err_setstr(TypeError,
795 "long() argument can't be converted to long");
796 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000797 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000798 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000799}
800
801static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000802min_max(args, sign)
803 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000804 int sign;
805{
Guido van Rossum2d951851994-08-29 12:52:16 +0000806 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000808 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000809
810 if (gettuplesize(args) > 1)
811 v = args;
812 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000813 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000814 sq = v->ob_type->tp_as_sequence;
815 if (sq == NULL) {
816 err_setstr(TypeError, "min() or max() of non-sequence");
817 return NULL;
818 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000819 w = NULL;
820 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000821 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000822 if (x == NULL) {
823 if (err_occurred() == IndexError) {
824 err_clear();
825 break;
826 }
827 XDECREF(w);
828 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000829 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000830 if (w == NULL)
831 w = x;
832 else {
833 if (cmpobject(x, w) * sign > 0) {
834 DECREF(w);
835 w = x;
836 }
837 else
838 DECREF(x);
839 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000840 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000841 if (w == NULL)
842 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000843 return w;
844}
845
846static object *
847builtin_min(self, v)
848 object *self;
849 object *v;
850{
851 return min_max(v, -1);
852}
853
854static object *
855builtin_max(self, v)
856 object *self;
857 object *v;
858{
859 return min_max(v, 1);
860}
861
862static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000863builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000864 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000865 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000866{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000867 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000868 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000869
870 if (!newgetargs(args, "O:oct", &v))
871 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000872 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
873 nb->nb_oct == NULL) {
874 err_setstr(TypeError,
875 "oct() argument can't be converted to oct");
876 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000877 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000878 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000879}
880
881static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000882builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000883 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000884 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000885{
Guido van Rossum2d951851994-08-29 12:52:16 +0000886 char *name;
887 char *mode = "r";
888 int bufsize = -1;
889 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000890
891 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000892 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000893 f = newfileobject(name, mode);
894 if (f != NULL)
895 setfilebufsize(f, bufsize);
896 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000897}
898
899static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000900builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000901 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000902 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000903{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000904 char c;
905
906 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000907 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000908 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000909}
910
911static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000912do_pow(v, w)
913 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +0000914{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000915 object *res;
916 if (is_instanceobject(v) || is_instanceobject(w))
917 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000918 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000919 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000920 err_setstr(TypeError, "pow() requires numeric arguments");
921 return NULL;
922 }
Guido van Rossum8a1e8eb1995-02-18 14:51:32 +0000923 if (is_floatobject(w) && getfloatvalue(v) < 0.0) {
924 if (!err_occurred())
925 err_setstr(ValueError, "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +0000926 return NULL;
927 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000928 if (coerce(&v, &w) != 0)
929 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000930 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000931 DECREF(v);
932 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000933 return res;
934}
935
936static object *
937builtin_pow(self, args)
938 object *self;
939 object *args;
940{
941 object *v, *w, *z = None, *res;
942 object *v1, *z1, *w2, *z2;
943
944 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
945 return NULL;
946 if (z == None)
947 return do_pow(v, w);
948 /* XXX The ternary version doesn't do class instance coercions */
949 if (is_instanceobject(v))
950 return v->ob_type->tp_as_number->nb_power(v, w, z);
951 if (v->ob_type->tp_as_number == NULL ||
952 z->ob_type->tp_as_number == NULL ||
953 w->ob_type->tp_as_number == NULL) {
954 err_setstr(TypeError, "pow() requires numeric arguments");
955 return NULL;
956 }
957 if (coerce(&v, &w) != 0)
958 return NULL;
959 res = NULL;
960 v1 = v;
961 z1 = z;
962 if (coerce(&v1, &z1) != 0)
963 goto error2;
964 w2 = w;
965 z2 = z1;
966 if (coerce(&w2, &z2) != 0)
967 goto error1;
968 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
969 DECREF(w2);
970 DECREF(z2);
971 error1:
972 DECREF(v1);
973 DECREF(z1);
974 error2:
975 DECREF(v);
976 DECREF(w);
977 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +0000978}
979
980static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000981builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000982 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000983 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000984{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000985 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000986 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000987 object *v;
988
989 if (gettuplesize(args) <= 1) {
990 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +0000991 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000992 &ihigh))
993 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000994 }
995 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000996 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +0000997 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000998 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000999 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001000 }
1001 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001002 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001003 return NULL;
1004 }
1005 /* XXX ought to check overflow of subtraction */
1006 if (istep > 0)
1007 n = (ihigh - ilow + istep - 1) / istep;
1008 else
1009 n = (ihigh - ilow + istep + 1) / istep;
1010 if (n < 0)
1011 n = 0;
1012 v = newlistobject(n);
1013 if (v == NULL)
1014 return NULL;
1015 for (i = 0; i < n; i++) {
1016 object *w = newintobject(ilow);
1017 if (w == NULL) {
1018 DECREF(v);
1019 return NULL;
1020 }
1021 setlistitem(v, i, w);
1022 ilow += istep;
1023 }
1024 return v;
1025}
1026
1027static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001028builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001029 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001030 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001031{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001032 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001033 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001034
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001035 if (gettuplesize(args) <= 1) {
1036 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001037 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001038 &ihigh))
1039 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001040 }
1041 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001042 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001043 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001044 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001045 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001046 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001047 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001048 err_setstr(ValueError, "zero step for xrange()");
1049 return NULL;
1050 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001051 /* XXX ought to check overflow of subtraction */
1052 if (istep > 0)
1053 n = (ihigh - ilow + istep - 1) / istep;
1054 else
1055 n = (ihigh - ilow + istep + 1) / istep;
1056 if (n < 0)
1057 n = 0;
1058 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001059}
1060
1061static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001062builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001063 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001064 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001065{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001066 object *v = NULL;
1067 object *f;
1068
1069 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001070 return NULL;
Guido van Rossum90933611991-06-07 16:10:43 +00001071 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001072 f = sysget("stdout");
1073 if (f == NULL) {
1074 err_setstr(RuntimeError, "lost sys.stdout");
1075 return NULL;
1076 }
1077 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001078 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001079 return NULL;
1080 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001081 f = sysget("stdin");
1082 if (f == NULL) {
1083 err_setstr(RuntimeError, "lost sys.stdin");
1084 return NULL;
1085 }
1086 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001087}
1088
1089static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001090builtin_reduce(self, args)
1091 object *self;
1092 object *args;
1093{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001094 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001095 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001096 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001097
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001098 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1099 return NULL;
1100 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001101 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001102
1103 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1104 err_setstr(TypeError,
1105 "2nd argument to reduce() must be a sequence object");
1106 return NULL;
1107 }
1108
Guido van Rossum12d12c51993-10-26 17:58:25 +00001109 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001110 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001111
Guido van Rossum2d951851994-08-29 12:52:16 +00001112 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001113 object *op2;
1114
1115 if (args->ob_refcnt > 1) {
1116 DECREF(args);
1117 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001118 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001119 }
1120
Guido van Rossum2d951851994-08-29 12:52:16 +00001121 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1122 if (err_occurred() == IndexError) {
1123 err_clear();
1124 break;
1125 }
1126 goto Fail;
1127 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001128
Guido van Rossum2d951851994-08-29 12:52:16 +00001129 if (result == NULL)
1130 result = op2;
1131 else {
1132 settupleitem(args, 0, result);
1133 settupleitem(args, 1, op2);
1134 if ((result = call_object(func, args)) == NULL)
1135 goto Fail;
1136 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001137 }
1138
1139 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001140
Guido van Rossum2d951851994-08-29 12:52:16 +00001141 if (result == NULL)
1142 err_setstr(TypeError,
1143 "reduce of empty sequence with no initial value");
1144
Guido van Rossum12d12c51993-10-26 17:58:25 +00001145 return result;
1146
Guido van Rossum2d951851994-08-29 12:52:16 +00001147Fail:
1148 XDECREF(args);
1149 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001150 return NULL;
1151}
1152
1153static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001154builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001155 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001156 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001157{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001158 object *v;
1159
1160 if (!newgetargs(args, "O:reload", &v))
1161 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001162 return reload_module(v);
1163}
1164
1165static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001166builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001167 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001168 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001169{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001170 object *v;
1171
1172 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001173 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001174 return reprobject(v);
1175}
1176
1177static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001178builtin_round(self, args)
1179 object *self;
1180 object *args;
1181{
1182 extern double floor PROTO((double));
1183 extern double ceil PROTO((double));
1184 double x;
1185 double f;
1186 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001187 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001188
1189 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001190 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001191 f = 1.0;
1192 for (i = ndigits; --i >= 0; )
1193 f = f*10.0;
1194 for (i = ndigits; ++i <= 0; )
1195 f = f*0.1;
1196 if (x >= 0.0)
1197 return newfloatobject(floor(x*f + 0.5) / f);
1198 else
1199 return newfloatobject(ceil(x*f - 0.5) / f);
1200}
1201
1202static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001203builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001204 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001205 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001206{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001207 object *v;
1208
1209 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001210 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001211 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001212}
1213
1214static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001215builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001216 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001217 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001218{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001219 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001220 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001221
1222 if (!newgetargs(args, "O:tuple", &v))
1223 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001224 if (is_tupleobject(v)) {
1225 INCREF(v);
1226 return v;
1227 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001228 if (is_listobject(v))
1229 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001230 if (is_stringobject(v)) {
1231 int n = getstringsize(v);
1232 object *t = newtupleobject(n);
1233 if (t != NULL) {
1234 int i;
1235 char *p = getstringvalue(v);
1236 for (i = 0; i < n; i++) {
1237 object *item = newsizedstringobject(p+i, 1);
1238 if (item == NULL) {
1239 DECREF(t);
1240 t = NULL;
1241 break;
1242 }
1243 settupleitem(t, i, item);
1244 }
1245 }
1246 return t;
1247 }
1248 /* Generic sequence object */
1249 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1250 int n = (*sqf->sq_length)(v);
1251 int i;
1252 object *t;
1253 if (n < 0)
1254 return NULL;
1255 t = newtupleobject(n);
1256 if (t == NULL)
1257 return NULL;
1258 for (i = 0; i < n; i++) {
1259 object *item = (*sqf->sq_item)(v, i);
1260 if (item == NULL) {
1261 DECREF(t);
1262 t = NULL;
1263 break;
1264 }
1265 settupleitem(t, i, item);
1266 }
1267 /* XXX Should support indefinite-length sequences */
1268 return t;
1269 }
1270 /* None of the above */
1271 err_setstr(TypeError, "tuple() argument must be a sequence");
1272 return NULL;
1273}
1274
1275static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001276builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001277 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001278 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001279{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001280 object *v;
1281
1282 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001283 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001284 v = (object *)v->ob_type;
1285 INCREF(v);
1286 return v;
1287}
1288
Guido van Rossum2d951851994-08-29 12:52:16 +00001289static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001291 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001292 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001293{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001294 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001295 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001296
1297 if (!newgetargs(args, "|O:vars", &v))
1298 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001299 if (v == NULL) {
1300 d = getlocals();
1301 INCREF(d);
1302 }
1303 else {
1304 d = getattr(v, "__dict__");
1305 if (d == NULL) {
1306 err_setstr(TypeError,
1307 "vars() argument must have __dict__ attribute");
1308 return NULL;
1309 }
1310 }
1311 return d;
1312}
1313
Guido van Rossum3f5da241990-12-20 15:06:42 +00001314static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001315 {"__import__", builtin___import__, 1},
1316 {"abs", builtin_abs, 1},
1317 {"apply", builtin_apply, 1},
1318 {"callable", builtin_callable, 1},
1319 {"chr", builtin_chr, 1},
1320 {"cmp", builtin_cmp, 1},
1321 {"coerce", builtin_coerce, 1},
1322 {"compile", builtin_compile, 1},
1323 {"delattr", builtin_delattr, 1},
1324 {"dir", builtin_dir, 1},
1325 {"divmod", builtin_divmod, 1},
1326 {"eval", builtin_eval, 1},
1327 {"execfile", builtin_execfile, 1},
1328 {"filter", builtin_filter, 1},
1329 {"float", builtin_float, 1},
1330 {"getattr", builtin_getattr, 1},
1331 {"hasattr", builtin_hasattr, 1},
1332 {"hash", builtin_hash, 1},
1333 {"hex", builtin_hex, 1},
1334 {"id", builtin_id, 1},
1335 {"input", builtin_input, 1},
1336 {"int", builtin_int, 1},
1337 {"len", builtin_len, 1},
1338 {"long", builtin_long, 1},
1339 {"map", builtin_map, 1},
1340 {"max", builtin_max, 1},
1341 {"min", builtin_min, 1},
1342 {"oct", builtin_oct, 1},
1343 {"open", builtin_open, 1},
1344 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001345 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001346 {"range", builtin_range, 1},
1347 {"raw_input", builtin_raw_input, 1},
1348 {"reduce", builtin_reduce, 1},
1349 {"reload", builtin_reload, 1},
1350 {"repr", builtin_repr, 1},
1351 {"round", builtin_round, 1},
1352 {"setattr", builtin_setattr, 1},
1353 {"str", builtin_str, 1},
1354 {"tuple", builtin_tuple, 1},
1355 {"type", builtin_type, 1},
1356 {"vars", builtin_vars, 1},
1357 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001358 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001359};
1360
Guido van Rossum0865dd91995-01-17 16:30:22 +00001361static object *builtin_mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001362static object *builtin_dict;
1363
1364object *
Guido van Rossum0865dd91995-01-17 16:30:22 +00001365getbuiltinmod()
1366{
1367 return builtin_mod;
1368}
1369
1370object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001371getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001372{
Guido van Rossum6135a871995-01-09 17:53:26 +00001373 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001374}
1375
1376/* Predefined exceptions */
1377
Guido van Rossum25831651993-05-19 14:50:45 +00001378object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001379object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001380object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001381object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001382object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001383object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001384object *IndexError;
1385object *KeyError;
1386object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001387object *MemoryError;
1388object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001389object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001390object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001391object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001392object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001393object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001394object *TypeError;
1395object *ValueError;
1396object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001397
Guido van Rossum3f5da241990-12-20 15:06:42 +00001398static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001399newstdexception(name)
1400 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001401{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001402 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001403 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1404 fatal("no mem for new standard exception");
1405 return v;
1406}
1407
1408static void
1409initerrors()
1410{
Guido van Rossum25831651993-05-19 14:50:45 +00001411 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001412 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001413 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001414 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001415 IOError = newstdexception("IOError");
1416 ImportError = newstdexception("ImportError");
1417 IndexError = newstdexception("IndexError");
1418 KeyError = newstdexception("KeyError");
1419 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001420 MemoryError = newstdexception("MemoryError");
1421 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001422 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001423 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001424 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001425 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001426 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001427 TypeError = newstdexception("TypeError");
1428 ValueError = newstdexception("ValueError");
1429 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001430}
1431
1432void
1433initbuiltin()
1434{
Guido van Rossum0865dd91995-01-17 16:30:22 +00001435 builtin_mod = initmodule("__builtin__", builtin_methods);
1436 builtin_dict = getmoduledict(builtin_mod);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001437 INCREF(builtin_dict);
1438 initerrors();
1439 (void) dictinsert(builtin_dict, "None", None);
1440}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001441
Guido van Rossum12d12c51993-10-26 17:58:25 +00001442
Guido van Rossume77a7571993-11-03 15:01:26 +00001443/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001444
1445static object *
1446filtertuple(func, tuple)
1447 object *func;
1448 object *tuple;
1449{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001450 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001451 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001452 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001453
Guido van Rossum2586bf01993-11-01 16:21:44 +00001454 if ((result = newtupleobject(len)) == NULL)
1455 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001456
Guido van Rossum12d12c51993-10-26 17:58:25 +00001457 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001458 object *item, *good;
1459 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001460
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001461 if ((item = gettupleitem(tuple, i)) == NULL)
1462 goto Fail_1;
1463 if (func == None) {
1464 INCREF(item);
1465 good = item;
1466 }
1467 else {
1468 object *arg = mkvalue("(O)", item);
1469 if (arg == NULL)
1470 goto Fail_1;
1471 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001472 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001473 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001474 goto Fail_1;
1475 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001476 ok = testbool(good);
1477 DECREF(good);
1478 if (ok) {
1479 INCREF(item);
1480 if (settupleitem(result, j++, item) < 0)
1481 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001482 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001483 }
1484
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001485 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001486 return NULL;
1487
Guido van Rossum12d12c51993-10-26 17:58:25 +00001488 return result;
1489
Guido van Rossum12d12c51993-10-26 17:58:25 +00001490Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001491 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001492 return NULL;
1493}
1494
1495
Guido van Rossume77a7571993-11-03 15:01:26 +00001496/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001497
1498static object *
1499filterstring(func, strobj)
1500 object *func;
1501 object *strobj;
1502{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001503 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001504 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001505 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001506
Guido van Rossum2586bf01993-11-01 16:21:44 +00001507 if (func == None) {
1508 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001509 INCREF(strobj);
1510 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001511 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001512 if ((result = newsizedstringobject(NULL, len)) == NULL)
1513 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001514
Guido van Rossum12d12c51993-10-26 17:58:25 +00001515 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001516 object *item, *arg, *good;
1517 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001518
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001519 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1520 if (item == NULL)
1521 goto Fail_1;
1522 arg = mkvalue("(O)", item);
1523 DECREF(item);
1524 if (arg == NULL)
1525 goto Fail_1;
1526 good = call_object(func, arg);
1527 DECREF(arg);
1528 if (good == NULL)
1529 goto Fail_1;
1530 ok = testbool(good);
1531 DECREF(good);
1532 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001533 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001534 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001535 }
1536
Guido van Rossum12d12c51993-10-26 17:58:25 +00001537 if (resizestring(&result, j) < 0)
1538 return NULL;
1539
Guido van Rossum12d12c51993-10-26 17:58:25 +00001540 return result;
1541
Guido van Rossum12d12c51993-10-26 17:58:25 +00001542Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001543 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001544 return NULL;
1545}