blob: 0be037397ab60966d0b8287cd53cf8e6c6447ae5 [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 &&
1108 getfilefile(sysget("stdout")) == stdout) {
1109 object *po;
1110 char *prompt;
1111 char *s;
1112 object *result;
1113 if (v != NULL) {
1114 po = strobject(v);
1115 if (po == NULL)
1116 return NULL;
1117 prompt = getstringvalue(po);
1118 }
1119 else {
1120 po = NULL;
1121 prompt = "";
1122 }
1123 s = my_readline(prompt);
1124 XDECREF(po);
1125 if (s == NULL) {
1126 err_set(KeyboardInterrupt);
1127 return NULL;
1128 }
1129 if (*s == '\0') {
1130 err_set(EOFError);
1131 result = NULL;
1132 }
1133 else { /* strip trailing '\n' */
1134 result = newsizedstringobject(s, strlen(s)-1);
1135 }
1136 free(s);
1137 return result;
1138 }
Guido van Rossum90933611991-06-07 16:10:43 +00001139 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001140 f = sysget("stdout");
1141 if (f == NULL) {
1142 err_setstr(RuntimeError, "lost sys.stdout");
1143 return NULL;
1144 }
1145 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001146 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001147 return NULL;
1148 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001149 f = sysget("stdin");
1150 if (f == NULL) {
1151 err_setstr(RuntimeError, "lost sys.stdin");
1152 return NULL;
1153 }
1154 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001155}
1156
1157static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001158builtin_reduce(self, args)
1159 object *self;
1160 object *args;
1161{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001162 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001163 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001164 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001165
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001166 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1167 return NULL;
1168 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001169 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001170
1171 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1172 err_setstr(TypeError,
1173 "2nd argument to reduce() must be a sequence object");
1174 return NULL;
1175 }
1176
Guido van Rossum12d12c51993-10-26 17:58:25 +00001177 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001178 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001179
Guido van Rossum2d951851994-08-29 12:52:16 +00001180 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001181 object *op2;
1182
1183 if (args->ob_refcnt > 1) {
1184 DECREF(args);
1185 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001186 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001187 }
1188
Guido van Rossum2d951851994-08-29 12:52:16 +00001189 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1190 if (err_occurred() == IndexError) {
1191 err_clear();
1192 break;
1193 }
1194 goto Fail;
1195 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001196
Guido van Rossum2d951851994-08-29 12:52:16 +00001197 if (result == NULL)
1198 result = op2;
1199 else {
1200 settupleitem(args, 0, result);
1201 settupleitem(args, 1, op2);
1202 if ((result = call_object(func, args)) == NULL)
1203 goto Fail;
1204 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001205 }
1206
1207 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001208
Guido van Rossum2d951851994-08-29 12:52:16 +00001209 if (result == NULL)
1210 err_setstr(TypeError,
1211 "reduce of empty sequence with no initial value");
1212
Guido van Rossum12d12c51993-10-26 17:58:25 +00001213 return result;
1214
Guido van Rossum2d951851994-08-29 12:52:16 +00001215Fail:
1216 XDECREF(args);
1217 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001218 return NULL;
1219}
1220
1221static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001222builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001223 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001224 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001225{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001226 object *v;
1227
1228 if (!newgetargs(args, "O:reload", &v))
1229 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001230 return reload_module(v);
1231}
1232
1233static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001234builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001235 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001236 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001237{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001238 object *v;
1239
1240 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001241 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001242 return reprobject(v);
1243}
1244
1245static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001246builtin_round(self, args)
1247 object *self;
1248 object *args;
1249{
1250 extern double floor PROTO((double));
1251 extern double ceil PROTO((double));
1252 double x;
1253 double f;
1254 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001255 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001256
1257 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001258 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001259 f = 1.0;
1260 for (i = ndigits; --i >= 0; )
1261 f = f*10.0;
1262 for (i = ndigits; ++i <= 0; )
1263 f = f*0.1;
1264 if (x >= 0.0)
1265 return newfloatobject(floor(x*f + 0.5) / f);
1266 else
1267 return newfloatobject(ceil(x*f - 0.5) / f);
1268}
1269
1270static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001271builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001272 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001273 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001274{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001275 object *v;
1276
1277 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001278 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001279 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001280}
1281
1282static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001283builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001284 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001285 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001286{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001287 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001288 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001289
1290 if (!newgetargs(args, "O:tuple", &v))
1291 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001292 if (is_tupleobject(v)) {
1293 INCREF(v);
1294 return v;
1295 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001296 if (is_listobject(v))
1297 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001298 if (is_stringobject(v)) {
1299 int n = getstringsize(v);
1300 object *t = newtupleobject(n);
1301 if (t != NULL) {
1302 int i;
1303 char *p = getstringvalue(v);
1304 for (i = 0; i < n; i++) {
1305 object *item = newsizedstringobject(p+i, 1);
1306 if (item == NULL) {
1307 DECREF(t);
1308 t = NULL;
1309 break;
1310 }
1311 settupleitem(t, i, item);
1312 }
1313 }
1314 return t;
1315 }
1316 /* Generic sequence object */
1317 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1318 int n = (*sqf->sq_length)(v);
1319 int i;
1320 object *t;
1321 if (n < 0)
1322 return NULL;
1323 t = newtupleobject(n);
1324 if (t == NULL)
1325 return NULL;
1326 for (i = 0; i < n; i++) {
1327 object *item = (*sqf->sq_item)(v, i);
1328 if (item == NULL) {
1329 DECREF(t);
1330 t = NULL;
1331 break;
1332 }
1333 settupleitem(t, i, item);
1334 }
1335 /* XXX Should support indefinite-length sequences */
1336 return t;
1337 }
1338 /* None of the above */
1339 err_setstr(TypeError, "tuple() argument must be a sequence");
1340 return NULL;
1341}
1342
1343static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001344builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001345 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001346 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001347{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001348 object *v;
1349
1350 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001351 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001352 v = (object *)v->ob_type;
1353 INCREF(v);
1354 return v;
1355}
1356
Guido van Rossum2d951851994-08-29 12:52:16 +00001357static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001358builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001359 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001360 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001361{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001362 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001363 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001364
1365 if (!newgetargs(args, "|O:vars", &v))
1366 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001367 if (v == NULL) {
1368 d = getlocals();
1369 INCREF(d);
1370 }
1371 else {
1372 d = getattr(v, "__dict__");
1373 if (d == NULL) {
1374 err_setstr(TypeError,
1375 "vars() argument must have __dict__ attribute");
1376 return NULL;
1377 }
1378 }
1379 return d;
1380}
1381
Guido van Rossum3f5da241990-12-20 15:06:42 +00001382static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001383 {"__import__", builtin___import__, 1},
1384 {"abs", builtin_abs, 1},
1385 {"apply", builtin_apply, 1},
1386 {"callable", builtin_callable, 1},
1387 {"chr", builtin_chr, 1},
1388 {"cmp", builtin_cmp, 1},
1389 {"coerce", builtin_coerce, 1},
1390 {"compile", builtin_compile, 1},
1391 {"delattr", builtin_delattr, 1},
1392 {"dir", builtin_dir, 1},
1393 {"divmod", builtin_divmod, 1},
1394 {"eval", builtin_eval, 1},
1395 {"execfile", builtin_execfile, 1},
1396 {"filter", builtin_filter, 1},
1397 {"float", builtin_float, 1},
1398 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001399 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001400 {"hasattr", builtin_hasattr, 1},
1401 {"hash", builtin_hash, 1},
1402 {"hex", builtin_hex, 1},
1403 {"id", builtin_id, 1},
1404 {"input", builtin_input, 1},
1405 {"int", builtin_int, 1},
1406 {"len", builtin_len, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001407 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001408 {"long", builtin_long, 1},
1409 {"map", builtin_map, 1},
1410 {"max", builtin_max, 1},
1411 {"min", builtin_min, 1},
1412 {"oct", builtin_oct, 1},
1413 {"open", builtin_open, 1},
1414 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001415 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001416 {"range", builtin_range, 1},
1417 {"raw_input", builtin_raw_input, 1},
1418 {"reduce", builtin_reduce, 1},
1419 {"reload", builtin_reload, 1},
1420 {"repr", builtin_repr, 1},
1421 {"round", builtin_round, 1},
1422 {"setattr", builtin_setattr, 1},
1423 {"str", builtin_str, 1},
1424 {"tuple", builtin_tuple, 1},
1425 {"type", builtin_type, 1},
1426 {"vars", builtin_vars, 1},
1427 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001428 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001429};
1430
Guido van Rossum0865dd91995-01-17 16:30:22 +00001431static object *builtin_mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001432static object *builtin_dict;
1433
1434object *
Guido van Rossum0865dd91995-01-17 16:30:22 +00001435getbuiltinmod()
1436{
1437 return builtin_mod;
1438}
1439
1440object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001441getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001442{
Guido van Rossum6135a871995-01-09 17:53:26 +00001443 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001444}
1445
1446/* Predefined exceptions */
1447
Guido van Rossum25831651993-05-19 14:50:45 +00001448object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001449object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001450object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001451object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001452object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001453object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001454object *IndexError;
1455object *KeyError;
1456object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001457object *MemoryError;
1458object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001459object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001460object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001461object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001462object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001463object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001464object *TypeError;
1465object *ValueError;
1466object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001467
Guido van Rossum3f5da241990-12-20 15:06:42 +00001468static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001469newstdexception(name)
1470 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001471{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001472 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001473 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1474 fatal("no mem for new standard exception");
1475 return v;
1476}
1477
1478static void
1479initerrors()
1480{
Guido van Rossum25831651993-05-19 14:50:45 +00001481 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001482 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001483 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001484 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001485 IOError = newstdexception("IOError");
1486 ImportError = newstdexception("ImportError");
1487 IndexError = newstdexception("IndexError");
1488 KeyError = newstdexception("KeyError");
1489 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001490 MemoryError = newstdexception("MemoryError");
1491 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001492 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001493 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001494 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001495 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001496 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001497 TypeError = newstdexception("TypeError");
1498 ValueError = newstdexception("ValueError");
1499 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001500}
1501
1502void
1503initbuiltin()
1504{
Guido van Rossum0865dd91995-01-17 16:30:22 +00001505 builtin_mod = initmodule("__builtin__", builtin_methods);
1506 builtin_dict = getmoduledict(builtin_mod);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001507 INCREF(builtin_dict);
1508 initerrors();
1509 (void) dictinsert(builtin_dict, "None", None);
1510}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001511
Guido van Rossum12d12c51993-10-26 17:58:25 +00001512
Guido van Rossume77a7571993-11-03 15:01:26 +00001513/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001514
1515static object *
1516filtertuple(func, tuple)
1517 object *func;
1518 object *tuple;
1519{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001520 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001521 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001522 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001523
Guido van Rossum2586bf01993-11-01 16:21:44 +00001524 if ((result = newtupleobject(len)) == NULL)
1525 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001526
Guido van Rossum12d12c51993-10-26 17:58:25 +00001527 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001528 object *item, *good;
1529 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001530
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001531 if ((item = gettupleitem(tuple, i)) == NULL)
1532 goto Fail_1;
1533 if (func == None) {
1534 INCREF(item);
1535 good = item;
1536 }
1537 else {
1538 object *arg = mkvalue("(O)", item);
1539 if (arg == NULL)
1540 goto Fail_1;
1541 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001542 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001543 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001544 goto Fail_1;
1545 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001546 ok = testbool(good);
1547 DECREF(good);
1548 if (ok) {
1549 INCREF(item);
1550 if (settupleitem(result, j++, item) < 0)
1551 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001552 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001553 }
1554
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001555 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001556 return NULL;
1557
Guido van Rossum12d12c51993-10-26 17:58:25 +00001558 return result;
1559
Guido van Rossum12d12c51993-10-26 17:58:25 +00001560Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001561 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001562 return NULL;
1563}
1564
1565
Guido van Rossume77a7571993-11-03 15:01:26 +00001566/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001567
1568static object *
1569filterstring(func, strobj)
1570 object *func;
1571 object *strobj;
1572{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001573 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001574 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001575 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001576
Guido van Rossum2586bf01993-11-01 16:21:44 +00001577 if (func == None) {
1578 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001579 INCREF(strobj);
1580 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001581 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001582 if ((result = newsizedstringobject(NULL, len)) == NULL)
1583 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001584
Guido van Rossum12d12c51993-10-26 17:58:25 +00001585 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001586 object *item, *arg, *good;
1587 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001588
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001589 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1590 if (item == NULL)
1591 goto Fail_1;
1592 arg = mkvalue("(O)", item);
1593 DECREF(item);
1594 if (arg == NULL)
1595 goto Fail_1;
1596 good = call_object(func, arg);
1597 DECREF(arg);
1598 if (good == NULL)
1599 goto Fail_1;
1600 ok = testbool(good);
1601 DECREF(good);
1602 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001603 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001604 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001605 }
1606
Guido van Rossum12d12c51993-10-26 17:58:25 +00001607 if (resizestring(&result, j) < 0)
1608 return NULL;
1609
Guido van Rossum12d12c51993-10-26 17:58:25 +00001610 return result;
1611
Guido van Rossum12d12c51993-10-26 17:58:25 +00001612Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001613 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001614 return NULL;
1615}