blob: dca31acd39c1c4103a35743d12ea13b22e38d896 [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
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000284#ifndef WITHOUT_COMPLEX
285
286static object *
287builtin_complex(self, args)
288 object *self;
289 object *args;
290{
291 object *r, *i;
292 number_methods *nbr, *nbi;
293 complex cr, ci;
294
295 i = NULL;
296 if (!newgetargs(args, "O|O:complex", &r, &i))
297 return NULL;
298 if ((nbr = r->ob_type->tp_as_number) == NULL ||
299 nbr->nb_float == NULL || (i != NULL &&
300 ((nbi = i->ob_type->tp_as_number) == NULL ||
301 nbi->nb_float == NULL))) {
302 err_setstr(TypeError,
303 "complex() argument can't be converted to complex");
304 return NULL;
305 }
306 if (is_complexobject(r))
307 cr = ((complexobject*)r)->cval;
308 else {
309 cr.real = getfloatvalue((*nbr->nb_float)(r));
310 cr.imag = 0.;
311 }
312 if (i == NULL) {
313 ci.real = 0.;
314 ci.imag = 0.;
315 }
316 else if (is_complexobject(i))
317 ci = ((complexobject*)i)->cval;
318 else {
319 ci.real = getfloatvalue((*nbi->nb_float)(i));
320 ci.imag = 0.;
321 }
322 cr.real -= ci.imag;
323 cr.imag += ci.real;
324 return newcomplexobject(cr);
325}
326
327#endif
328
Guido van Rossum5b722181993-03-30 17:46:03 +0000329static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000330builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000331 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000332 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000333{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000334 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000335 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000336
337 if (!newgetargs(args, "|O:dir", &v))
338 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000339 if (v == NULL) {
340 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000341 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000342 }
343 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000344 d = getattr(v, "__dict__");
345 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000346 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000347 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000348 return NULL;
349 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000350 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000351 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000352 v = getdictkeys(d);
353 if (sortlist(v) != 0) {
354 DECREF(v);
355 v = NULL;
356 }
357 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000358 else {
359 v = newlistobject(0);
360 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000361 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000362 return v;
363}
364
365static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000366do_divmod(v, w)
367 object *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000368{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000369 object *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000370
Guido van Rossum180d7b41994-09-29 09:45:57 +0000371 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000372 return instancebinop(v, w, "__divmod__", "__rdivmod__",
373 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000374 if (v->ob_type->tp_as_number == NULL ||
375 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000376 err_setstr(TypeError,
377 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000378 return NULL;
379 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000380 if (coerce(&v, &w) != 0)
381 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000382 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000383 DECREF(v);
384 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000385 return res;
386}
387
388static object *
389builtin_divmod(self, args)
390 object *self;
391 object *args;
392{
393 object *v, *w;
394
395 if (!newgetargs(args, "OO:divmod", &v, &w))
396 return NULL;
397 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000398}
399
400static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000401builtin_eval(self, args)
402 object *self;
403 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000404{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000405 object *cmd;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000406 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000407 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000408
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000409 if (!newgetargs(args, "O|O!O!:eval",
410 &cmd,
411 &Mappingtype, &globals,
412 &Mappingtype, &locals))
413 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000414 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000415 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000416 if (locals == None)
417 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000418 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000419 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000420 locals = globals;
421 if (dictlookup(globals, "__builtins__") == NULL) {
422 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
423 return NULL;
424 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425 if (is_codeobject(cmd))
Guido van Rossum681d79a1995-07-18 14:51:37 +0000426 return eval_code((codeobject *) cmd, globals, locals);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000427 if (!is_stringobject(cmd)) {
428 err_setstr(TypeError,
429 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000430 return NULL;
431 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432 str = getstringvalue(cmd);
433 if (strlen(str) != getstringsize(cmd)) {
434 err_setstr(ValueError,
435 "embedded '\\0' in string arg");
436 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000437 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000438 while (*str == ' ' || *str == '\t')
439 str++;
440 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000441}
442
443static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000444builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000445 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000446 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000447{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000448 char *filename;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000449 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000451 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000452
453 if (!newgetargs(args, "s|O!O!:execfile",
454 &filename,
455 &Mappingtype, &globals,
456 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000457 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000458 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000459 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000460 if (locals == None)
461 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000462 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000463 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000464 locals = globals;
465 if (dictlookup(globals, "__builtins__") == NULL) {
466 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
467 return NULL;
468 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000469 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000470 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000471 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000472 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000473 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000474 return NULL;
475 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000476 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000477 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000478 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000479 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000480 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000481}
482
483static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000484builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000485 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000486 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000487{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000488 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000489 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000490
491 if (!newgetargs(args, "O:float", &v))
492 return NULL;
493 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000494 nb->nb_float == NULL) {
495 err_setstr(TypeError,
496 "float() argument can't be converted to float");
497 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000498 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000499 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000500}
501
502static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000503builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000504 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000505 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000506{
Guido van Rossum94390a41992-08-14 15:14:30 +0000507 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000508 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000509
510 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000511 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000512 return getattro(v, name);
513}
514
515static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000516builtin_globals(self, args)
517 object *self;
518 object *args;
519{
520 object *d;
521
522 if (!newgetargs(args, ""))
523 return NULL;
524 d = getglobals();
525 INCREF(d);
526 return d;
527}
528
529static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000530builtin_hasattr(self, args)
531 object *self;
532 object *args;
533{
534 object *v;
535 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000536
537 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000538 return NULL;
539 v = getattro(v, name);
540 if (v == NULL) {
541 err_clear();
542 return newintobject(0L);
543 }
544 DECREF(v);
545 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000546}
547
548static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000549builtin_id(self, args)
550 object *self;
551 object *args;
552{
553 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000554
555 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000556 return NULL;
557 return newintobject((long)v);
558}
559
560static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000561builtin_map(self, args)
562 object *self;
563 object *args;
564{
565 typedef struct {
566 object *seq;
567 sequence_methods *sqf;
568 int len;
569 } sequence;
570
571 object *func, *result;
572 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000573 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000574 register int i, j;
575
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000576 n = gettuplesize(args);
577 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000578 err_setstr(TypeError, "map() requires at least two args");
579 return NULL;
580 }
581
582 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000583 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000584
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000585 if ((seqs = NEW(sequence, n)) == NULL) {
586 err_nomem();
587 goto Fail_2;
588 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000589
Guido van Rossum2d951851994-08-29 12:52:16 +0000590 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000591 int curlen;
592
593 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
594 goto Fail_2;
595
596 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
597 static char errmsg[] =
598 "argument %d to map() must be a sequence object";
599 char errbuf[sizeof(errmsg) + 3];
600
601 sprintf(errbuf, errmsg, i+2);
602 err_setstr(TypeError, errbuf);
603 goto Fail_2;
604 }
605
606 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
607 goto Fail_2;
608
609 if (curlen > len)
610 len = curlen;
611 }
612
613 if ((result = (object *) newlistobject(len)) == NULL)
614 goto Fail_2;
615
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000616 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000617 for (i = 0; ; ++i) {
Guido van Rossum32120311995-07-10 13:52:21 +0000618 object *alist, *item, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000619 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000620
Guido van Rossum2d951851994-08-29 12:52:16 +0000621 if (func == None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000622 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000623 else {
Guido van Rossum32120311995-07-10 13:52:21 +0000624 if ((alist = newtupleobject(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000625 goto Fail_1;
626 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000627
628 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000629 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000630 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000631 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000632 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000633 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000634 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000635 if (item == NULL) {
636 if (i < sqp->len)
637 goto Fail_0;
638 if (err_occurred() == IndexError) {
639 err_clear();
640 INCREF(None);
641 item = None;
642 sqp->len = -1;
643 }
644 else {
645 goto Fail_0;
646 }
647 }
648 else
649 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000650
Guido van Rossum12d12c51993-10-26 17:58:25 +0000651 }
Guido van Rossum32120311995-07-10 13:52:21 +0000652 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +0000653 break;
Guido van Rossum32120311995-07-10 13:52:21 +0000654 if (settupleitem(alist, j, item) < 0) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000655 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000656 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000657 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000658 continue;
659
660 Fail_0:
Guido van Rossum32120311995-07-10 13:52:21 +0000661 XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000662 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000663 }
664
Guido van Rossum32120311995-07-10 13:52:21 +0000665 if (!alist)
666 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000667
668 if (!any) {
Guido van Rossum32120311995-07-10 13:52:21 +0000669 DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000670 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000671 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000672
673 if (func == None)
Guido van Rossum32120311995-07-10 13:52:21 +0000674 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000675 else {
Guido van Rossum32120311995-07-10 13:52:21 +0000676 value = call_object(func, alist);
677 DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000678 if (value == NULL)
679 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000680 }
681 if (i >= len) {
682 if (addlistitem(result, value) < 0)
683 goto Fail_1;
684 }
685 else {
686 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000687 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000688 }
689 }
690
Guido van Rossum2d951851994-08-29 12:52:16 +0000691 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000692 return result;
693
Guido van Rossum12d12c51993-10-26 17:58:25 +0000694Fail_1:
695 DECREF(result);
696Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000697 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000698 return NULL;
699}
700
701static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000702builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000703 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000704 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000705{
Guido van Rossum94390a41992-08-14 15:14:30 +0000706 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000707 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000708 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000709
710 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000711 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000712 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000713 return NULL;
714 INCREF(None);
715 return None;
716}
717
718static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000719builtin_delattr(self, args)
720 object *self;
721 object *args;
722{
723 object *v;
724 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000725
726 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000727 return NULL;
728 if (setattro(v, name, (object *)NULL) != 0)
729 return NULL;
730 INCREF(None);
731 return None;
732}
733
734static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000735builtin_hash(self, args)
736 object *self;
737 object *args;
738{
739 object *v;
740 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000741
742 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000743 return NULL;
744 x = hashobject(v);
745 if (x == -1)
746 return NULL;
747 return newintobject(x);
748}
749
750static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000751builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000752 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000753 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000754{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000755 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000756 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000757
758 if (!newgetargs(args, "O:hex", &v))
759 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000760
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000761 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000762 nb->nb_hex == NULL) {
763 err_setstr(TypeError,
764 "hex() argument can't be converted to hex");
765 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000766 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000767 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000768}
769
Guido van Rossum3165fe61992-09-25 21:59:05 +0000770static object *builtin_raw_input PROTO((object *, object *));
771
Guido van Rossum006bcd41991-10-24 14:54:44 +0000772static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000773builtin_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000774 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000775 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000776{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000777 object *line;
778 char *str;
779 object *res;
Guido van Rossum6135a871995-01-09 17:53:26 +0000780 object *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000781
782 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000783 if (line == NULL)
784 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000785 if (!getargs(line, "s;embedded '\\0' in input line", &str))
786 return NULL;
787 while (*str == ' ' || *str == '\t')
788 str++;
Guido van Rossum6135a871995-01-09 17:53:26 +0000789 globals = getglobals();
790 locals = getlocals();
791 if (dictlookup(globals, "__builtins__") == NULL) {
792 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
793 return NULL;
794 }
795 res = run_string(str, eval_input, globals, locals);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000796 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000797 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000798}
799
800static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000801builtin_int(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000802 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000803 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000804{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000805 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000806 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807
808 if (!newgetargs(args, "O:int", &v))
809 return NULL;
810 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000811 nb->nb_int == NULL) {
812 err_setstr(TypeError,
813 "int() argument can't be converted to int");
814 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000815 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000816 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000817}
818
819static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000820builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000821 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000823{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000824 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000825 long len;
826 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000827
828 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000829 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000830 tp = v->ob_type;
831 if (tp->tp_as_sequence != NULL) {
832 len = (*tp->tp_as_sequence->sq_length)(v);
833 }
834 else if (tp->tp_as_mapping != NULL) {
835 len = (*tp->tp_as_mapping->mp_length)(v);
836 }
837 else {
838 err_setstr(TypeError, "len() of unsized object");
839 return NULL;
840 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000841 if (len < 0)
842 return NULL;
843 else
844 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000845}
846
847static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000848builtin_locals(self, args)
849 object *self;
850 object *args;
851{
852 object *d;
853
854 if (!newgetargs(args, ""))
855 return NULL;
856 d = getlocals();
857 INCREF(d);
858 return d;
859}
860
861static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000862builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000863 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000864 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000865{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000866 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000867 number_methods *nb;
868
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000869 if (!newgetargs(args, "O:long", &v))
870 return NULL;
871 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000872 nb->nb_long == NULL) {
873 err_setstr(TypeError,
874 "long() argument can't be converted to long");
875 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000876 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000877 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000878}
879
880static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000881min_max(args, sign)
882 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000883 int sign;
884{
Guido van Rossum2d951851994-08-29 12:52:16 +0000885 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000886 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000887 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000888
889 if (gettuplesize(args) > 1)
890 v = args;
891 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000892 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000893 sq = v->ob_type->tp_as_sequence;
894 if (sq == NULL) {
895 err_setstr(TypeError, "min() or max() of non-sequence");
896 return NULL;
897 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000898 w = NULL;
899 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000900 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000901 if (x == NULL) {
902 if (err_occurred() == IndexError) {
903 err_clear();
904 break;
905 }
906 XDECREF(w);
907 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000908 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000909 if (w == NULL)
910 w = x;
911 else {
912 if (cmpobject(x, w) * sign > 0) {
913 DECREF(w);
914 w = x;
915 }
916 else
917 DECREF(x);
918 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000919 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000920 if (w == NULL)
921 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000922 return w;
923}
924
925static object *
926builtin_min(self, v)
927 object *self;
928 object *v;
929{
930 return min_max(v, -1);
931}
932
933static object *
934builtin_max(self, v)
935 object *self;
936 object *v;
937{
938 return min_max(v, 1);
939}
940
941static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000942builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000943 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000944 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000945{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000946 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000947 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000948
949 if (!newgetargs(args, "O:oct", &v))
950 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000951 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
952 nb->nb_oct == NULL) {
953 err_setstr(TypeError,
954 "oct() argument can't be converted to oct");
955 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000956 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000957 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000958}
959
960static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000961builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000962 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000963 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000964{
Guido van Rossum2d951851994-08-29 12:52:16 +0000965 char *name;
966 char *mode = "r";
967 int bufsize = -1;
968 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000969
970 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000971 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000972 f = newfileobject(name, mode);
973 if (f != NULL)
974 setfilebufsize(f, bufsize);
975 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000976}
977
978static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000979builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000980 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000981 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000982{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000983 char c;
984
985 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000986 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000987 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000988}
989
990static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000991do_pow(v, w)
992 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +0000993{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000994 object *res;
995 if (is_instanceobject(v) || is_instanceobject(w))
996 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000997 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000998 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000999 err_setstr(TypeError, "pow() requires numeric arguments");
1000 return NULL;
1001 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001002 if (
1003#ifndef WITHOUT_COMPLEX
1004 !is_complexobject(v) &&
1005#endif
1006 is_floatobject(w) && getfloatvalue(v) < 0.0) {
Guido van Rossum8a1e8eb1995-02-18 14:51:32 +00001007 if (!err_occurred())
1008 err_setstr(ValueError, "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +00001009 return NULL;
1010 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001011 if (coerce(&v, &w) != 0)
1012 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001013 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001014 DECREF(v);
1015 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001016 return res;
1017}
1018
1019static object *
1020builtin_pow(self, args)
1021 object *self;
1022 object *args;
1023{
1024 object *v, *w, *z = None, *res;
1025 object *v1, *z1, *w2, *z2;
1026
1027 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
1028 return NULL;
1029 if (z == None)
1030 return do_pow(v, w);
1031 /* XXX The ternary version doesn't do class instance coercions */
1032 if (is_instanceobject(v))
1033 return v->ob_type->tp_as_number->nb_power(v, w, z);
1034 if (v->ob_type->tp_as_number == NULL ||
1035 z->ob_type->tp_as_number == NULL ||
1036 w->ob_type->tp_as_number == NULL) {
1037 err_setstr(TypeError, "pow() requires numeric arguments");
1038 return NULL;
1039 }
1040 if (coerce(&v, &w) != 0)
1041 return NULL;
1042 res = NULL;
1043 v1 = v;
1044 z1 = z;
1045 if (coerce(&v1, &z1) != 0)
1046 goto error2;
1047 w2 = w;
1048 z2 = z1;
1049 if (coerce(&w2, &z2) != 0)
1050 goto error1;
1051 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
1052 DECREF(w2);
1053 DECREF(z2);
1054 error1:
1055 DECREF(v1);
1056 DECREF(z1);
1057 error2:
1058 DECREF(v);
1059 DECREF(w);
1060 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001061}
1062
1063static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001064builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001065 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001066 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001067{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001068 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001069 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001070 object *v;
1071
1072 if (gettuplesize(args) <= 1) {
1073 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001074 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001075 &ihigh))
1076 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001077 }
1078 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001079 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001080 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001081 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001082 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001083 }
1084 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001085 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001086 return NULL;
1087 }
1088 /* XXX ought to check overflow of subtraction */
1089 if (istep > 0)
1090 n = (ihigh - ilow + istep - 1) / istep;
1091 else
1092 n = (ihigh - ilow + istep + 1) / istep;
1093 if (n < 0)
1094 n = 0;
1095 v = newlistobject(n);
1096 if (v == NULL)
1097 return NULL;
1098 for (i = 0; i < n; i++) {
1099 object *w = newintobject(ilow);
1100 if (w == NULL) {
1101 DECREF(v);
1102 return NULL;
1103 }
1104 setlistitem(v, i, w);
1105 ilow += istep;
1106 }
1107 return v;
1108}
1109
1110static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001111builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001112 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001113 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001114{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001115 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001116 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001117
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001118 if (gettuplesize(args) <= 1) {
1119 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001120 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001121 &ihigh))
1122 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001123 }
1124 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001125 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001126 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001127 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001128 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001129 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001130 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001131 err_setstr(ValueError, "zero step for xrange()");
1132 return NULL;
1133 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001134 /* XXX ought to check overflow of subtraction */
1135 if (istep > 0)
1136 n = (ihigh - ilow + istep - 1) / istep;
1137 else
1138 n = (ihigh - ilow + istep + 1) / istep;
1139 if (n < 0)
1140 n = 0;
1141 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001142}
1143
Guido van Rossum872537c1995-07-07 22:43:42 +00001144extern char *my_readline PROTO((char *));
1145
Guido van Rossum12d12c51993-10-26 17:58:25 +00001146static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001147builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001148 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001149 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001150{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001151 object *v = NULL;
1152 object *f;
1153
1154 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001155 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001156 if (getfilefile(sysget("stdin")) == stdin &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001157 getfilefile(sysget("stdout")) == stdout &&
1158 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum872537c1995-07-07 22:43:42 +00001159 object *po;
1160 char *prompt;
1161 char *s;
1162 object *result;
1163 if (v != NULL) {
1164 po = strobject(v);
1165 if (po == NULL)
1166 return NULL;
1167 prompt = getstringvalue(po);
1168 }
1169 else {
1170 po = NULL;
1171 prompt = "";
1172 }
1173 s = my_readline(prompt);
1174 XDECREF(po);
1175 if (s == NULL) {
1176 err_set(KeyboardInterrupt);
1177 return NULL;
1178 }
1179 if (*s == '\0') {
1180 err_set(EOFError);
1181 result = NULL;
1182 }
1183 else { /* strip trailing '\n' */
1184 result = newsizedstringobject(s, strlen(s)-1);
1185 }
1186 free(s);
1187 return result;
1188 }
Guido van Rossum90933611991-06-07 16:10:43 +00001189 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001190 f = sysget("stdout");
1191 if (f == NULL) {
1192 err_setstr(RuntimeError, "lost sys.stdout");
1193 return NULL;
1194 }
1195 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001196 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001197 return NULL;
1198 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001199 f = sysget("stdin");
1200 if (f == NULL) {
1201 err_setstr(RuntimeError, "lost sys.stdin");
1202 return NULL;
1203 }
1204 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001205}
1206
1207static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001208builtin_reduce(self, args)
1209 object *self;
1210 object *args;
1211{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001212 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001213 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001214 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001215
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001216 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1217 return NULL;
1218 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001219 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001220
1221 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1222 err_setstr(TypeError,
1223 "2nd argument to reduce() must be a sequence object");
1224 return NULL;
1225 }
1226
Guido van Rossum12d12c51993-10-26 17:58:25 +00001227 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001228 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001229
Guido van Rossum2d951851994-08-29 12:52:16 +00001230 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001231 object *op2;
1232
1233 if (args->ob_refcnt > 1) {
1234 DECREF(args);
1235 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001236 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001237 }
1238
Guido van Rossum2d951851994-08-29 12:52:16 +00001239 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1240 if (err_occurred() == IndexError) {
1241 err_clear();
1242 break;
1243 }
1244 goto Fail;
1245 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001246
Guido van Rossum2d951851994-08-29 12:52:16 +00001247 if (result == NULL)
1248 result = op2;
1249 else {
1250 settupleitem(args, 0, result);
1251 settupleitem(args, 1, op2);
1252 if ((result = call_object(func, args)) == NULL)
1253 goto Fail;
1254 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001255 }
1256
1257 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001258
Guido van Rossum2d951851994-08-29 12:52:16 +00001259 if (result == NULL)
1260 err_setstr(TypeError,
1261 "reduce of empty sequence with no initial value");
1262
Guido van Rossum12d12c51993-10-26 17:58:25 +00001263 return result;
1264
Guido van Rossum2d951851994-08-29 12:52:16 +00001265Fail:
1266 XDECREF(args);
1267 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001268 return NULL;
1269}
1270
1271static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001272builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001273 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001274 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001275{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001276 object *v;
1277
1278 if (!newgetargs(args, "O:reload", &v))
1279 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001280 return reload_module(v);
1281}
1282
1283static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001284builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001285 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001286 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001287{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001288 object *v;
1289
1290 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001291 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001292 return reprobject(v);
1293}
1294
1295static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001296builtin_round(self, args)
1297 object *self;
1298 object *args;
1299{
1300 extern double floor PROTO((double));
1301 extern double ceil PROTO((double));
1302 double x;
1303 double f;
1304 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001305 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001306
1307 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001308 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001309 f = 1.0;
1310 for (i = ndigits; --i >= 0; )
1311 f = f*10.0;
1312 for (i = ndigits; ++i <= 0; )
1313 f = f*0.1;
1314 if (x >= 0.0)
1315 return newfloatobject(floor(x*f + 0.5) / f);
1316 else
1317 return newfloatobject(ceil(x*f - 0.5) / f);
1318}
1319
1320static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001321builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001322 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001323 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001324{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001325 object *v;
1326
1327 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001328 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001329 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001330}
1331
1332static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001333builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001334 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001335 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001336{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001337 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001338 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001339
1340 if (!newgetargs(args, "O:tuple", &v))
1341 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001342 if (is_tupleobject(v)) {
1343 INCREF(v);
1344 return v;
1345 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001346 if (is_listobject(v))
1347 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001348 if (is_stringobject(v)) {
1349 int n = getstringsize(v);
1350 object *t = newtupleobject(n);
1351 if (t != NULL) {
1352 int i;
1353 char *p = getstringvalue(v);
1354 for (i = 0; i < n; i++) {
1355 object *item = newsizedstringobject(p+i, 1);
1356 if (item == NULL) {
1357 DECREF(t);
1358 t = NULL;
1359 break;
1360 }
1361 settupleitem(t, i, item);
1362 }
1363 }
1364 return t;
1365 }
1366 /* Generic sequence object */
1367 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1368 int n = (*sqf->sq_length)(v);
1369 int i;
1370 object *t;
1371 if (n < 0)
1372 return NULL;
1373 t = newtupleobject(n);
1374 if (t == NULL)
1375 return NULL;
1376 for (i = 0; i < n; i++) {
1377 object *item = (*sqf->sq_item)(v, i);
1378 if (item == NULL) {
1379 DECREF(t);
1380 t = NULL;
1381 break;
1382 }
1383 settupleitem(t, i, item);
1384 }
1385 /* XXX Should support indefinite-length sequences */
1386 return t;
1387 }
1388 /* None of the above */
1389 err_setstr(TypeError, "tuple() argument must be a sequence");
1390 return NULL;
1391}
1392
1393static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001394builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001395 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001396 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001397{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001398 object *v;
1399
1400 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001401 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001402 v = (object *)v->ob_type;
1403 INCREF(v);
1404 return v;
1405}
1406
Guido van Rossum2d951851994-08-29 12:52:16 +00001407static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001408builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001409 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001410 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001411{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001412 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001413 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001414
1415 if (!newgetargs(args, "|O:vars", &v))
1416 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001417 if (v == NULL) {
1418 d = getlocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001419 if (d == NULL) {
1420 if (!err_occurred())
1421 err_setstr(SystemError, "no locals!?");
1422 }
1423 else
1424 INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001425 }
1426 else {
1427 d = getattr(v, "__dict__");
1428 if (d == NULL) {
1429 err_setstr(TypeError,
1430 "vars() argument must have __dict__ attribute");
1431 return NULL;
1432 }
1433 }
1434 return d;
1435}
1436
Guido van Rossum3f5da241990-12-20 15:06:42 +00001437static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001438 {"__import__", builtin___import__, 1},
1439 {"abs", builtin_abs, 1},
1440 {"apply", builtin_apply, 1},
1441 {"callable", builtin_callable, 1},
1442 {"chr", builtin_chr, 1},
1443 {"cmp", builtin_cmp, 1},
1444 {"coerce", builtin_coerce, 1},
1445 {"compile", builtin_compile, 1},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001446#ifndef WITHOUT_COMPLEX
1447 {"complex", builtin_complex, 1},
1448#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001449 {"delattr", builtin_delattr, 1},
1450 {"dir", builtin_dir, 1},
1451 {"divmod", builtin_divmod, 1},
1452 {"eval", builtin_eval, 1},
1453 {"execfile", builtin_execfile, 1},
1454 {"filter", builtin_filter, 1},
1455 {"float", builtin_float, 1},
1456 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001457 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001458 {"hasattr", builtin_hasattr, 1},
1459 {"hash", builtin_hash, 1},
1460 {"hex", builtin_hex, 1},
1461 {"id", builtin_id, 1},
1462 {"input", builtin_input, 1},
1463 {"int", builtin_int, 1},
1464 {"len", builtin_len, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001465 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001466 {"long", builtin_long, 1},
1467 {"map", builtin_map, 1},
1468 {"max", builtin_max, 1},
1469 {"min", builtin_min, 1},
1470 {"oct", builtin_oct, 1},
1471 {"open", builtin_open, 1},
1472 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001473 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001474 {"range", builtin_range, 1},
1475 {"raw_input", builtin_raw_input, 1},
1476 {"reduce", builtin_reduce, 1},
1477 {"reload", builtin_reload, 1},
1478 {"repr", builtin_repr, 1},
1479 {"round", builtin_round, 1},
1480 {"setattr", builtin_setattr, 1},
1481 {"str", builtin_str, 1},
1482 {"tuple", builtin_tuple, 1},
1483 {"type", builtin_type, 1},
1484 {"vars", builtin_vars, 1},
1485 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001486 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001487};
1488
Guido van Rossum0865dd91995-01-17 16:30:22 +00001489static object *builtin_mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001490static object *builtin_dict;
1491
1492object *
Guido van Rossum0865dd91995-01-17 16:30:22 +00001493getbuiltinmod()
1494{
1495 return builtin_mod;
1496}
1497
1498object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001499getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001500{
Guido van Rossum6135a871995-01-09 17:53:26 +00001501 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001502}
1503
1504/* Predefined exceptions */
1505
Guido van Rossum25831651993-05-19 14:50:45 +00001506object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001507object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001508object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001509object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001510object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001511object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001512object *IndexError;
1513object *KeyError;
1514object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001515object *MemoryError;
1516object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001517object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001518object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001519object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001520object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001521object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001522object *TypeError;
1523object *ValueError;
1524object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001525
Guido van Rossum3f5da241990-12-20 15:06:42 +00001526static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001527newstdexception(name)
1528 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001529{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001530 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001531 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1532 fatal("no mem for new standard exception");
1533 return v;
1534}
1535
1536static void
1537initerrors()
1538{
Guido van Rossum25831651993-05-19 14:50:45 +00001539 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001540 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001541 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001542 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001543 IOError = newstdexception("IOError");
1544 ImportError = newstdexception("ImportError");
1545 IndexError = newstdexception("IndexError");
1546 KeyError = newstdexception("KeyError");
1547 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001548 MemoryError = newstdexception("MemoryError");
1549 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001550 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001551 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001552 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001553 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001554 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001555 TypeError = newstdexception("TypeError");
1556 ValueError = newstdexception("ValueError");
1557 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001558}
1559
1560void
1561initbuiltin()
1562{
Guido van Rossum0865dd91995-01-17 16:30:22 +00001563 builtin_mod = initmodule("__builtin__", builtin_methods);
1564 builtin_dict = getmoduledict(builtin_mod);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001565 INCREF(builtin_dict);
1566 initerrors();
1567 (void) dictinsert(builtin_dict, "None", None);
1568}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001569
Guido van Rossum12d12c51993-10-26 17:58:25 +00001570
Guido van Rossume77a7571993-11-03 15:01:26 +00001571/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001572
1573static object *
1574filtertuple(func, tuple)
1575 object *func;
1576 object *tuple;
1577{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001578 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001579 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001580 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001581
Guido van Rossumb7b45621995-08-04 04:07:45 +00001582 if (len == 0) {
1583 INCREF(tuple);
1584 return tuple;
1585 }
1586
Guido van Rossum2586bf01993-11-01 16:21:44 +00001587 if ((result = newtupleobject(len)) == NULL)
1588 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001589
Guido van Rossum12d12c51993-10-26 17:58:25 +00001590 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001591 object *item, *good;
1592 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001593
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001594 if ((item = gettupleitem(tuple, i)) == NULL)
1595 goto Fail_1;
1596 if (func == None) {
1597 INCREF(item);
1598 good = item;
1599 }
1600 else {
1601 object *arg = mkvalue("(O)", item);
1602 if (arg == NULL)
1603 goto Fail_1;
1604 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001605 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001606 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001607 goto Fail_1;
1608 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001609 ok = testbool(good);
1610 DECREF(good);
1611 if (ok) {
1612 INCREF(item);
1613 if (settupleitem(result, j++, item) < 0)
1614 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001615 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001616 }
1617
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001618 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001619 return NULL;
1620
Guido van Rossum12d12c51993-10-26 17:58:25 +00001621 return result;
1622
Guido van Rossum12d12c51993-10-26 17:58:25 +00001623Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001624 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001625 return NULL;
1626}
1627
1628
Guido van Rossume77a7571993-11-03 15:01:26 +00001629/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001630
1631static object *
1632filterstring(func, strobj)
1633 object *func;
1634 object *strobj;
1635{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001636 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001637 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001638 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001639
Guido van Rossum2586bf01993-11-01 16:21:44 +00001640 if (func == None) {
1641 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001642 INCREF(strobj);
1643 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001644 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001645 if ((result = newsizedstringobject(NULL, len)) == NULL)
1646 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001647
Guido van Rossum12d12c51993-10-26 17:58:25 +00001648 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001649 object *item, *arg, *good;
1650 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001651
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001652 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1653 if (item == NULL)
1654 goto Fail_1;
1655 arg = mkvalue("(O)", item);
1656 DECREF(item);
1657 if (arg == NULL)
1658 goto Fail_1;
1659 good = call_object(func, arg);
1660 DECREF(arg);
1661 if (good == NULL)
1662 goto Fail_1;
1663 ok = testbool(good);
1664 DECREF(good);
1665 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001666 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001667 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001668 }
1669
Guido van Rossum12d12c51993-10-26 17:58:25 +00001670 if (resizestring(&result, j) < 0)
1671 return NULL;
1672
Guido van Rossum12d12c51993-10-26 17:58:25 +00001673 return result;
1674
Guido van Rossum12d12c51993-10-26 17:58:25 +00001675Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001676 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001677 return NULL;
1678}