blob: 944525591ba9b4ec4bd6ba10c0ad8eef925f3f5c [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 Rossum681d79a1995-07-18 14:51:37 +000083 object *func, *alist, *kwdict = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000084
Guido van Rossum681d79a1995-07-18 14:51:37 +000085 if (!newgetargs(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000086 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +000087 if (alist != NULL && !is_tupleobject(alist)) {
Guido van Rossum2d951851994-08-29 12:52:16 +000088 err_setstr(TypeError, "apply() 2nd argument must be tuple");
89 return NULL;
90 }
Guido van Rossum681d79a1995-07-18 14:51:37 +000091 if (kwdict != NULL && !is_dictobject(kwdict)) {
92 err_setstr(TypeError,
93 "apply() 3rd argument must be dictionary");
94 return NULL;
95 }
96 return PyEval_CallObjectWithKeywords(func, alist, kwdict);
Guido van Rossumc02e15c1991-12-16 13:03:00 +000097}
98
Guido van Rossum2d951851994-08-29 12:52:16 +000099static object *
100builtin_callable(self, args)
101 object *self;
102 object *args;
103{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000104 object *v;
105
106 if (!newgetargs(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000107 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000108 return newintobject((long)callable(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000109}
110
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000111static object *
Guido van Rossume77a7571993-11-03 15:01:26 +0000112builtin_filter(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000113 object *self;
114 object *args;
115{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000116 object *func, *seq, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000117 sequence_methods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000118 int len;
119 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000120
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000121 if (!newgetargs(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000122 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000123
Guido van Rossum12d12c51993-10-26 17:58:25 +0000124 if (is_stringobject(seq)) {
125 object *r = filterstring(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 (is_tupleobject(seq)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000130 object *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000131 return r;
132 }
133
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000134 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000135 err_setstr(TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000136 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000137 goto Fail_2;
138 }
139
140 if ((len = (*sqf->sq_length)(seq)) < 0)
141 goto Fail_2;
142
143 if (is_listobject(seq) && seq->ob_refcnt == 1) {
144 INCREF(seq);
145 result = seq;
146 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000147 else {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000148 if ((result = newlistobject(len)) == NULL)
149 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000150 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000151
Guido van Rossum2d951851994-08-29 12:52:16 +0000152 for (i = j = 0; ; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000153 object *item, *good;
154 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000155
Guido van Rossum2d951851994-08-29 12:52:16 +0000156 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
157 if (i < len)
158 goto Fail_1;
159 if (err_occurred() == IndexError) {
160 err_clear();
161 break;
162 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000163 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000164 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000165
166 if (func == None) {
167 good = item;
Guido van Rossum58b68731995-01-10 17:40:55 +0000168 INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000169 }
170 else {
171 object *arg = mkvalue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000172 if (arg == NULL)
173 goto Fail_1;
174 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000175 DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000176 if (good == NULL) {
177 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000178 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000179 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000180 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000181 ok = testbool(good);
182 DECREF(good);
183 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000184 if (j < len) {
185 if (setlistitem(result, j++, item) < 0)
186 goto Fail_1;
187 }
188 else {
189 j++;
190 if (addlistitem(result, item) < 0)
191 goto Fail_1;
192 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000193 } else {
194 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000195 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000196 }
197
Guido van Rossum12d12c51993-10-26 17:58:25 +0000198
Guido van Rossum2d951851994-08-29 12:52:16 +0000199 if (j < len && setlistslice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000200 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000201
Guido van Rossum12d12c51993-10-26 17:58:25 +0000202 return result;
203
Guido van Rossum12d12c51993-10-26 17:58:25 +0000204Fail_1:
205 DECREF(result);
206Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000207 return NULL;
208}
209
210static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000211builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000212 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000213 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000214{
215 long x;
216 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000217
218 if (!newgetargs(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000219 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000220 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000221 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000222 return NULL;
223 }
224 s[0] = x;
225 return newsizedstringobject(s, 1);
226}
227
228static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000229builtin_cmp(self, args)
230 object *self;
231 object *args;
232{
233 object *a, *b;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000234
235 if (!newgetargs(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000236 return NULL;
237 return newintobject((long)cmpobject(a, b));
238}
239
240static object *
Guido van Rossum5524a591995-01-10 15:26:20 +0000241builtin_coerce(self, args)
242 object *self;
243 object *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000244{
Guido van Rossum5524a591995-01-10 15:26:20 +0000245 object *v, *w;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000246 object *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000247
248 if (!newgetargs(args, "OO:coerce", &v, &w))
249 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000250 if (coerce(&v, &w) < 0)
251 return NULL;
252 res = mkvalue("(OO)", v, w);
253 DECREF(v);
254 DECREF(w);
255 return res;
256}
257
258static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000259builtin_compile(self, args)
260 object *self;
261 object *args;
262{
263 char *str;
264 char *filename;
265 char *startstr;
266 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000267
268 if (!newgetargs(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000269 return NULL;
270 if (strcmp(startstr, "exec") == 0)
271 start = file_input;
272 else if (strcmp(startstr, "eval") == 0)
273 start = eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000274 else if (strcmp(startstr, "single") == 0)
275 start = single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000276 else {
277 err_setstr(ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000278 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000279 return NULL;
280 }
281 return compile_string(str, filename, start);
282}
283
284static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000285builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000286 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000287 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000288{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000289 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000290 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000291
292 if (!newgetargs(args, "|O:dir", &v))
293 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000294 if (v == NULL) {
295 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000296 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000297 }
298 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000299 d = getattr(v, "__dict__");
300 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000301 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000302 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000303 return NULL;
304 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000305 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000306 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000307 v = getdictkeys(d);
308 if (sortlist(v) != 0) {
309 DECREF(v);
310 v = NULL;
311 }
312 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000313 else {
314 v = newlistobject(0);
315 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000316 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000317 return v;
318}
319
320static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000321do_divmod(v, w)
322 object *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000323{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000324 object *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000325
Guido van Rossum180d7b41994-09-29 09:45:57 +0000326 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000327 return instancebinop(v, w, "__divmod__", "__rdivmod__",
328 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000329 if (v->ob_type->tp_as_number == NULL ||
330 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000331 err_setstr(TypeError,
332 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000333 return NULL;
334 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000335 if (coerce(&v, &w) != 0)
336 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000337 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000338 DECREF(v);
339 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000340 return res;
341}
342
343static object *
344builtin_divmod(self, args)
345 object *self;
346 object *args;
347{
348 object *v, *w;
349
350 if (!newgetargs(args, "OO:divmod", &v, &w))
351 return NULL;
352 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000353}
354
355static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000356builtin_eval(self, args)
357 object *self;
358 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000359{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000360 object *cmd;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000361 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000362 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000363
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000364 if (!newgetargs(args, "O|O!O!:eval",
365 &cmd,
366 &Mappingtype, &globals,
367 &Mappingtype, &locals))
368 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000369 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000370 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000371 if (locals == None)
372 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000373 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000374 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000375 locals = globals;
376 if (dictlookup(globals, "__builtins__") == NULL) {
377 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
378 return NULL;
379 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000380 if (is_codeobject(cmd))
Guido van Rossum681d79a1995-07-18 14:51:37 +0000381 return eval_code((codeobject *) cmd, globals, locals);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000382 if (!is_stringobject(cmd)) {
383 err_setstr(TypeError,
384 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000385 return NULL;
386 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000387 str = getstringvalue(cmd);
388 if (strlen(str) != getstringsize(cmd)) {
389 err_setstr(ValueError,
390 "embedded '\\0' in string arg");
391 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000392 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000393 while (*str == ' ' || *str == '\t')
394 str++;
395 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000396}
397
398static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000399builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000400 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000401 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000402{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000403 char *filename;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000404 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000405 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000406 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000407
408 if (!newgetargs(args, "s|O!O!:execfile",
409 &filename,
410 &Mappingtype, &globals,
411 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000412 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000413 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000414 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000415 if (locals == None)
416 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000417 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000418 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000419 locals = globals;
420 if (dictlookup(globals, "__builtins__") == NULL) {
421 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
422 return NULL;
423 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000424 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000426 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000427 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000428 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000429 return NULL;
430 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000431 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000432 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000433 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000434 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000436}
437
438static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000439builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000440 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000441 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000442{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000443 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000444 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000445
446 if (!newgetargs(args, "O:float", &v))
447 return NULL;
448 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000449 nb->nb_float == NULL) {
450 err_setstr(TypeError,
451 "float() argument can't be converted to float");
452 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000453 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000454 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000455}
456
457static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000458builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000459 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000460 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000461{
Guido van Rossum94390a41992-08-14 15:14:30 +0000462 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000463 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000464
465 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000466 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000467 return getattro(v, name);
468}
469
470static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000471builtin_globals(self, args)
472 object *self;
473 object *args;
474{
475 object *d;
476
477 if (!newgetargs(args, ""))
478 return NULL;
479 d = getglobals();
480 INCREF(d);
481 return d;
482}
483
484static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000485builtin_hasattr(self, args)
486 object *self;
487 object *args;
488{
489 object *v;
490 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000491
492 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000493 return NULL;
494 v = getattro(v, name);
495 if (v == NULL) {
496 err_clear();
497 return newintobject(0L);
498 }
499 DECREF(v);
500 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000501}
502
503static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000504builtin_id(self, args)
505 object *self;
506 object *args;
507{
508 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000509
510 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000511 return NULL;
512 return newintobject((long)v);
513}
514
515static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000516builtin_map(self, args)
517 object *self;
518 object *args;
519{
520 typedef struct {
521 object *seq;
522 sequence_methods *sqf;
523 int len;
524 } sequence;
525
526 object *func, *result;
527 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000528 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000529 register int i, j;
530
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000531 n = gettuplesize(args);
532 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000533 err_setstr(TypeError, "map() requires at least two args");
534 return NULL;
535 }
536
537 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000538 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000539
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000540 if ((seqs = NEW(sequence, n)) == NULL) {
541 err_nomem();
542 goto Fail_2;
543 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000544
Guido van Rossum2d951851994-08-29 12:52:16 +0000545 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000546 int curlen;
547
548 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
549 goto Fail_2;
550
551 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
552 static char errmsg[] =
553 "argument %d to map() must be a sequence object";
554 char errbuf[sizeof(errmsg) + 3];
555
556 sprintf(errbuf, errmsg, i+2);
557 err_setstr(TypeError, errbuf);
558 goto Fail_2;
559 }
560
561 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
562 goto Fail_2;
563
564 if (curlen > len)
565 len = curlen;
566 }
567
568 if ((result = (object *) newlistobject(len)) == NULL)
569 goto Fail_2;
570
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000571 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000572 for (i = 0; ; ++i) {
Guido van Rossum32120311995-07-10 13:52:21 +0000573 object *alist, *item, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000574 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000575
Guido van Rossum2d951851994-08-29 12:52:16 +0000576 if (func == None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000577 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000578 else {
Guido van Rossum32120311995-07-10 13:52:21 +0000579 if ((alist = newtupleobject(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000580 goto Fail_1;
581 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000582
583 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000584 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000585 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000586 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000587 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000588 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000589 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000590 if (item == NULL) {
591 if (i < sqp->len)
592 goto Fail_0;
593 if (err_occurred() == IndexError) {
594 err_clear();
595 INCREF(None);
596 item = None;
597 sqp->len = -1;
598 }
599 else {
600 goto Fail_0;
601 }
602 }
603 else
604 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000605
Guido van Rossum12d12c51993-10-26 17:58:25 +0000606 }
Guido van Rossum32120311995-07-10 13:52:21 +0000607 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +0000608 break;
Guido van Rossum32120311995-07-10 13:52:21 +0000609 if (settupleitem(alist, j, item) < 0) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000610 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000611 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000612 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000613 continue;
614
615 Fail_0:
Guido van Rossum32120311995-07-10 13:52:21 +0000616 XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000617 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000618 }
619
Guido van Rossum32120311995-07-10 13:52:21 +0000620 if (!alist)
621 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000622
623 if (!any) {
Guido van Rossum32120311995-07-10 13:52:21 +0000624 DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000625 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000626 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000627
628 if (func == None)
Guido van Rossum32120311995-07-10 13:52:21 +0000629 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000630 else {
Guido van Rossum32120311995-07-10 13:52:21 +0000631 value = call_object(func, alist);
632 DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000633 if (value == NULL)
634 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000635 }
636 if (i >= len) {
637 if (addlistitem(result, value) < 0)
638 goto Fail_1;
639 }
640 else {
641 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000642 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000643 }
644 }
645
Guido van Rossum2d951851994-08-29 12:52:16 +0000646 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000647 return result;
648
Guido van Rossum12d12c51993-10-26 17:58:25 +0000649Fail_1:
650 DECREF(result);
651Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000652 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000653 return NULL;
654}
655
656static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000657builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000658 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000659 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000660{
Guido van Rossum94390a41992-08-14 15:14:30 +0000661 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000662 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000663 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000664
665 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000666 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000667 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000668 return NULL;
669 INCREF(None);
670 return None;
671}
672
673static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000674builtin_delattr(self, args)
675 object *self;
676 object *args;
677{
678 object *v;
679 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680
681 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000682 return NULL;
683 if (setattro(v, name, (object *)NULL) != 0)
684 return NULL;
685 INCREF(None);
686 return None;
687}
688
689static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000690builtin_hash(self, args)
691 object *self;
692 object *args;
693{
694 object *v;
695 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000696
697 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000698 return NULL;
699 x = hashobject(v);
700 if (x == -1)
701 return NULL;
702 return newintobject(x);
703}
704
705static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000706builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000707 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000708 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000709{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000710 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000711 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000712
713 if (!newgetargs(args, "O:hex", &v))
714 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000715
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000716 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000717 nb->nb_hex == NULL) {
718 err_setstr(TypeError,
719 "hex() argument can't be converted to hex");
720 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000721 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000722 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000723}
724
Guido van Rossum3165fe61992-09-25 21:59:05 +0000725static object *builtin_raw_input PROTO((object *, object *));
726
Guido van Rossum006bcd41991-10-24 14:54:44 +0000727static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000728builtin_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000729 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000730 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000731{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000732 object *line;
733 char *str;
734 object *res;
Guido van Rossum6135a871995-01-09 17:53:26 +0000735 object *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000736
737 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000738 if (line == NULL)
739 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000740 if (!getargs(line, "s;embedded '\\0' in input line", &str))
741 return NULL;
742 while (*str == ' ' || *str == '\t')
743 str++;
Guido van Rossum6135a871995-01-09 17:53:26 +0000744 globals = getglobals();
745 locals = getlocals();
746 if (dictlookup(globals, "__builtins__") == NULL) {
747 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
748 return NULL;
749 }
750 res = run_string(str, eval_input, globals, locals);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000751 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000752 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000753}
754
755static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000756builtin_int(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000757 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000758 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000759{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000760 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000761 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000762
763 if (!newgetargs(args, "O:int", &v))
764 return NULL;
765 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000766 nb->nb_int == NULL) {
767 err_setstr(TypeError,
768 "int() argument can't be converted to int");
769 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000770 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000771 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000772}
773
774static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000775builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000776 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000777 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000778{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000779 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000780 long len;
781 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000782
783 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000784 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000785 tp = v->ob_type;
786 if (tp->tp_as_sequence != NULL) {
787 len = (*tp->tp_as_sequence->sq_length)(v);
788 }
789 else if (tp->tp_as_mapping != NULL) {
790 len = (*tp->tp_as_mapping->mp_length)(v);
791 }
792 else {
793 err_setstr(TypeError, "len() of unsized object");
794 return NULL;
795 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000796 if (len < 0)
797 return NULL;
798 else
799 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000800}
801
802static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000803builtin_locals(self, args)
804 object *self;
805 object *args;
806{
807 object *d;
808
809 if (!newgetargs(args, ""))
810 return NULL;
811 d = getlocals();
812 INCREF(d);
813 return d;
814}
815
816static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000817builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000818 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000819 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000820{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000821 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000822 number_methods *nb;
823
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000824 if (!newgetargs(args, "O:long", &v))
825 return NULL;
826 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000827 nb->nb_long == NULL) {
828 err_setstr(TypeError,
829 "long() argument can't be converted to long");
830 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000831 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000832 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000833}
834
835static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000836min_max(args, sign)
837 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000838 int sign;
839{
Guido van Rossum2d951851994-08-29 12:52:16 +0000840 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000841 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000842 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000843
844 if (gettuplesize(args) > 1)
845 v = args;
846 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000847 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000848 sq = v->ob_type->tp_as_sequence;
849 if (sq == NULL) {
850 err_setstr(TypeError, "min() or max() of non-sequence");
851 return NULL;
852 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000853 w = NULL;
854 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000855 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000856 if (x == NULL) {
857 if (err_occurred() == IndexError) {
858 err_clear();
859 break;
860 }
861 XDECREF(w);
862 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000863 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000864 if (w == NULL)
865 w = x;
866 else {
867 if (cmpobject(x, w) * sign > 0) {
868 DECREF(w);
869 w = x;
870 }
871 else
872 DECREF(x);
873 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000874 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000875 if (w == NULL)
876 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000877 return w;
878}
879
880static object *
881builtin_min(self, v)
882 object *self;
883 object *v;
884{
885 return min_max(v, -1);
886}
887
888static object *
889builtin_max(self, v)
890 object *self;
891 object *v;
892{
893 return min_max(v, 1);
894}
895
896static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000897builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000898 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000899 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000900{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000901 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000902 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000903
904 if (!newgetargs(args, "O:oct", &v))
905 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000906 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
907 nb->nb_oct == NULL) {
908 err_setstr(TypeError,
909 "oct() argument can't be converted to oct");
910 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000911 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000912 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000913}
914
915static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000916builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000917 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000918 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000919{
Guido van Rossum2d951851994-08-29 12:52:16 +0000920 char *name;
921 char *mode = "r";
922 int bufsize = -1;
923 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000924
925 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000926 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000927 f = newfileobject(name, mode);
928 if (f != NULL)
929 setfilebufsize(f, bufsize);
930 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000931}
932
933static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000934builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000935 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000936 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000937{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000938 char c;
939
940 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000941 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000942 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000943}
944
945static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000946do_pow(v, w)
947 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +0000948{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000949 object *res;
950 if (is_instanceobject(v) || is_instanceobject(w))
951 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000952 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000953 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000954 err_setstr(TypeError, "pow() requires numeric arguments");
955 return NULL;
956 }
Guido van Rossum8a1e8eb1995-02-18 14:51:32 +0000957 if (is_floatobject(w) && getfloatvalue(v) < 0.0) {
958 if (!err_occurred())
959 err_setstr(ValueError, "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +0000960 return NULL;
961 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000962 if (coerce(&v, &w) != 0)
963 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000964 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000965 DECREF(v);
966 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000967 return res;
968}
969
970static object *
971builtin_pow(self, args)
972 object *self;
973 object *args;
974{
975 object *v, *w, *z = None, *res;
976 object *v1, *z1, *w2, *z2;
977
978 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
979 return NULL;
980 if (z == None)
981 return do_pow(v, w);
982 /* XXX The ternary version doesn't do class instance coercions */
983 if (is_instanceobject(v))
984 return v->ob_type->tp_as_number->nb_power(v, w, z);
985 if (v->ob_type->tp_as_number == NULL ||
986 z->ob_type->tp_as_number == NULL ||
987 w->ob_type->tp_as_number == NULL) {
988 err_setstr(TypeError, "pow() requires numeric arguments");
989 return NULL;
990 }
991 if (coerce(&v, &w) != 0)
992 return NULL;
993 res = NULL;
994 v1 = v;
995 z1 = z;
996 if (coerce(&v1, &z1) != 0)
997 goto error2;
998 w2 = w;
999 z2 = z1;
1000 if (coerce(&w2, &z2) != 0)
1001 goto error1;
1002 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
1003 DECREF(w2);
1004 DECREF(z2);
1005 error1:
1006 DECREF(v1);
1007 DECREF(z1);
1008 error2:
1009 DECREF(v);
1010 DECREF(w);
1011 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001012}
1013
1014static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001015builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001016 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001017 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001018{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001019 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001020 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001021 object *v;
1022
1023 if (gettuplesize(args) <= 1) {
1024 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001025 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001026 &ihigh))
1027 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001028 }
1029 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001030 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001031 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001032 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001033 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001034 }
1035 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001036 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001037 return NULL;
1038 }
1039 /* XXX ought to check overflow of subtraction */
1040 if (istep > 0)
1041 n = (ihigh - ilow + istep - 1) / istep;
1042 else
1043 n = (ihigh - ilow + istep + 1) / istep;
1044 if (n < 0)
1045 n = 0;
1046 v = newlistobject(n);
1047 if (v == NULL)
1048 return NULL;
1049 for (i = 0; i < n; i++) {
1050 object *w = newintobject(ilow);
1051 if (w == NULL) {
1052 DECREF(v);
1053 return NULL;
1054 }
1055 setlistitem(v, i, w);
1056 ilow += istep;
1057 }
1058 return v;
1059}
1060
1061static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001062builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001063 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001064 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001065{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001066 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001067 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001068
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001069 if (gettuplesize(args) <= 1) {
1070 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001071 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001072 &ihigh))
1073 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001074 }
1075 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001076 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001077 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001078 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001079 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001080 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001081 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001082 err_setstr(ValueError, "zero step for xrange()");
1083 return NULL;
1084 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001085 /* XXX ought to check overflow of subtraction */
1086 if (istep > 0)
1087 n = (ihigh - ilow + istep - 1) / istep;
1088 else
1089 n = (ihigh - ilow + istep + 1) / istep;
1090 if (n < 0)
1091 n = 0;
1092 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001093}
1094
Guido van Rossum872537c1995-07-07 22:43:42 +00001095extern char *my_readline PROTO((char *));
1096
Guido van Rossum12d12c51993-10-26 17:58:25 +00001097static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001098builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001099 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001100 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001101{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001102 object *v = NULL;
1103 object *f;
1104
1105 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001106 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001107 if (getfilefile(sysget("stdin")) == stdin &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001108 getfilefile(sysget("stdout")) == stdout &&
1109 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum872537c1995-07-07 22:43:42 +00001110 object *po;
1111 char *prompt;
1112 char *s;
1113 object *result;
1114 if (v != NULL) {
1115 po = strobject(v);
1116 if (po == NULL)
1117 return NULL;
1118 prompt = getstringvalue(po);
1119 }
1120 else {
1121 po = NULL;
1122 prompt = "";
1123 }
1124 s = my_readline(prompt);
1125 XDECREF(po);
1126 if (s == NULL) {
1127 err_set(KeyboardInterrupt);
1128 return NULL;
1129 }
1130 if (*s == '\0') {
1131 err_set(EOFError);
1132 result = NULL;
1133 }
1134 else { /* strip trailing '\n' */
1135 result = newsizedstringobject(s, strlen(s)-1);
1136 }
1137 free(s);
1138 return result;
1139 }
Guido van Rossum90933611991-06-07 16:10:43 +00001140 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001141 f = sysget("stdout");
1142 if (f == NULL) {
1143 err_setstr(RuntimeError, "lost sys.stdout");
1144 return NULL;
1145 }
1146 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001147 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001148 return NULL;
1149 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001150 f = sysget("stdin");
1151 if (f == NULL) {
1152 err_setstr(RuntimeError, "lost sys.stdin");
1153 return NULL;
1154 }
1155 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001156}
1157
1158static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001159builtin_reduce(self, args)
1160 object *self;
1161 object *args;
1162{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001163 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001164 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001165 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001166
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001167 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1168 return NULL;
1169 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001170 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001171
1172 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1173 err_setstr(TypeError,
1174 "2nd argument to reduce() must be a sequence object");
1175 return NULL;
1176 }
1177
Guido van Rossum12d12c51993-10-26 17:58:25 +00001178 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001179 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001180
Guido van Rossum2d951851994-08-29 12:52:16 +00001181 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001182 object *op2;
1183
1184 if (args->ob_refcnt > 1) {
1185 DECREF(args);
1186 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001187 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001188 }
1189
Guido van Rossum2d951851994-08-29 12:52:16 +00001190 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1191 if (err_occurred() == IndexError) {
1192 err_clear();
1193 break;
1194 }
1195 goto Fail;
1196 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001197
Guido van Rossum2d951851994-08-29 12:52:16 +00001198 if (result == NULL)
1199 result = op2;
1200 else {
1201 settupleitem(args, 0, result);
1202 settupleitem(args, 1, op2);
1203 if ((result = call_object(func, args)) == NULL)
1204 goto Fail;
1205 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001206 }
1207
1208 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001209
Guido van Rossum2d951851994-08-29 12:52:16 +00001210 if (result == NULL)
1211 err_setstr(TypeError,
1212 "reduce of empty sequence with no initial value");
1213
Guido van Rossum12d12c51993-10-26 17:58:25 +00001214 return result;
1215
Guido van Rossum2d951851994-08-29 12:52:16 +00001216Fail:
1217 XDECREF(args);
1218 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001219 return NULL;
1220}
1221
1222static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001223builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001224 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001225 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001226{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001227 object *v;
1228
1229 if (!newgetargs(args, "O:reload", &v))
1230 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001231 return reload_module(v);
1232}
1233
1234static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001235builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001236 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001237 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001238{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001239 object *v;
1240
1241 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001242 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001243 return reprobject(v);
1244}
1245
1246static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001247builtin_round(self, args)
1248 object *self;
1249 object *args;
1250{
1251 extern double floor PROTO((double));
1252 extern double ceil PROTO((double));
1253 double x;
1254 double f;
1255 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001256 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001257
1258 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001259 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001260 f = 1.0;
1261 for (i = ndigits; --i >= 0; )
1262 f = f*10.0;
1263 for (i = ndigits; ++i <= 0; )
1264 f = f*0.1;
1265 if (x >= 0.0)
1266 return newfloatobject(floor(x*f + 0.5) / f);
1267 else
1268 return newfloatobject(ceil(x*f - 0.5) / f);
1269}
1270
1271static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001272builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001273 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001274 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001275{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001276 object *v;
1277
1278 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001279 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001280 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001281}
1282
1283static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001284builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001285 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001286 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001287{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001288 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001289 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290
1291 if (!newgetargs(args, "O:tuple", &v))
1292 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001293 if (is_tupleobject(v)) {
1294 INCREF(v);
1295 return v;
1296 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001297 if (is_listobject(v))
1298 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001299 if (is_stringobject(v)) {
1300 int n = getstringsize(v);
1301 object *t = newtupleobject(n);
1302 if (t != NULL) {
1303 int i;
1304 char *p = getstringvalue(v);
1305 for (i = 0; i < n; i++) {
1306 object *item = newsizedstringobject(p+i, 1);
1307 if (item == NULL) {
1308 DECREF(t);
1309 t = NULL;
1310 break;
1311 }
1312 settupleitem(t, i, item);
1313 }
1314 }
1315 return t;
1316 }
1317 /* Generic sequence object */
1318 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1319 int n = (*sqf->sq_length)(v);
1320 int i;
1321 object *t;
1322 if (n < 0)
1323 return NULL;
1324 t = newtupleobject(n);
1325 if (t == NULL)
1326 return NULL;
1327 for (i = 0; i < n; i++) {
1328 object *item = (*sqf->sq_item)(v, i);
1329 if (item == NULL) {
1330 DECREF(t);
1331 t = NULL;
1332 break;
1333 }
1334 settupleitem(t, i, item);
1335 }
1336 /* XXX Should support indefinite-length sequences */
1337 return t;
1338 }
1339 /* None of the above */
1340 err_setstr(TypeError, "tuple() argument must be a sequence");
1341 return NULL;
1342}
1343
1344static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001345builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001346 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001347 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001348{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001349 object *v;
1350
1351 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001352 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001353 v = (object *)v->ob_type;
1354 INCREF(v);
1355 return v;
1356}
1357
Guido van Rossum2d951851994-08-29 12:52:16 +00001358static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001359builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001360 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001361 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001362{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001363 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001364 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001365
1366 if (!newgetargs(args, "|O:vars", &v))
1367 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001368 if (v == NULL) {
1369 d = getlocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001370 if (d == NULL) {
1371 if (!err_occurred())
1372 err_setstr(SystemError, "no locals!?");
1373 }
1374 else
1375 INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001376 }
1377 else {
1378 d = getattr(v, "__dict__");
1379 if (d == NULL) {
1380 err_setstr(TypeError,
1381 "vars() argument must have __dict__ attribute");
1382 return NULL;
1383 }
1384 }
1385 return d;
1386}
1387
Guido van Rossum3f5da241990-12-20 15:06:42 +00001388static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001389 {"__import__", builtin___import__, 1},
1390 {"abs", builtin_abs, 1},
1391 {"apply", builtin_apply, 1},
1392 {"callable", builtin_callable, 1},
1393 {"chr", builtin_chr, 1},
1394 {"cmp", builtin_cmp, 1},
1395 {"coerce", builtin_coerce, 1},
1396 {"compile", builtin_compile, 1},
1397 {"delattr", builtin_delattr, 1},
1398 {"dir", builtin_dir, 1},
1399 {"divmod", builtin_divmod, 1},
1400 {"eval", builtin_eval, 1},
1401 {"execfile", builtin_execfile, 1},
1402 {"filter", builtin_filter, 1},
1403 {"float", builtin_float, 1},
1404 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001405 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001406 {"hasattr", builtin_hasattr, 1},
1407 {"hash", builtin_hash, 1},
1408 {"hex", builtin_hex, 1},
1409 {"id", builtin_id, 1},
1410 {"input", builtin_input, 1},
1411 {"int", builtin_int, 1},
1412 {"len", builtin_len, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001413 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001414 {"long", builtin_long, 1},
1415 {"map", builtin_map, 1},
1416 {"max", builtin_max, 1},
1417 {"min", builtin_min, 1},
1418 {"oct", builtin_oct, 1},
1419 {"open", builtin_open, 1},
1420 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001421 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001422 {"range", builtin_range, 1},
1423 {"raw_input", builtin_raw_input, 1},
1424 {"reduce", builtin_reduce, 1},
1425 {"reload", builtin_reload, 1},
1426 {"repr", builtin_repr, 1},
1427 {"round", builtin_round, 1},
1428 {"setattr", builtin_setattr, 1},
1429 {"str", builtin_str, 1},
1430 {"tuple", builtin_tuple, 1},
1431 {"type", builtin_type, 1},
1432 {"vars", builtin_vars, 1},
1433 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001434 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001435};
1436
Guido van Rossum0865dd91995-01-17 16:30:22 +00001437static object *builtin_mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001438static object *builtin_dict;
1439
1440object *
Guido van Rossum0865dd91995-01-17 16:30:22 +00001441getbuiltinmod()
1442{
1443 return builtin_mod;
1444}
1445
1446object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001447getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001448{
Guido van Rossum6135a871995-01-09 17:53:26 +00001449 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001450}
1451
1452/* Predefined exceptions */
1453
Guido van Rossum25831651993-05-19 14:50:45 +00001454object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001455object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001456object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001457object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001458object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001459object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001460object *IndexError;
1461object *KeyError;
1462object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001463object *MemoryError;
1464object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001465object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001466object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001467object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001468object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001469object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001470object *TypeError;
1471object *ValueError;
1472object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001473
Guido van Rossum3f5da241990-12-20 15:06:42 +00001474static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001475newstdexception(name)
1476 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001477{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001478 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001479 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1480 fatal("no mem for new standard exception");
1481 return v;
1482}
1483
1484static void
1485initerrors()
1486{
Guido van Rossum25831651993-05-19 14:50:45 +00001487 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001488 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001489 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001490 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001491 IOError = newstdexception("IOError");
1492 ImportError = newstdexception("ImportError");
1493 IndexError = newstdexception("IndexError");
1494 KeyError = newstdexception("KeyError");
1495 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001496 MemoryError = newstdexception("MemoryError");
1497 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001498 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001499 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001500 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001501 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001502 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001503 TypeError = newstdexception("TypeError");
1504 ValueError = newstdexception("ValueError");
1505 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001506}
1507
1508void
1509initbuiltin()
1510{
Guido van Rossum0865dd91995-01-17 16:30:22 +00001511 builtin_mod = initmodule("__builtin__", builtin_methods);
1512 builtin_dict = getmoduledict(builtin_mod);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001513 INCREF(builtin_dict);
1514 initerrors();
1515 (void) dictinsert(builtin_dict, "None", None);
1516}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001517
Guido van Rossum12d12c51993-10-26 17:58:25 +00001518
Guido van Rossume77a7571993-11-03 15:01:26 +00001519/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001520
1521static object *
1522filtertuple(func, tuple)
1523 object *func;
1524 object *tuple;
1525{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001526 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001527 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001528 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001529
Guido van Rossumb7b45621995-08-04 04:07:45 +00001530 if (len == 0) {
1531 INCREF(tuple);
1532 return tuple;
1533 }
1534
Guido van Rossum2586bf01993-11-01 16:21:44 +00001535 if ((result = newtupleobject(len)) == NULL)
1536 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001537
Guido van Rossum12d12c51993-10-26 17:58:25 +00001538 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001539 object *item, *good;
1540 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001541
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001542 if ((item = gettupleitem(tuple, i)) == NULL)
1543 goto Fail_1;
1544 if (func == None) {
1545 INCREF(item);
1546 good = item;
1547 }
1548 else {
1549 object *arg = mkvalue("(O)", item);
1550 if (arg == NULL)
1551 goto Fail_1;
1552 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001553 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001554 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001555 goto Fail_1;
1556 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001557 ok = testbool(good);
1558 DECREF(good);
1559 if (ok) {
1560 INCREF(item);
1561 if (settupleitem(result, j++, item) < 0)
1562 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001563 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001564 }
1565
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001566 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001567 return NULL;
1568
Guido van Rossum12d12c51993-10-26 17:58:25 +00001569 return result;
1570
Guido van Rossum12d12c51993-10-26 17:58:25 +00001571Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001572 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001573 return NULL;
1574}
1575
1576
Guido van Rossume77a7571993-11-03 15:01:26 +00001577/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001578
1579static object *
1580filterstring(func, strobj)
1581 object *func;
1582 object *strobj;
1583{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001584 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001585 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001586 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001587
Guido van Rossum2586bf01993-11-01 16:21:44 +00001588 if (func == None) {
1589 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001590 INCREF(strobj);
1591 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001592 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001593 if ((result = newsizedstringobject(NULL, len)) == NULL)
1594 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001595
Guido van Rossum12d12c51993-10-26 17:58:25 +00001596 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001597 object *item, *arg, *good;
1598 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001599
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001600 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1601 if (item == NULL)
1602 goto Fail_1;
1603 arg = mkvalue("(O)", item);
1604 DECREF(item);
1605 if (arg == NULL)
1606 goto Fail_1;
1607 good = call_object(func, arg);
1608 DECREF(arg);
1609 if (good == NULL)
1610 goto Fail_1;
1611 ok = testbool(good);
1612 DECREF(good);
1613 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001614 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001615 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001616 }
1617
Guido van Rossum12d12c51993-10-26 17:58:25 +00001618 if (resizestring(&result, j) < 0)
1619 return NULL;
1620
Guido van Rossum12d12c51993-10-26 17:58:25 +00001621 return result;
1622
Guido van Rossum12d12c51993-10-26 17:58:25 +00001623Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001624 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001625 return NULL;
1626}