blob: 7a55b51ddda2502d3e800f73823ce192df0e5413 [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;
Guido van Rossum872537c1995-07-07 22:43:42 +0000269 else if (strcmp(startstr, "single") == 0)
270 start = single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000271 else {
272 err_setstr(ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000273 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000274 return NULL;
275 }
276 return compile_string(str, filename, start);
277}
278
279static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000280builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000281 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000282 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000283{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000284 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000285 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000286
287 if (!newgetargs(args, "|O:dir", &v))
288 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000289 if (v == NULL) {
290 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000291 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000292 }
293 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000294 d = getattr(v, "__dict__");
295 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000296 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000297 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000298 return NULL;
299 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000300 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000301 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000302 v = getdictkeys(d);
303 if (sortlist(v) != 0) {
304 DECREF(v);
305 v = NULL;
306 }
307 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000308 else {
309 v = newlistobject(0);
310 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000311 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000312 return v;
313}
314
315static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000316do_divmod(v, w)
317 object *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000318{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000319 object *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000320
Guido van Rossum180d7b41994-09-29 09:45:57 +0000321 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000322 return instancebinop(v, w, "__divmod__", "__rdivmod__",
323 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000324 if (v->ob_type->tp_as_number == NULL ||
325 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000326 err_setstr(TypeError,
327 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000328 return NULL;
329 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000330 if (coerce(&v, &w) != 0)
331 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000332 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000333 DECREF(v);
334 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000335 return res;
336}
337
338static object *
339builtin_divmod(self, args)
340 object *self;
341 object *args;
342{
343 object *v, *w;
344
345 if (!newgetargs(args, "OO:divmod", &v, &w))
346 return NULL;
347 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000348}
349
350static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000351builtin_eval(self, args)
352 object *self;
353 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000354{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000355 object *cmd;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000356 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000357 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000358
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000359 if (!newgetargs(args, "O|O!O!:eval",
360 &cmd,
361 &Mappingtype, &globals,
362 &Mappingtype, &locals))
363 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000364 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000365 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000366 if (locals == None)
367 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000368 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000369 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000370 locals = globals;
371 if (dictlookup(globals, "__builtins__") == NULL) {
372 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
373 return NULL;
374 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000375 if (is_codeobject(cmd))
376 return eval_code((codeobject *) cmd, globals, locals,
Guido van Rossum81daa321993-05-20 14:24:46 +0000377 (object *)NULL, (object *)NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000378 if (!is_stringobject(cmd)) {
379 err_setstr(TypeError,
380 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000381 return NULL;
382 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000383 str = getstringvalue(cmd);
384 if (strlen(str) != getstringsize(cmd)) {
385 err_setstr(ValueError,
386 "embedded '\\0' in string arg");
387 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000388 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000389 while (*str == ' ' || *str == '\t')
390 str++;
391 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000392}
393
394static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000395builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000396 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000397 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000398{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000399 char *filename;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000400 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000401 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000402 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000403
404 if (!newgetargs(args, "s|O!O!:execfile",
405 &filename,
406 &Mappingtype, &globals,
407 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000408 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000409 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000410 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000411 if (locals == None)
412 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000413 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000414 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000415 locals = globals;
416 if (dictlookup(globals, "__builtins__") == NULL) {
417 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
418 return NULL;
419 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000420 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000421 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000422 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000423 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000424 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000425 return NULL;
426 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000427 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000428 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000429 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000430 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000431 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000432}
433
434static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000436 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000437 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000438{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000439 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000440 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000441
442 if (!newgetargs(args, "O:float", &v))
443 return NULL;
444 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000445 nb->nb_float == NULL) {
446 err_setstr(TypeError,
447 "float() argument can't be converted to float");
448 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000449 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000450 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000451}
452
453static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000454builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000455 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000456 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000457{
Guido van Rossum94390a41992-08-14 15:14:30 +0000458 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000459 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000460
461 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000462 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000463 return getattro(v, name);
464}
465
466static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000467builtin_globals(self, args)
468 object *self;
469 object *args;
470{
471 object *d;
472
473 if (!newgetargs(args, ""))
474 return NULL;
475 d = getglobals();
476 INCREF(d);
477 return d;
478}
479
480static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000481builtin_hasattr(self, args)
482 object *self;
483 object *args;
484{
485 object *v;
486 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000487
488 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000489 return NULL;
490 v = getattro(v, name);
491 if (v == NULL) {
492 err_clear();
493 return newintobject(0L);
494 }
495 DECREF(v);
496 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000497}
498
499static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000500builtin_id(self, args)
501 object *self;
502 object *args;
503{
504 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000505
506 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000507 return NULL;
508 return newintobject((long)v);
509}
510
511static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000512builtin_map(self, args)
513 object *self;
514 object *args;
515{
516 typedef struct {
517 object *seq;
518 sequence_methods *sqf;
519 int len;
520 } sequence;
521
522 object *func, *result;
523 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000524 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000525 register int i, j;
526
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000527 n = gettuplesize(args);
528 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000529 err_setstr(TypeError, "map() requires at least two args");
530 return NULL;
531 }
532
533 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000534 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000535
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000536 if ((seqs = NEW(sequence, n)) == NULL) {
537 err_nomem();
538 goto Fail_2;
539 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000540
Guido van Rossum2d951851994-08-29 12:52:16 +0000541 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000542 int curlen;
543
544 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
545 goto Fail_2;
546
547 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
548 static char errmsg[] =
549 "argument %d to map() must be a sequence object";
550 char errbuf[sizeof(errmsg) + 3];
551
552 sprintf(errbuf, errmsg, i+2);
553 err_setstr(TypeError, errbuf);
554 goto Fail_2;
555 }
556
557 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
558 goto Fail_2;
559
560 if (curlen > len)
561 len = curlen;
562 }
563
564 if ((result = (object *) newlistobject(len)) == NULL)
565 goto Fail_2;
566
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000567 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000568 for (i = 0; ; ++i) {
569 object *arglist, *item, *value;
570 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000571
Guido van Rossum2d951851994-08-29 12:52:16 +0000572 if (func == None && n == 1)
573 arglist = NULL;
574 else {
575 if ((arglist = newtupleobject(n)) == NULL)
576 goto Fail_1;
577 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000578
579 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000580 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000581 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000582 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000583 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000584 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000585 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000586 if (item == NULL) {
587 if (i < sqp->len)
588 goto Fail_0;
589 if (err_occurred() == IndexError) {
590 err_clear();
591 INCREF(None);
592 item = None;
593 sqp->len = -1;
594 }
595 else {
596 goto Fail_0;
597 }
598 }
599 else
600 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000601
Guido van Rossum12d12c51993-10-26 17:58:25 +0000602 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000603 if (!arglist)
604 break;
605 if (settupleitem(arglist, j, item) < 0) {
606 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000607 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000608 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000609 continue;
610
611 Fail_0:
Guido van Rossum2d951851994-08-29 12:52:16 +0000612 XDECREF(arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000613 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000614 }
615
Guido van Rossum2d951851994-08-29 12:52:16 +0000616 if (!arglist)
617 arglist = item;
618
619 if (!any) {
620 DECREF(arglist);
621 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000622 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000623
624 if (func == None)
625 value = arglist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000626 else {
Guido van Rossum2d951851994-08-29 12:52:16 +0000627 value = call_object(func, arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000628 DECREF(arglist);
629 if (value == NULL)
630 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000631 }
632 if (i >= len) {
633 if (addlistitem(result, value) < 0)
634 goto Fail_1;
635 }
636 else {
637 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000638 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000639 }
640 }
641
Guido van Rossum2d951851994-08-29 12:52:16 +0000642 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000643 return result;
644
Guido van Rossum12d12c51993-10-26 17:58:25 +0000645Fail_1:
646 DECREF(result);
647Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000648 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000649 return NULL;
650}
651
652static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000653builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000654 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000655 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000656{
Guido van Rossum94390a41992-08-14 15:14:30 +0000657 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000658 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000659 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000660
661 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000662 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000663 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000664 return NULL;
665 INCREF(None);
666 return None;
667}
668
669static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000670builtin_delattr(self, args)
671 object *self;
672 object *args;
673{
674 object *v;
675 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000676
677 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000678 return NULL;
679 if (setattro(v, name, (object *)NULL) != 0)
680 return NULL;
681 INCREF(None);
682 return None;
683}
684
685static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000686builtin_hash(self, args)
687 object *self;
688 object *args;
689{
690 object *v;
691 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000692
693 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000694 return NULL;
695 x = hashobject(v);
696 if (x == -1)
697 return NULL;
698 return newintobject(x);
699}
700
701static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000702builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000703 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000704 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000705{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000706 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000707 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000708
709 if (!newgetargs(args, "O:hex", &v))
710 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000711
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000712 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000713 nb->nb_hex == NULL) {
714 err_setstr(TypeError,
715 "hex() argument can't be converted to hex");
716 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000717 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000718 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000719}
720
Guido van Rossum3165fe61992-09-25 21:59:05 +0000721static object *builtin_raw_input PROTO((object *, object *));
722
Guido van Rossum006bcd41991-10-24 14:54:44 +0000723static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000724builtin_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000725 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000726 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000727{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000728 object *line;
729 char *str;
730 object *res;
Guido van Rossum6135a871995-01-09 17:53:26 +0000731 object *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000732
733 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000734 if (line == NULL)
735 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000736 if (!getargs(line, "s;embedded '\\0' in input line", &str))
737 return NULL;
738 while (*str == ' ' || *str == '\t')
739 str++;
Guido van Rossum6135a871995-01-09 17:53:26 +0000740 globals = getglobals();
741 locals = getlocals();
742 if (dictlookup(globals, "__builtins__") == NULL) {
743 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
744 return NULL;
745 }
746 res = run_string(str, eval_input, globals, locals);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000747 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000748 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000749}
750
751static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000752builtin_int(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000753 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000754 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000755{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000756 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000757 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000758
759 if (!newgetargs(args, "O:int", &v))
760 return NULL;
761 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000762 nb->nb_int == NULL) {
763 err_setstr(TypeError,
764 "int() argument can't be converted to int");
765 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000766 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000767 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000768}
769
770static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000771builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000772 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000773 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000774{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000775 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000776 long len;
777 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000778
779 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000780 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000781 tp = v->ob_type;
782 if (tp->tp_as_sequence != NULL) {
783 len = (*tp->tp_as_sequence->sq_length)(v);
784 }
785 else if (tp->tp_as_mapping != NULL) {
786 len = (*tp->tp_as_mapping->mp_length)(v);
787 }
788 else {
789 err_setstr(TypeError, "len() of unsized object");
790 return NULL;
791 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000792 if (len < 0)
793 return NULL;
794 else
795 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000796}
797
798static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000799builtin_locals(self, args)
800 object *self;
801 object *args;
802{
803 object *d;
804
805 if (!newgetargs(args, ""))
806 return NULL;
807 d = getlocals();
808 INCREF(d);
809 return d;
810}
811
812static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000813builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000814 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000815 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000816{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000817 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000818 number_methods *nb;
819
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000820 if (!newgetargs(args, "O:long", &v))
821 return NULL;
822 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000823 nb->nb_long == NULL) {
824 err_setstr(TypeError,
825 "long() argument can't be converted to long");
826 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000827 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000828 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000829}
830
831static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000832min_max(args, sign)
833 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000834 int sign;
835{
Guido van Rossum2d951851994-08-29 12:52:16 +0000836 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000837 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000838 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000839
840 if (gettuplesize(args) > 1)
841 v = args;
842 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000843 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000844 sq = v->ob_type->tp_as_sequence;
845 if (sq == NULL) {
846 err_setstr(TypeError, "min() or max() of non-sequence");
847 return NULL;
848 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000849 w = NULL;
850 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000851 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000852 if (x == NULL) {
853 if (err_occurred() == IndexError) {
854 err_clear();
855 break;
856 }
857 XDECREF(w);
858 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000859 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000860 if (w == NULL)
861 w = x;
862 else {
863 if (cmpobject(x, w) * sign > 0) {
864 DECREF(w);
865 w = x;
866 }
867 else
868 DECREF(x);
869 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000870 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000871 if (w == NULL)
872 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000873 return w;
874}
875
876static object *
877builtin_min(self, v)
878 object *self;
879 object *v;
880{
881 return min_max(v, -1);
882}
883
884static object *
885builtin_max(self, v)
886 object *self;
887 object *v;
888{
889 return min_max(v, 1);
890}
891
892static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000893builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000894 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000895 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000896{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000897 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000898 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000899
900 if (!newgetargs(args, "O:oct", &v))
901 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000902 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
903 nb->nb_oct == NULL) {
904 err_setstr(TypeError,
905 "oct() argument can't be converted to oct");
906 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000907 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000908 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000909}
910
911static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000912builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000913 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000914 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000915{
Guido van Rossum2d951851994-08-29 12:52:16 +0000916 char *name;
917 char *mode = "r";
918 int bufsize = -1;
919 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000920
921 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000922 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000923 f = newfileobject(name, mode);
924 if (f != NULL)
925 setfilebufsize(f, bufsize);
926 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000927}
928
929static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000930builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000931 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000932 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000933{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000934 char c;
935
936 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000937 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000938 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000939}
940
941static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000942do_pow(v, w)
943 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +0000944{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000945 object *res;
946 if (is_instanceobject(v) || is_instanceobject(w))
947 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000948 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000949 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000950 err_setstr(TypeError, "pow() requires numeric arguments");
951 return NULL;
952 }
Guido van Rossum8a1e8eb1995-02-18 14:51:32 +0000953 if (is_floatobject(w) && getfloatvalue(v) < 0.0) {
954 if (!err_occurred())
955 err_setstr(ValueError, "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +0000956 return NULL;
957 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000958 if (coerce(&v, &w) != 0)
959 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000960 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000961 DECREF(v);
962 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000963 return res;
964}
965
966static object *
967builtin_pow(self, args)
968 object *self;
969 object *args;
970{
971 object *v, *w, *z = None, *res;
972 object *v1, *z1, *w2, *z2;
973
974 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
975 return NULL;
976 if (z == None)
977 return do_pow(v, w);
978 /* XXX The ternary version doesn't do class instance coercions */
979 if (is_instanceobject(v))
980 return v->ob_type->tp_as_number->nb_power(v, w, z);
981 if (v->ob_type->tp_as_number == NULL ||
982 z->ob_type->tp_as_number == NULL ||
983 w->ob_type->tp_as_number == NULL) {
984 err_setstr(TypeError, "pow() requires numeric arguments");
985 return NULL;
986 }
987 if (coerce(&v, &w) != 0)
988 return NULL;
989 res = NULL;
990 v1 = v;
991 z1 = z;
992 if (coerce(&v1, &z1) != 0)
993 goto error2;
994 w2 = w;
995 z2 = z1;
996 if (coerce(&w2, &z2) != 0)
997 goto error1;
998 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
999 DECREF(w2);
1000 DECREF(z2);
1001 error1:
1002 DECREF(v1);
1003 DECREF(z1);
1004 error2:
1005 DECREF(v);
1006 DECREF(w);
1007 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001008}
1009
1010static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001011builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001012 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001013 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001014{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001015 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001016 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001017 object *v;
1018
1019 if (gettuplesize(args) <= 1) {
1020 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001021 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001022 &ihigh))
1023 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001024 }
1025 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001026 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001027 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001028 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001029 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001030 }
1031 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001032 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001033 return NULL;
1034 }
1035 /* XXX ought to check overflow of subtraction */
1036 if (istep > 0)
1037 n = (ihigh - ilow + istep - 1) / istep;
1038 else
1039 n = (ihigh - ilow + istep + 1) / istep;
1040 if (n < 0)
1041 n = 0;
1042 v = newlistobject(n);
1043 if (v == NULL)
1044 return NULL;
1045 for (i = 0; i < n; i++) {
1046 object *w = newintobject(ilow);
1047 if (w == NULL) {
1048 DECREF(v);
1049 return NULL;
1050 }
1051 setlistitem(v, i, w);
1052 ilow += istep;
1053 }
1054 return v;
1055}
1056
1057static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001058builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001059 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001060 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001061{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001062 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001063 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001064
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001065 if (gettuplesize(args) <= 1) {
1066 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001067 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001068 &ihigh))
1069 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001070 }
1071 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001072 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001073 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001074 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001075 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001076 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001077 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001078 err_setstr(ValueError, "zero step for xrange()");
1079 return NULL;
1080 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001081 /* XXX ought to check overflow of subtraction */
1082 if (istep > 0)
1083 n = (ihigh - ilow + istep - 1) / istep;
1084 else
1085 n = (ihigh - ilow + istep + 1) / istep;
1086 if (n < 0)
1087 n = 0;
1088 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001089}
1090
Guido van Rossum872537c1995-07-07 22:43:42 +00001091extern char *my_readline PROTO((char *));
1092
Guido van Rossum12d12c51993-10-26 17:58:25 +00001093static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001094builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001095 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001096 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001097{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001098 object *v = NULL;
1099 object *f;
1100
1101 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001102 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001103 if (getfilefile(sysget("stdin")) == stdin &&
1104 getfilefile(sysget("stdout")) == stdout) {
1105 object *po;
1106 char *prompt;
1107 char *s;
1108 object *result;
1109 if (v != NULL) {
1110 po = strobject(v);
1111 if (po == NULL)
1112 return NULL;
1113 prompt = getstringvalue(po);
1114 }
1115 else {
1116 po = NULL;
1117 prompt = "";
1118 }
1119 s = my_readline(prompt);
1120 XDECREF(po);
1121 if (s == NULL) {
1122 err_set(KeyboardInterrupt);
1123 return NULL;
1124 }
1125 if (*s == '\0') {
1126 err_set(EOFError);
1127 result = NULL;
1128 }
1129 else { /* strip trailing '\n' */
1130 result = newsizedstringobject(s, strlen(s)-1);
1131 }
1132 free(s);
1133 return result;
1134 }
Guido van Rossum90933611991-06-07 16:10:43 +00001135 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001136 f = sysget("stdout");
1137 if (f == NULL) {
1138 err_setstr(RuntimeError, "lost sys.stdout");
1139 return NULL;
1140 }
1141 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001142 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001143 return NULL;
1144 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001145 f = sysget("stdin");
1146 if (f == NULL) {
1147 err_setstr(RuntimeError, "lost sys.stdin");
1148 return NULL;
1149 }
1150 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001151}
1152
1153static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001154builtin_reduce(self, args)
1155 object *self;
1156 object *args;
1157{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001158 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001159 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001160 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001161
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001162 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1163 return NULL;
1164 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001165 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001166
1167 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1168 err_setstr(TypeError,
1169 "2nd argument to reduce() must be a sequence object");
1170 return NULL;
1171 }
1172
Guido van Rossum12d12c51993-10-26 17:58:25 +00001173 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001174 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001175
Guido van Rossum2d951851994-08-29 12:52:16 +00001176 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001177 object *op2;
1178
1179 if (args->ob_refcnt > 1) {
1180 DECREF(args);
1181 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001182 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001183 }
1184
Guido van Rossum2d951851994-08-29 12:52:16 +00001185 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1186 if (err_occurred() == IndexError) {
1187 err_clear();
1188 break;
1189 }
1190 goto Fail;
1191 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001192
Guido van Rossum2d951851994-08-29 12:52:16 +00001193 if (result == NULL)
1194 result = op2;
1195 else {
1196 settupleitem(args, 0, result);
1197 settupleitem(args, 1, op2);
1198 if ((result = call_object(func, args)) == NULL)
1199 goto Fail;
1200 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001201 }
1202
1203 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001204
Guido van Rossum2d951851994-08-29 12:52:16 +00001205 if (result == NULL)
1206 err_setstr(TypeError,
1207 "reduce of empty sequence with no initial value");
1208
Guido van Rossum12d12c51993-10-26 17:58:25 +00001209 return result;
1210
Guido van Rossum2d951851994-08-29 12:52:16 +00001211Fail:
1212 XDECREF(args);
1213 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001214 return NULL;
1215}
1216
1217static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001218builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001219 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001220 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001221{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001222 object *v;
1223
1224 if (!newgetargs(args, "O:reload", &v))
1225 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001226 return reload_module(v);
1227}
1228
1229static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001230builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001231 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001232 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001233{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001234 object *v;
1235
1236 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001237 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001238 return reprobject(v);
1239}
1240
1241static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001242builtin_round(self, args)
1243 object *self;
1244 object *args;
1245{
1246 extern double floor PROTO((double));
1247 extern double ceil PROTO((double));
1248 double x;
1249 double f;
1250 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001251 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001252
1253 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001254 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001255 f = 1.0;
1256 for (i = ndigits; --i >= 0; )
1257 f = f*10.0;
1258 for (i = ndigits; ++i <= 0; )
1259 f = f*0.1;
1260 if (x >= 0.0)
1261 return newfloatobject(floor(x*f + 0.5) / f);
1262 else
1263 return newfloatobject(ceil(x*f - 0.5) / f);
1264}
1265
1266static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001267builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001268 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001269 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001270{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001271 object *v;
1272
1273 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001274 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001275 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001276}
1277
1278static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001279builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001280 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001281 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001282{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001283 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001284 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001285
1286 if (!newgetargs(args, "O:tuple", &v))
1287 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001288 if (is_tupleobject(v)) {
1289 INCREF(v);
1290 return v;
1291 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001292 if (is_listobject(v))
1293 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001294 if (is_stringobject(v)) {
1295 int n = getstringsize(v);
1296 object *t = newtupleobject(n);
1297 if (t != NULL) {
1298 int i;
1299 char *p = getstringvalue(v);
1300 for (i = 0; i < n; i++) {
1301 object *item = newsizedstringobject(p+i, 1);
1302 if (item == NULL) {
1303 DECREF(t);
1304 t = NULL;
1305 break;
1306 }
1307 settupleitem(t, i, item);
1308 }
1309 }
1310 return t;
1311 }
1312 /* Generic sequence object */
1313 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1314 int n = (*sqf->sq_length)(v);
1315 int i;
1316 object *t;
1317 if (n < 0)
1318 return NULL;
1319 t = newtupleobject(n);
1320 if (t == NULL)
1321 return NULL;
1322 for (i = 0; i < n; i++) {
1323 object *item = (*sqf->sq_item)(v, i);
1324 if (item == NULL) {
1325 DECREF(t);
1326 t = NULL;
1327 break;
1328 }
1329 settupleitem(t, i, item);
1330 }
1331 /* XXX Should support indefinite-length sequences */
1332 return t;
1333 }
1334 /* None of the above */
1335 err_setstr(TypeError, "tuple() argument must be a sequence");
1336 return NULL;
1337}
1338
1339static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001340builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001341 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001342 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001343{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001344 object *v;
1345
1346 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001347 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001348 v = (object *)v->ob_type;
1349 INCREF(v);
1350 return v;
1351}
1352
Guido van Rossum2d951851994-08-29 12:52:16 +00001353static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001354builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001355 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001356 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001357{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001358 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001359 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001360
1361 if (!newgetargs(args, "|O:vars", &v))
1362 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001363 if (v == NULL) {
1364 d = getlocals();
1365 INCREF(d);
1366 }
1367 else {
1368 d = getattr(v, "__dict__");
1369 if (d == NULL) {
1370 err_setstr(TypeError,
1371 "vars() argument must have __dict__ attribute");
1372 return NULL;
1373 }
1374 }
1375 return d;
1376}
1377
Guido van Rossum3f5da241990-12-20 15:06:42 +00001378static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001379 {"__import__", builtin___import__, 1},
1380 {"abs", builtin_abs, 1},
1381 {"apply", builtin_apply, 1},
1382 {"callable", builtin_callable, 1},
1383 {"chr", builtin_chr, 1},
1384 {"cmp", builtin_cmp, 1},
1385 {"coerce", builtin_coerce, 1},
1386 {"compile", builtin_compile, 1},
1387 {"delattr", builtin_delattr, 1},
1388 {"dir", builtin_dir, 1},
1389 {"divmod", builtin_divmod, 1},
1390 {"eval", builtin_eval, 1},
1391 {"execfile", builtin_execfile, 1},
1392 {"filter", builtin_filter, 1},
1393 {"float", builtin_float, 1},
1394 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001395 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001396 {"hasattr", builtin_hasattr, 1},
1397 {"hash", builtin_hash, 1},
1398 {"hex", builtin_hex, 1},
1399 {"id", builtin_id, 1},
1400 {"input", builtin_input, 1},
1401 {"int", builtin_int, 1},
1402 {"len", builtin_len, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001403 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001404 {"long", builtin_long, 1},
1405 {"map", builtin_map, 1},
1406 {"max", builtin_max, 1},
1407 {"min", builtin_min, 1},
1408 {"oct", builtin_oct, 1},
1409 {"open", builtin_open, 1},
1410 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001411 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001412 {"range", builtin_range, 1},
1413 {"raw_input", builtin_raw_input, 1},
1414 {"reduce", builtin_reduce, 1},
1415 {"reload", builtin_reload, 1},
1416 {"repr", builtin_repr, 1},
1417 {"round", builtin_round, 1},
1418 {"setattr", builtin_setattr, 1},
1419 {"str", builtin_str, 1},
1420 {"tuple", builtin_tuple, 1},
1421 {"type", builtin_type, 1},
1422 {"vars", builtin_vars, 1},
1423 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001424 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001425};
1426
Guido van Rossum0865dd91995-01-17 16:30:22 +00001427static object *builtin_mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001428static object *builtin_dict;
1429
1430object *
Guido van Rossum0865dd91995-01-17 16:30:22 +00001431getbuiltinmod()
1432{
1433 return builtin_mod;
1434}
1435
1436object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001437getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001438{
Guido van Rossum6135a871995-01-09 17:53:26 +00001439 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001440}
1441
1442/* Predefined exceptions */
1443
Guido van Rossum25831651993-05-19 14:50:45 +00001444object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001445object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001446object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001447object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001448object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001449object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001450object *IndexError;
1451object *KeyError;
1452object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001453object *MemoryError;
1454object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001455object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001456object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001457object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001458object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001459object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001460object *TypeError;
1461object *ValueError;
1462object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001463
Guido van Rossum3f5da241990-12-20 15:06:42 +00001464static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001465newstdexception(name)
1466 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001467{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001468 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001469 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1470 fatal("no mem for new standard exception");
1471 return v;
1472}
1473
1474static void
1475initerrors()
1476{
Guido van Rossum25831651993-05-19 14:50:45 +00001477 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001478 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001479 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001480 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001481 IOError = newstdexception("IOError");
1482 ImportError = newstdexception("ImportError");
1483 IndexError = newstdexception("IndexError");
1484 KeyError = newstdexception("KeyError");
1485 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001486 MemoryError = newstdexception("MemoryError");
1487 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001488 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001489 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001490 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001491 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001492 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001493 TypeError = newstdexception("TypeError");
1494 ValueError = newstdexception("ValueError");
1495 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001496}
1497
1498void
1499initbuiltin()
1500{
Guido van Rossum0865dd91995-01-17 16:30:22 +00001501 builtin_mod = initmodule("__builtin__", builtin_methods);
1502 builtin_dict = getmoduledict(builtin_mod);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001503 INCREF(builtin_dict);
1504 initerrors();
1505 (void) dictinsert(builtin_dict, "None", None);
1506}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001507
Guido van Rossum12d12c51993-10-26 17:58:25 +00001508
Guido van Rossume77a7571993-11-03 15:01:26 +00001509/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001510
1511static object *
1512filtertuple(func, tuple)
1513 object *func;
1514 object *tuple;
1515{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001516 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001517 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001518 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001519
Guido van Rossum2586bf01993-11-01 16:21:44 +00001520 if ((result = newtupleobject(len)) == NULL)
1521 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001522
Guido van Rossum12d12c51993-10-26 17:58:25 +00001523 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001524 object *item, *good;
1525 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001526
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001527 if ((item = gettupleitem(tuple, i)) == NULL)
1528 goto Fail_1;
1529 if (func == None) {
1530 INCREF(item);
1531 good = item;
1532 }
1533 else {
1534 object *arg = mkvalue("(O)", item);
1535 if (arg == NULL)
1536 goto Fail_1;
1537 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001538 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001539 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001540 goto Fail_1;
1541 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001542 ok = testbool(good);
1543 DECREF(good);
1544 if (ok) {
1545 INCREF(item);
1546 if (settupleitem(result, j++, item) < 0)
1547 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001548 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001549 }
1550
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001551 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001552 return NULL;
1553
Guido van Rossum12d12c51993-10-26 17:58:25 +00001554 return result;
1555
Guido van Rossum12d12c51993-10-26 17:58:25 +00001556Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001557 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001558 return NULL;
1559}
1560
1561
Guido van Rossume77a7571993-11-03 15:01:26 +00001562/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001563
1564static object *
1565filterstring(func, strobj)
1566 object *func;
1567 object *strobj;
1568{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001569 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001570 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001571 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001572
Guido van Rossum2586bf01993-11-01 16:21:44 +00001573 if (func == None) {
1574 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001575 INCREF(strobj);
1576 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001577 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001578 if ((result = newsizedstringobject(NULL, len)) == NULL)
1579 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001580
Guido van Rossum12d12c51993-10-26 17:58:25 +00001581 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001582 object *item, *arg, *good;
1583 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001584
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001585 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1586 if (item == NULL)
1587 goto Fail_1;
1588 arg = mkvalue("(O)", item);
1589 DECREF(item);
1590 if (arg == NULL)
1591 goto Fail_1;
1592 good = call_object(func, arg);
1593 DECREF(arg);
1594 if (good == NULL)
1595 goto Fail_1;
1596 ok = testbool(good);
1597 DECREF(good);
1598 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001599 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001600 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001601 }
1602
Guido van Rossum12d12c51993-10-26 17:58:25 +00001603 if (resizestring(&result, j) < 0)
1604 return NULL;
1605
Guido van Rossum12d12c51993-10-26 17:58:25 +00001606 return result;
1607
Guido van Rossum12d12c51993-10-26 17:58:25 +00001608Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001609 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001610 return NULL;
1611}