blob: 53720ada474cb5d3b62e62f6adcdd3970ae1c087 [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;
50 object *m;
51
52 if (!newgetargs(args, "s:__import__", &name))
53 return NULL;
54 m = import_module(name);
55 XINCREF(m);
56
57 return m;
58}
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 int
95callable(x)
96 object *x;
97{
98 if (x == NULL)
99 return 0;
100 if (x->ob_type->tp_call != NULL ||
101 is_funcobject(x) ||
102 is_instancemethodobject(x) ||
103 is_methodobject(x) ||
104 is_classobject(x))
105 return 1;
106 if (is_instanceobject(x)) {
107 object *call = getattr(x, "__call__");
108 if (call == NULL) {
109 err_clear();
110 return 0;
111 }
112 /* Could test recursively but don't, for fear of endless
113 recursion if some joker sets self.__call__ = self */
114 DECREF(call);
115 return 1;
116 }
117 return 0;
118}
119
120static object *
121builtin_callable(self, args)
122 object *self;
123 object *args;
124{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000125 object *v;
126
127 if (!newgetargs(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000128 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000129 return newintobject((long)callable(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000130}
131
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000132static object *
Guido van Rossume77a7571993-11-03 15:01:26 +0000133builtin_filter(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000134 object *self;
135 object *args;
136{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000137 object *func, *seq, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000138 sequence_methods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000139 int len;
140 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000141
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000142 if (!newgetargs(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000143 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000144
Guido van Rossum12d12c51993-10-26 17:58:25 +0000145 if (is_stringobject(seq)) {
146 object *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000147 return r;
148 }
149
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000150 if (is_tupleobject(seq)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000151 object *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000152 return r;
153 }
154
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000155 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000156 err_setstr(TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000157 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000158 goto Fail_2;
159 }
160
161 if ((len = (*sqf->sq_length)(seq)) < 0)
162 goto Fail_2;
163
164 if (is_listobject(seq) && seq->ob_refcnt == 1) {
165 INCREF(seq);
166 result = seq;
167 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000168 else {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000169 if ((result = newlistobject(len)) == NULL)
170 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000171 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000172
Guido van Rossum2d951851994-08-29 12:52:16 +0000173 for (i = j = 0; ; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000174 object *item, *good;
175 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000176
Guido van Rossum2d951851994-08-29 12:52:16 +0000177 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
178 if (i < len)
179 goto Fail_1;
180 if (err_occurred() == IndexError) {
181 err_clear();
182 break;
183 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000184 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000185 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000186
187 if (func == None) {
188 good = item;
189 }
190 else {
191 object *arg = mkvalue("(O)", item);
192 DECREF(item);
193 if (arg == NULL)
194 goto Fail_1;
195 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000196 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000197 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000198 goto Fail_1;
199 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000200 ok = testbool(good);
201 DECREF(good);
202 if (ok) {
203 INCREF(item);
Guido van Rossum2d951851994-08-29 12:52:16 +0000204 if (j < len) {
205 if (setlistitem(result, j++, item) < 0)
206 goto Fail_1;
207 }
208 else {
209 j++;
210 if (addlistitem(result, item) < 0)
211 goto Fail_1;
212 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000213 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000214 }
215
Guido van Rossum12d12c51993-10-26 17:58:25 +0000216
Guido van Rossum2d951851994-08-29 12:52:16 +0000217 if (j < len && setlistslice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000218 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000219
Guido van Rossum12d12c51993-10-26 17:58:25 +0000220 return result;
221
Guido van Rossum12d12c51993-10-26 17:58:25 +0000222Fail_1:
223 DECREF(result);
224Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000225 return NULL;
226}
227
228static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000229builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000230 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000231 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000232{
233 long x;
234 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000235
236 if (!newgetargs(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000237 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000238 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000239 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000240 return NULL;
241 }
242 s[0] = x;
243 return newsizedstringobject(s, 1);
244}
245
246static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000247builtin_cmp(self, args)
248 object *self;
249 object *args;
250{
251 object *a, *b;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000252
253 if (!newgetargs(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000254 return NULL;
255 return newintobject((long)cmpobject(a, b));
256}
257
258static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000259do_coerce(v, w)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000260 object *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000261{
Guido van Rossum04691fc1992-08-12 15:35:34 +0000262 object *res;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000263 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000264 return instancebinop(v, w, "__coerce__", "__rcoerce__",
265 do_coerce);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000266 if (coerce(&v, &w) < 0)
267 return NULL;
268 res = mkvalue("(OO)", v, w);
269 DECREF(v);
270 DECREF(w);
271 return res;
272}
273
274static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000275builtin_coerce(self, args)
276 object *self;
277 object *args;
278{
279 object *v, *w;
280
281 if (!newgetargs(args, "OO:coerce", &v, &w))
282 return NULL;
283 return do_coerce(v, w);
284}
285
286static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000287builtin_compile(self, args)
288 object *self;
289 object *args;
290{
291 char *str;
292 char *filename;
293 char *startstr;
294 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000295
296 if (!newgetargs(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000297 return NULL;
298 if (strcmp(startstr, "exec") == 0)
299 start = file_input;
300 else if (strcmp(startstr, "eval") == 0)
301 start = eval_input;
302 else {
303 err_setstr(ValueError,
304 "compile() mode must be 'exec' or 'eval'");
305 return NULL;
306 }
307 return compile_string(str, filename, start);
308}
309
310static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000311builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000312 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000313 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000314{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000315 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000316 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000317
318 if (!newgetargs(args, "|O:dir", &v))
319 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000320 if (v == NULL) {
321 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000322 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000323 }
324 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000325 d = getattr(v, "__dict__");
326 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000327 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000328 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000329 return NULL;
330 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000331 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000332 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000333 v = getdictkeys(d);
334 if (sortlist(v) != 0) {
335 DECREF(v);
336 v = NULL;
337 }
338 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000339 else {
340 v = newlistobject(0);
341 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000342 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000343 return v;
344}
345
346static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000347do_divmod(v, w)
348 object *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000349{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000350 object *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000351
Guido van Rossum180d7b41994-09-29 09:45:57 +0000352 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000353 return instancebinop(v, w, "__divmod__", "__rdivmod__",
354 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000355 if (v->ob_type->tp_as_number == NULL ||
356 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000357 err_setstr(TypeError,
358 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000359 return NULL;
360 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000361 if (coerce(&v, &w) != 0)
362 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000363 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000364 DECREF(v);
365 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000366 return res;
367}
368
369static object *
370builtin_divmod(self, args)
371 object *self;
372 object *args;
373{
374 object *v, *w;
375
376 if (!newgetargs(args, "OO:divmod", &v, &w))
377 return NULL;
378 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000379}
380
381static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000382builtin_eval(self, args)
383 object *self;
384 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000385{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000386 object *cmd;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000387 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000388 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000389
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000390 if (!newgetargs(args, "O|O!O!:eval",
391 &cmd,
392 &Mappingtype, &globals,
393 &Mappingtype, &locals))
394 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000395 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000396 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000397 if (locals == None)
398 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000399 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000400 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000401 locals = globals;
402 if (dictlookup(globals, "__builtins__") == NULL) {
403 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
404 return NULL;
405 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000406 if (is_codeobject(cmd))
407 return eval_code((codeobject *) cmd, globals, locals,
Guido van Rossum81daa321993-05-20 14:24:46 +0000408 (object *)NULL, (object *)NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000409 if (!is_stringobject(cmd)) {
410 err_setstr(TypeError,
411 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000412 return NULL;
413 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000414 str = getstringvalue(cmd);
415 if (strlen(str) != getstringsize(cmd)) {
416 err_setstr(ValueError,
417 "embedded '\\0' in string arg");
418 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000419 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000420 while (*str == ' ' || *str == '\t')
421 str++;
422 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000423}
424
425static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000426builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000427 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000428 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000429{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000430 char *filename;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000431 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000433 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000434 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000435 int n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000436
437 if (!newgetargs(args, "s|O!O!:execfile",
438 &filename,
439 &Mappingtype, &globals,
440 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000441 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000442 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000443 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000444 if (locals == None)
445 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000446 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000447 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000448 locals = globals;
449 if (dictlookup(globals, "__builtins__") == NULL) {
450 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
451 return NULL;
452 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000453 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000454 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000455 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000456 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000457 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000458 return NULL;
459 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000460 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000461 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000462 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000463 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000464 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000465}
466
467static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000468builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000469 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000470 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000471{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000472 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000473 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000474
475 if (!newgetargs(args, "O:float", &v))
476 return NULL;
477 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000478 nb->nb_float == NULL) {
479 err_setstr(TypeError,
480 "float() argument can't be converted to float");
481 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000482 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000483 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000484}
485
486static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000487builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000488 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000489 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000490{
Guido van Rossum94390a41992-08-14 15:14:30 +0000491 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000492 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000493
494 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000495 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000496 return getattro(v, name);
497}
498
499static object *
500builtin_hasattr(self, args)
501 object *self;
502 object *args;
503{
504 object *v;
505 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000506
507 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000508 return NULL;
509 v = getattro(v, name);
510 if (v == NULL) {
511 err_clear();
512 return newintobject(0L);
513 }
514 DECREF(v);
515 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000516}
517
518static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000519builtin_id(self, args)
520 object *self;
521 object *args;
522{
523 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000524
525 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000526 return NULL;
527 return newintobject((long)v);
528}
529
530static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000531builtin_map(self, args)
532 object *self;
533 object *args;
534{
535 typedef struct {
536 object *seq;
537 sequence_methods *sqf;
538 int len;
539 } sequence;
540
541 object *func, *result;
542 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000543 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000544 register int i, j;
545
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000546 n = gettuplesize(args);
547 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000548 err_setstr(TypeError, "map() requires at least two args");
549 return NULL;
550 }
551
552 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000553 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000554
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000555 if ((seqs = NEW(sequence, n)) == NULL) {
556 err_nomem();
557 goto Fail_2;
558 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000559
Guido van Rossum2d951851994-08-29 12:52:16 +0000560 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000561 int curlen;
562
563 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
564 goto Fail_2;
565
566 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
567 static char errmsg[] =
568 "argument %d to map() must be a sequence object";
569 char errbuf[sizeof(errmsg) + 3];
570
571 sprintf(errbuf, errmsg, i+2);
572 err_setstr(TypeError, errbuf);
573 goto Fail_2;
574 }
575
576 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
577 goto Fail_2;
578
579 if (curlen > len)
580 len = curlen;
581 }
582
583 if ((result = (object *) newlistobject(len)) == NULL)
584 goto Fail_2;
585
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000586 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000587 for (i = 0; ; ++i) {
588 object *arglist, *item, *value;
589 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000590
Guido van Rossum2d951851994-08-29 12:52:16 +0000591 if (func == None && n == 1)
592 arglist = NULL;
593 else {
594 if ((arglist = newtupleobject(n)) == NULL)
595 goto Fail_1;
596 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000597
598 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000599 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000600 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000601 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000602 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000603 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000604 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000605 if (item == NULL) {
606 if (i < sqp->len)
607 goto Fail_0;
608 if (err_occurred() == IndexError) {
609 err_clear();
610 INCREF(None);
611 item = None;
612 sqp->len = -1;
613 }
614 else {
615 goto Fail_0;
616 }
617 }
618 else
619 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000620
Guido van Rossum12d12c51993-10-26 17:58:25 +0000621 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000622 if (!arglist)
623 break;
624 if (settupleitem(arglist, j, item) < 0) {
625 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000626 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000627 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000628 continue;
629
630 Fail_0:
Guido van Rossum2d951851994-08-29 12:52:16 +0000631 XDECREF(arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000632 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000633 }
634
Guido van Rossum2d951851994-08-29 12:52:16 +0000635 if (!arglist)
636 arglist = item;
637
638 if (!any) {
639 DECREF(arglist);
640 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000641 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000642
643 if (func == None)
644 value = arglist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000645 else {
Guido van Rossum2d951851994-08-29 12:52:16 +0000646 value = call_object(func, arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000647 DECREF(arglist);
648 if (value == NULL)
649 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000650 }
651 if (i >= len) {
652 if (addlistitem(result, value) < 0)
653 goto Fail_1;
654 }
655 else {
656 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000657 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000658 }
659 }
660
Guido van Rossum2d951851994-08-29 12:52:16 +0000661 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000662 return result;
663
Guido van Rossum12d12c51993-10-26 17:58:25 +0000664Fail_1:
665 DECREF(result);
666Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000667 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000668 return NULL;
669}
670
671static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000672builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000673 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000674 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000675{
Guido van Rossum94390a41992-08-14 15:14:30 +0000676 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000677 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000678 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000679
680 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000681 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000682 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000683 return NULL;
684 INCREF(None);
685 return None;
686}
687
688static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000689builtin_delattr(self, args)
690 object *self;
691 object *args;
692{
693 object *v;
694 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000695
696 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000697 return NULL;
698 if (setattro(v, name, (object *)NULL) != 0)
699 return NULL;
700 INCREF(None);
701 return None;
702}
703
704static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000705builtin_hash(self, args)
706 object *self;
707 object *args;
708{
709 object *v;
710 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000711
712 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000713 return NULL;
714 x = hashobject(v);
715 if (x == -1)
716 return NULL;
717 return newintobject(x);
718}
719
720static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000721builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000722 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000723 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000724{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000725 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000726 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000727
728 if (!newgetargs(args, "O:hex", &v))
729 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000730
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000731 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000732 nb->nb_hex == NULL) {
733 err_setstr(TypeError,
734 "hex() argument can't be converted to hex");
735 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000736 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000737 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000738}
739
Guido van Rossum3165fe61992-09-25 21:59:05 +0000740static object *builtin_raw_input PROTO((object *, object *));
741
Guido van Rossum006bcd41991-10-24 14:54:44 +0000742static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000743builtin_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000744 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000745 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000746{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000747 object *line;
748 char *str;
749 object *res;
Guido van Rossum6135a871995-01-09 17:53:26 +0000750 object *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000751
752 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000753 if (line == NULL)
754 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000755 if (!getargs(line, "s;embedded '\\0' in input line", &str))
756 return NULL;
757 while (*str == ' ' || *str == '\t')
758 str++;
Guido van Rossum6135a871995-01-09 17:53:26 +0000759 globals = getglobals();
760 locals = getlocals();
761 if (dictlookup(globals, "__builtins__") == NULL) {
762 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
763 return NULL;
764 }
765 res = run_string(str, eval_input, globals, locals);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000766 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000767 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000768}
769
770static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000771builtin_int(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 Rossum1899c2e1992-09-12 11:09:23 +0000776 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000777
778 if (!newgetargs(args, "O:int", &v))
779 return NULL;
780 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000781 nb->nb_int == NULL) {
782 err_setstr(TypeError,
783 "int() argument can't be converted to int");
784 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000785 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000786 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000787}
788
789static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000790builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000791 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000792 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000793{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000794 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000795 long len;
796 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000797
798 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000799 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000800 tp = v->ob_type;
801 if (tp->tp_as_sequence != NULL) {
802 len = (*tp->tp_as_sequence->sq_length)(v);
803 }
804 else if (tp->tp_as_mapping != NULL) {
805 len = (*tp->tp_as_mapping->mp_length)(v);
806 }
807 else {
808 err_setstr(TypeError, "len() of unsized object");
809 return NULL;
810 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000811 if (len < 0)
812 return NULL;
813 else
814 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000815}
816
817static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000818builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000819 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000820 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000821{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000823 number_methods *nb;
824
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000825 if (!newgetargs(args, "O:long", &v))
826 return NULL;
827 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000828 nb->nb_long == NULL) {
829 err_setstr(TypeError,
830 "long() argument can't be converted to long");
831 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000832 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000833 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000834}
835
836static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000837min_max(args, sign)
838 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000839 int sign;
840{
Guido van Rossum2d951851994-08-29 12:52:16 +0000841 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000842 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000843 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000844
845 if (gettuplesize(args) > 1)
846 v = args;
847 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000848 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000849 sq = v->ob_type->tp_as_sequence;
850 if (sq == NULL) {
851 err_setstr(TypeError, "min() or max() of non-sequence");
852 return NULL;
853 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000854 w = NULL;
855 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000856 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000857 if (x == NULL) {
858 if (err_occurred() == IndexError) {
859 err_clear();
860 break;
861 }
862 XDECREF(w);
863 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000864 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000865 if (w == NULL)
866 w = x;
867 else {
868 if (cmpobject(x, w) * sign > 0) {
869 DECREF(w);
870 w = x;
871 }
872 else
873 DECREF(x);
874 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000875 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000876 if (w == NULL)
877 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000878 return w;
879}
880
881static object *
882builtin_min(self, v)
883 object *self;
884 object *v;
885{
886 return min_max(v, -1);
887}
888
889static object *
890builtin_max(self, v)
891 object *self;
892 object *v;
893{
894 return min_max(v, 1);
895}
896
897static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000898builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000899 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000900 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000901{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000902 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000903 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000904
905 if (!newgetargs(args, "O:oct", &v))
906 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000907 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
908 nb->nb_oct == NULL) {
909 err_setstr(TypeError,
910 "oct() argument can't be converted to oct");
911 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000912 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000913 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000914}
915
916static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000917builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000918 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000919 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000920{
Guido van Rossum2d951851994-08-29 12:52:16 +0000921 char *name;
922 char *mode = "r";
923 int bufsize = -1;
924 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000925
926 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000927 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000928 f = newfileobject(name, mode);
929 if (f != NULL)
930 setfilebufsize(f, bufsize);
931 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000932}
933
934static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000935builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000936 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000937 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000938{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000939 char c;
940
941 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000942 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000943 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000944}
945
946static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000947do_pow(v, w)
948 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +0000949{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000950 object *res;
951 if (is_instanceobject(v) || is_instanceobject(w))
952 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000953 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000954 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000955 err_setstr(TypeError, "pow() requires numeric arguments");
956 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,
1021 "i;range() requires 1-3 int arguments",
1022 &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,
1027 "ii|i;range() requires 1-3 int arguments",
1028 &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;
1063 int n;
1064 object *v;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001065
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001066 if (gettuplesize(args) <= 1) {
1067 if (!newgetargs(args,
1068 "i;xrange() requires 1-3 int arguments",
1069 &ihigh))
1070 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001071 }
1072 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001073 if (!newgetargs(args,
1074 "ii|i;xrange() requires 1-3 int arguments",
1075 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001076 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001077 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001078 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001079 err_setstr(ValueError, "zero step for xrange()");
1080 return NULL;
1081 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001082 /* XXX ought to check overflow of subtraction */
1083 if (istep > 0)
1084 n = (ihigh - ilow + istep - 1) / istep;
1085 else
1086 n = (ihigh - ilow + istep + 1) / istep;
1087 if (n < 0)
1088 n = 0;
1089 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001090}
1091
1092static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001093builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001094 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001095 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001096{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001097 object *v = NULL;
1098 object *f;
1099
1100 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001101 return NULL;
Guido van Rossum90933611991-06-07 16:10:43 +00001102 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001103 f = sysget("stdout");
1104 if (f == NULL) {
1105 err_setstr(RuntimeError, "lost sys.stdout");
1106 return NULL;
1107 }
1108 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001109 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001110 return NULL;
1111 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001112 f = sysget("stdin");
1113 if (f == NULL) {
1114 err_setstr(RuntimeError, "lost sys.stdin");
1115 return NULL;
1116 }
1117 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001118}
1119
1120static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001121builtin_reduce(self, args)
1122 object *self;
1123 object *args;
1124{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001125 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001126 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001127 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001128
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001129 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1130 return NULL;
1131 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001132 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001133
1134 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1135 err_setstr(TypeError,
1136 "2nd argument to reduce() must be a sequence object");
1137 return NULL;
1138 }
1139
Guido van Rossum12d12c51993-10-26 17:58:25 +00001140 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001141 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001142
Guido van Rossum2d951851994-08-29 12:52:16 +00001143 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001144 object *op2;
1145
1146 if (args->ob_refcnt > 1) {
1147 DECREF(args);
1148 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001149 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001150 }
1151
Guido van Rossum2d951851994-08-29 12:52:16 +00001152 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1153 if (err_occurred() == IndexError) {
1154 err_clear();
1155 break;
1156 }
1157 goto Fail;
1158 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001159
Guido van Rossum2d951851994-08-29 12:52:16 +00001160 if (result == NULL)
1161 result = op2;
1162 else {
1163 settupleitem(args, 0, result);
1164 settupleitem(args, 1, op2);
1165 if ((result = call_object(func, args)) == NULL)
1166 goto Fail;
1167 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001168 }
1169
1170 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001171
Guido van Rossum2d951851994-08-29 12:52:16 +00001172 if (result == NULL)
1173 err_setstr(TypeError,
1174 "reduce of empty sequence with no initial value");
1175
Guido van Rossum12d12c51993-10-26 17:58:25 +00001176 return result;
1177
Guido van Rossum2d951851994-08-29 12:52:16 +00001178Fail:
1179 XDECREF(args);
1180 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001181 return NULL;
1182}
1183
1184static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001185builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001186 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001187 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001188{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001189 object *v;
1190
1191 if (!newgetargs(args, "O:reload", &v))
1192 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001193 return reload_module(v);
1194}
1195
1196static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001197builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001198 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001199 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001200{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001201 object *v;
1202
1203 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001204 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001205 return reprobject(v);
1206}
1207
1208static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001209builtin_round(self, args)
1210 object *self;
1211 object *args;
1212{
1213 extern double floor PROTO((double));
1214 extern double ceil PROTO((double));
1215 double x;
1216 double f;
1217 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001218 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001219
1220 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001221 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001222 f = 1.0;
1223 for (i = ndigits; --i >= 0; )
1224 f = f*10.0;
1225 for (i = ndigits; ++i <= 0; )
1226 f = f*0.1;
1227 if (x >= 0.0)
1228 return newfloatobject(floor(x*f + 0.5) / f);
1229 else
1230 return newfloatobject(ceil(x*f - 0.5) / f);
1231}
1232
1233static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001234builtin_str(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:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001241 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001242 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001243}
1244
1245static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001246builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001247 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001248 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001249{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001250 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001251 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001252
1253 if (!newgetargs(args, "O:tuple", &v))
1254 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001255 if (is_tupleobject(v)) {
1256 INCREF(v);
1257 return v;
1258 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001259 if (is_listobject(v))
1260 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001261 if (is_stringobject(v)) {
1262 int n = getstringsize(v);
1263 object *t = newtupleobject(n);
1264 if (t != NULL) {
1265 int i;
1266 char *p = getstringvalue(v);
1267 for (i = 0; i < n; i++) {
1268 object *item = newsizedstringobject(p+i, 1);
1269 if (item == NULL) {
1270 DECREF(t);
1271 t = NULL;
1272 break;
1273 }
1274 settupleitem(t, i, item);
1275 }
1276 }
1277 return t;
1278 }
1279 /* Generic sequence object */
1280 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1281 int n = (*sqf->sq_length)(v);
1282 int i;
1283 object *t;
1284 if (n < 0)
1285 return NULL;
1286 t = newtupleobject(n);
1287 if (t == NULL)
1288 return NULL;
1289 for (i = 0; i < n; i++) {
1290 object *item = (*sqf->sq_item)(v, i);
1291 if (item == NULL) {
1292 DECREF(t);
1293 t = NULL;
1294 break;
1295 }
1296 settupleitem(t, i, item);
1297 }
1298 /* XXX Should support indefinite-length sequences */
1299 return t;
1300 }
1301 /* None of the above */
1302 err_setstr(TypeError, "tuple() argument must be a sequence");
1303 return NULL;
1304}
1305
1306static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001307builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001308 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001309 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001310{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001311 object *v;
1312
1313 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001314 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001315 v = (object *)v->ob_type;
1316 INCREF(v);
1317 return v;
1318}
1319
Guido van Rossum2d951851994-08-29 12:52:16 +00001320static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001321builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001322 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001323 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001324{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001325 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001326 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001327
1328 if (!newgetargs(args, "|O:vars", &v))
1329 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001330 if (v == NULL) {
1331 d = getlocals();
1332 INCREF(d);
1333 }
1334 else {
1335 d = getattr(v, "__dict__");
1336 if (d == NULL) {
1337 err_setstr(TypeError,
1338 "vars() argument must have __dict__ attribute");
1339 return NULL;
1340 }
1341 }
1342 return d;
1343}
1344
Guido van Rossum3f5da241990-12-20 15:06:42 +00001345static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001346 {"__import__", builtin___import__, 1},
1347 {"abs", builtin_abs, 1},
1348 {"apply", builtin_apply, 1},
1349 {"callable", builtin_callable, 1},
1350 {"chr", builtin_chr, 1},
1351 {"cmp", builtin_cmp, 1},
1352 {"coerce", builtin_coerce, 1},
1353 {"compile", builtin_compile, 1},
1354 {"delattr", builtin_delattr, 1},
1355 {"dir", builtin_dir, 1},
1356 {"divmod", builtin_divmod, 1},
1357 {"eval", builtin_eval, 1},
1358 {"execfile", builtin_execfile, 1},
1359 {"filter", builtin_filter, 1},
1360 {"float", builtin_float, 1},
1361 {"getattr", builtin_getattr, 1},
1362 {"hasattr", builtin_hasattr, 1},
1363 {"hash", builtin_hash, 1},
1364 {"hex", builtin_hex, 1},
1365 {"id", builtin_id, 1},
1366 {"input", builtin_input, 1},
1367 {"int", builtin_int, 1},
1368 {"len", builtin_len, 1},
1369 {"long", builtin_long, 1},
1370 {"map", builtin_map, 1},
1371 {"max", builtin_max, 1},
1372 {"min", builtin_min, 1},
1373 {"oct", builtin_oct, 1},
1374 {"open", builtin_open, 1},
1375 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001376 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001377 {"range", builtin_range, 1},
1378 {"raw_input", builtin_raw_input, 1},
1379 {"reduce", builtin_reduce, 1},
1380 {"reload", builtin_reload, 1},
1381 {"repr", builtin_repr, 1},
1382 {"round", builtin_round, 1},
1383 {"setattr", builtin_setattr, 1},
1384 {"str", builtin_str, 1},
1385 {"tuple", builtin_tuple, 1},
1386 {"type", builtin_type, 1},
1387 {"vars", builtin_vars, 1},
1388 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001389 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001390};
1391
1392static object *builtin_dict;
1393
1394object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001395getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001396{
Guido van Rossum6135a871995-01-09 17:53:26 +00001397 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001398}
1399
1400/* Predefined exceptions */
1401
Guido van Rossum25831651993-05-19 14:50:45 +00001402object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001403object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001404object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001405object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001406object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001407object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001408object *IndexError;
1409object *KeyError;
1410object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001411object *MemoryError;
1412object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001413object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001414object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001415object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001416object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001417object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001418object *TypeError;
1419object *ValueError;
1420object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001421
Guido van Rossum3f5da241990-12-20 15:06:42 +00001422static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001423newstdexception(name)
1424 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001425{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001426 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001427 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1428 fatal("no mem for new standard exception");
1429 return v;
1430}
1431
1432static void
1433initerrors()
1434{
Guido van Rossum25831651993-05-19 14:50:45 +00001435 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001436 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001437 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001438 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001439 IOError = newstdexception("IOError");
1440 ImportError = newstdexception("ImportError");
1441 IndexError = newstdexception("IndexError");
1442 KeyError = newstdexception("KeyError");
1443 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001444 MemoryError = newstdexception("MemoryError");
1445 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001446 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001447 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001448 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001449 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001450 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001451 TypeError = newstdexception("TypeError");
1452 ValueError = newstdexception("ValueError");
1453 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001454}
1455
1456void
1457initbuiltin()
1458{
1459 object *m;
Guido van Rossum89b33251993-10-22 14:26:06 +00001460 m = initmodule("__builtin__", builtin_methods);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001461 builtin_dict = getmoduledict(m);
1462 INCREF(builtin_dict);
1463 initerrors();
1464 (void) dictinsert(builtin_dict, "None", None);
1465}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001466
1467/* Coerce two numeric types to the "larger" one.
1468 Increment the reference count on each argument.
1469 Return -1 and raise an exception if no coercion is possible
1470 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +00001471*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001472
1473int
1474coerce(pv, pw)
1475 object **pv, **pw;
1476{
1477 register object *v = *pv;
1478 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001479 int res;
1480
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001481 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001482 INCREF(v);
1483 INCREF(w);
1484 return 0;
1485 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001486 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
1487 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
1488 if (res <= 0)
1489 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001490 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001491 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
1492 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
1493 if (res <= 0)
1494 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001495 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001496 err_setstr(TypeError, "number coercion failed");
1497 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001498}
Guido van Rossum12d12c51993-10-26 17:58:25 +00001499
1500
Guido van Rossume77a7571993-11-03 15:01:26 +00001501/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001502
1503static object *
1504filtertuple(func, tuple)
1505 object *func;
1506 object *tuple;
1507{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001508 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001509 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001510 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001511
Guido van Rossum2586bf01993-11-01 16:21:44 +00001512 if ((result = newtupleobject(len)) == NULL)
1513 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001514
Guido van Rossum12d12c51993-10-26 17:58:25 +00001515 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001516 object *item, *good;
1517 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001518
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001519 if ((item = gettupleitem(tuple, i)) == NULL)
1520 goto Fail_1;
1521 if (func == None) {
1522 INCREF(item);
1523 good = item;
1524 }
1525 else {
1526 object *arg = mkvalue("(O)", item);
1527 if (arg == NULL)
1528 goto Fail_1;
1529 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001530 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001531 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001532 goto Fail_1;
1533 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001534 ok = testbool(good);
1535 DECREF(good);
1536 if (ok) {
1537 INCREF(item);
1538 if (settupleitem(result, j++, item) < 0)
1539 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001540 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001541 }
1542
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001543 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001544 return NULL;
1545
Guido van Rossum12d12c51993-10-26 17:58:25 +00001546 return result;
1547
Guido van Rossum12d12c51993-10-26 17:58:25 +00001548Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001549 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001550 return NULL;
1551}
1552
1553
Guido van Rossume77a7571993-11-03 15:01:26 +00001554/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001555
1556static object *
1557filterstring(func, strobj)
1558 object *func;
1559 object *strobj;
1560{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001561 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001562 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001563 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001564
Guido van Rossum2586bf01993-11-01 16:21:44 +00001565 if (func == None) {
1566 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001567 INCREF(strobj);
1568 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001569 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001570 if ((result = newsizedstringobject(NULL, len)) == NULL)
1571 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001572
Guido van Rossum12d12c51993-10-26 17:58:25 +00001573 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001574 object *item, *arg, *good;
1575 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001576
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001577 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1578 if (item == NULL)
1579 goto Fail_1;
1580 arg = mkvalue("(O)", item);
1581 DECREF(item);
1582 if (arg == NULL)
1583 goto Fail_1;
1584 good = call_object(func, arg);
1585 DECREF(arg);
1586 if (good == NULL)
1587 goto Fail_1;
1588 ok = testbool(good);
1589 DECREF(good);
1590 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001591 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001592 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001593 }
1594
Guido van Rossum12d12c51993-10-26 17:58:25 +00001595 if (resizestring(&result, j) < 0)
1596 return NULL;
1597
Guido van Rossum12d12c51993-10-26 17:58:25 +00001598 return result;
1599
Guido van Rossum12d12c51993-10-26 17:58:25 +00001600Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001601 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001602 return NULL;
1603}