blob: 142a4f7189579b9976bd1ff6ebb348cc09b09cb7 [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
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum3f5da241990-12-20 15:06:42 +000032/* Built-in functions */
33
34#include "allobjects.h"
35
36#include "node.h"
37#include "graminit.h"
Guido van Rossum86cd6e61991-01-21 15:12:35 +000038#include "bltinmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000039#include "import.h"
Guido van Rossum5b722181993-03-30 17:46:03 +000040#include "compile.h"
41#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000042
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +000043#include "mymath.h"
44
Guido van Rossum12d12c51993-10-26 17:58:25 +000045/* Forward */
46static object *filterstring PROTO((object *, object *));
47static object *filtertuple PROTO((object *, object *));
Guido van Rossum12d12c51993-10-26 17:58:25 +000048
Guido van Rossum3f5da241990-12-20 15:06:42 +000049static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000050builtin___import__(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000051 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000052 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000053{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000054 char *name;
Guido van Rossum24c13741995-02-14 09:42:43 +000055 object *globals = NULL;
56 object *locals = NULL;
57 object *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000058
Guido van Rossum24c13741995-02-14 09:42:43 +000059 if (!newgetargs(args, "s|OOO:__import__",
60 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000061 return NULL;
Guido van Rossum7f9fa971995-01-20 16:53:12 +000062 return import_module(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000063}
64
65
66static object *
67builtin_abs(self, args)
68 object *self;
69 object *args;
70{
71 object *v;
Guido van Rossumd4905451991-05-05 20:00:36 +000072 number_methods *nm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000073
74 if (!newgetargs(args, "O:abs", &v))
75 return NULL;
76 if ((nm = v->ob_type->tp_as_number) == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +000077 err_setstr(TypeError, "abs() requires numeric argument");
78 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000079 }
Guido van Rossumd4905451991-05-05 20:00:36 +000080 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000081}
82
83static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000084builtin_apply(self, args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000085 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000086 object *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000087{
Guido van Rossumc96ef6a1996-01-26 20:44:30 +000088 object *func, *alist = NULL, *kwdict = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000089
Guido van Rossum681d79a1995-07-18 14:51:37 +000090 if (!newgetargs(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000091 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +000092 if (alist != NULL && !is_tupleobject(alist)) {
Guido van Rossum2d951851994-08-29 12:52:16 +000093 err_setstr(TypeError, "apply() 2nd argument must be tuple");
94 return NULL;
95 }
Guido van Rossum681d79a1995-07-18 14:51:37 +000096 if (kwdict != NULL && !is_dictobject(kwdict)) {
97 err_setstr(TypeError,
98 "apply() 3rd argument must be dictionary");
99 return NULL;
100 }
101 return PyEval_CallObjectWithKeywords(func, alist, kwdict);
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000102}
103
Guido van Rossum2d951851994-08-29 12:52:16 +0000104static object *
105builtin_callable(self, args)
106 object *self;
107 object *args;
108{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000109 object *v;
110
111 if (!newgetargs(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000112 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000113 return newintobject((long)callable(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000114}
115
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000116static object *
Guido van Rossume77a7571993-11-03 15:01:26 +0000117builtin_filter(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000118 object *self;
119 object *args;
120{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000121 object *func, *seq, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000122 sequence_methods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000123 int len;
124 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000125
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000126 if (!newgetargs(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000127 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000128
Guido van Rossum12d12c51993-10-26 17:58:25 +0000129 if (is_stringobject(seq)) {
130 object *r = filterstring(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 (is_tupleobject(seq)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000135 object *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000136 return r;
137 }
138
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000139 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000140 err_setstr(TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000141 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000142 goto Fail_2;
143 }
144
145 if ((len = (*sqf->sq_length)(seq)) < 0)
146 goto Fail_2;
147
148 if (is_listobject(seq) && seq->ob_refcnt == 1) {
149 INCREF(seq);
150 result = seq;
151 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000152 else {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000153 if ((result = newlistobject(len)) == NULL)
154 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000155 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000156
Guido van Rossum2d951851994-08-29 12:52:16 +0000157 for (i = j = 0; ; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000158 object *item, *good;
159 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000160
Guido van Rossum2d951851994-08-29 12:52:16 +0000161 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
162 if (i < len)
163 goto Fail_1;
164 if (err_occurred() == IndexError) {
165 err_clear();
166 break;
167 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000168 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000169 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000170
171 if (func == None) {
172 good = item;
Guido van Rossum58b68731995-01-10 17:40:55 +0000173 INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000174 }
175 else {
176 object *arg = mkvalue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000177 if (arg == NULL)
178 goto Fail_1;
179 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000180 DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000181 if (good == NULL) {
182 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000183 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000184 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000185 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000186 ok = testbool(good);
187 DECREF(good);
188 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000189 if (j < len) {
190 if (setlistitem(result, j++, item) < 0)
191 goto Fail_1;
192 }
193 else {
194 j++;
195 if (addlistitem(result, item) < 0)
196 goto Fail_1;
197 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000198 } else {
199 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000200 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000201 }
202
Guido van Rossum12d12c51993-10-26 17:58:25 +0000203
Guido van Rossum2d951851994-08-29 12:52:16 +0000204 if (j < len && setlistslice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000205 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000206
Guido van Rossum12d12c51993-10-26 17:58:25 +0000207 return result;
208
Guido van Rossum12d12c51993-10-26 17:58:25 +0000209Fail_1:
210 DECREF(result);
211Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000212 return NULL;
213}
214
215static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000216builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000217 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000218 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000219{
220 long x;
221 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000222
223 if (!newgetargs(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000224 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000225 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000226 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000227 return NULL;
228 }
229 s[0] = x;
230 return newsizedstringobject(s, 1);
231}
232
233static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000234builtin_cmp(self, args)
235 object *self;
236 object *args;
237{
238 object *a, *b;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000239
240 if (!newgetargs(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000241 return NULL;
242 return newintobject((long)cmpobject(a, b));
243}
244
245static object *
Guido van Rossum5524a591995-01-10 15:26:20 +0000246builtin_coerce(self, args)
247 object *self;
248 object *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000249{
Guido van Rossum5524a591995-01-10 15:26:20 +0000250 object *v, *w;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000251 object *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000252
253 if (!newgetargs(args, "OO:coerce", &v, &w))
254 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000255 if (coerce(&v, &w) < 0)
256 return NULL;
257 res = mkvalue("(OO)", v, w);
258 DECREF(v);
259 DECREF(w);
260 return res;
261}
262
263static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000264builtin_compile(self, args)
265 object *self;
266 object *args;
267{
268 char *str;
269 char *filename;
270 char *startstr;
271 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000272
273 if (!newgetargs(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000274 return NULL;
275 if (strcmp(startstr, "exec") == 0)
276 start = file_input;
277 else if (strcmp(startstr, "eval") == 0)
278 start = eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000279 else if (strcmp(startstr, "single") == 0)
280 start = single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000281 else {
282 err_setstr(ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000283 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000284 return NULL;
285 }
286 return compile_string(str, filename, start);
287}
288
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000289#ifndef WITHOUT_COMPLEX
290
291static object *
292builtin_complex(self, args)
293 object *self;
294 object *args;
295{
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000296 object *r, *i, *tmp;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000297 number_methods *nbr, *nbi;
Guido van Rossum530956d1996-07-21 02:27:43 +0000298 Py_complex cr, ci;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000299
300 i = NULL;
301 if (!newgetargs(args, "O|O:complex", &r, &i))
302 return NULL;
303 if ((nbr = r->ob_type->tp_as_number) == NULL ||
304 nbr->nb_float == NULL || (i != NULL &&
305 ((nbi = i->ob_type->tp_as_number) == NULL ||
306 nbi->nb_float == NULL))) {
307 err_setstr(TypeError,
308 "complex() argument can't be converted to complex");
309 return NULL;
310 }
311 if (is_complexobject(r))
312 cr = ((complexobject*)r)->cval;
313 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000314 tmp = (*nbr->nb_float)(r);
315 if (tmp == NULL)
316 return NULL;
317 cr.real = getfloatvalue(tmp);
318 DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000319 cr.imag = 0.;
320 }
321 if (i == NULL) {
322 ci.real = 0.;
323 ci.imag = 0.;
324 }
325 else if (is_complexobject(i))
326 ci = ((complexobject*)i)->cval;
327 else {
Guido van Rossumb0721501996-09-07 15:55:27 +0000328 tmp = (*nbr->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000329 if (tmp == NULL)
330 return NULL;
331 ci.real = getfloatvalue(tmp);
332 DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000333 ci.imag = 0.;
334 }
335 cr.real -= ci.imag;
336 cr.imag += ci.real;
337 return newcomplexobject(cr);
338}
339
340#endif
341
Guido van Rossum5b722181993-03-30 17:46:03 +0000342static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000343builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000344 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000345 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000346{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000347 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000348 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000349
350 if (!newgetargs(args, "|O:dir", &v))
351 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000352 if (v == NULL) {
353 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000354 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000355 }
356 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000357 d = getattr(v, "__dict__");
358 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000359 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000360 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000361 return NULL;
362 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000363 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000364 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000365 v = getdictkeys(d);
366 if (sortlist(v) != 0) {
367 DECREF(v);
368 v = NULL;
369 }
370 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000371 else {
Guido van Rossum795ba581996-05-23 22:49:07 +0000372 v = PyObject_CallMethod(d, "keys", NULL);
373 if (v == NULL) {
374 PyErr_Clear();
375 v = newlistobject(0);
376 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000377 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000378 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000379 return v;
380}
381
382static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000383do_divmod(v, w)
384 object *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000385{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000386 object *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000387
Guido van Rossum180d7b41994-09-29 09:45:57 +0000388 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000389 return instancebinop(v, w, "__divmod__", "__rdivmod__",
390 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000391 if (v->ob_type->tp_as_number == NULL ||
392 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000393 err_setstr(TypeError,
394 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000395 return NULL;
396 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000397 if (coerce(&v, &w) != 0)
398 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000399 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000400 DECREF(v);
401 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000402 return res;
403}
404
405static object *
406builtin_divmod(self, args)
407 object *self;
408 object *args;
409{
410 object *v, *w;
411
412 if (!newgetargs(args, "OO:divmod", &v, &w))
413 return NULL;
414 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000415}
416
417static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000418builtin_eval(self, args)
419 object *self;
420 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000421{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000422 object *cmd;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000423 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000424 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000425
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000426 if (!newgetargs(args, "O|O!O!:eval",
427 &cmd,
428 &Mappingtype, &globals,
429 &Mappingtype, &locals))
430 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000431 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000432 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000433 if (locals == None)
434 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000435 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000436 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000437 locals = globals;
438 if (dictlookup(globals, "__builtins__") == NULL) {
439 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
440 return NULL;
441 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442 if (is_codeobject(cmd))
Guido van Rossum681d79a1995-07-18 14:51:37 +0000443 return eval_code((codeobject *) cmd, globals, locals);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000444 if (!is_stringobject(cmd)) {
445 err_setstr(TypeError,
446 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000447 return NULL;
448 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000449 str = getstringvalue(cmd);
450 if (strlen(str) != getstringsize(cmd)) {
451 err_setstr(ValueError,
452 "embedded '\\0' in string arg");
453 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000454 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000455 while (*str == ' ' || *str == '\t')
456 str++;
457 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000458}
459
460static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000461builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000462 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000463 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000464{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000465 char *filename;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000466 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000467 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000468 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000469
470 if (!newgetargs(args, "s|O!O!:execfile",
471 &filename,
472 &Mappingtype, &globals,
473 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000474 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000475 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000476 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000477 if (locals == None)
478 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000479 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000480 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000481 locals = globals;
482 if (dictlookup(globals, "__builtins__") == NULL) {
483 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
484 return NULL;
485 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000486 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000487 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000488 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000489 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000490 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000491 return NULL;
492 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000493 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000494 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000495 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000496 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000497 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000498}
499
500static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000501builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000502 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000503 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000504{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000505 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000506 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000507
508 if (!newgetargs(args, "O:float", &v))
509 return NULL;
510 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000511 nb->nb_float == NULL) {
512 err_setstr(TypeError,
513 "float() argument can't be converted to float");
514 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000515 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000516 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000517}
518
519static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000520builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000521 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000522 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000523{
Guido van Rossum94390a41992-08-14 15:14:30 +0000524 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000525 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000526
527 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000528 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000529 return getattro(v, name);
530}
531
532static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000533builtin_globals(self, args)
534 object *self;
535 object *args;
536{
537 object *d;
538
539 if (!newgetargs(args, ""))
540 return NULL;
541 d = getglobals();
542 INCREF(d);
543 return d;
544}
545
546static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000547builtin_hasattr(self, args)
548 object *self;
549 object *args;
550{
551 object *v;
552 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000553
554 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000555 return NULL;
556 v = getattro(v, name);
557 if (v == NULL) {
558 err_clear();
559 return newintobject(0L);
560 }
561 DECREF(v);
562 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000563}
564
565static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000566builtin_id(self, args)
567 object *self;
568 object *args;
569{
570 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000571
572 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000573 return NULL;
574 return newintobject((long)v);
575}
576
577static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000578builtin_map(self, args)
579 object *self;
580 object *args;
581{
582 typedef struct {
583 object *seq;
584 sequence_methods *sqf;
585 int len;
586 } sequence;
587
588 object *func, *result;
589 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000590 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000591 register int i, j;
592
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000593 n = gettuplesize(args);
594 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000595 err_setstr(TypeError, "map() requires at least two args");
596 return NULL;
597 }
598
599 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000600 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000601
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000602 if ((seqs = NEW(sequence, n)) == NULL) {
603 err_nomem();
604 goto Fail_2;
605 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000606
Guido van Rossum2d951851994-08-29 12:52:16 +0000607 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000608 int curlen;
609
610 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
611 goto Fail_2;
612
613 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
614 static char errmsg[] =
615 "argument %d to map() must be a sequence object";
616 char errbuf[sizeof(errmsg) + 3];
617
618 sprintf(errbuf, errmsg, i+2);
619 err_setstr(TypeError, errbuf);
620 goto Fail_2;
621 }
622
623 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
624 goto Fail_2;
625
626 if (curlen > len)
627 len = curlen;
628 }
629
630 if ((result = (object *) newlistobject(len)) == NULL)
631 goto Fail_2;
632
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000633 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000634 for (i = 0; ; ++i) {
Guido van Rossum32120311995-07-10 13:52:21 +0000635 object *alist, *item, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000636 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000637
Guido van Rossum2d951851994-08-29 12:52:16 +0000638 if (func == None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000639 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000640 else {
Guido van Rossum32120311995-07-10 13:52:21 +0000641 if ((alist = newtupleobject(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000642 goto Fail_1;
643 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000644
645 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000646 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000647 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000648 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000649 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000650 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000651 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000652 if (item == NULL) {
653 if (i < sqp->len)
654 goto Fail_0;
655 if (err_occurred() == IndexError) {
656 err_clear();
657 INCREF(None);
658 item = None;
659 sqp->len = -1;
660 }
661 else {
662 goto Fail_0;
663 }
664 }
665 else
666 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000667
Guido van Rossum12d12c51993-10-26 17:58:25 +0000668 }
Guido van Rossum32120311995-07-10 13:52:21 +0000669 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +0000670 break;
Guido van Rossum32120311995-07-10 13:52:21 +0000671 if (settupleitem(alist, j, item) < 0) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000672 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000673 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000674 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000675 continue;
676
677 Fail_0:
Guido van Rossum32120311995-07-10 13:52:21 +0000678 XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000679 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000680 }
681
Guido van Rossum32120311995-07-10 13:52:21 +0000682 if (!alist)
683 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000684
685 if (!any) {
Guido van Rossum32120311995-07-10 13:52:21 +0000686 DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000687 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000688 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000689
690 if (func == None)
Guido van Rossum32120311995-07-10 13:52:21 +0000691 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000692 else {
Guido van Rossum32120311995-07-10 13:52:21 +0000693 value = call_object(func, alist);
694 DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000695 if (value == NULL)
696 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000697 }
698 if (i >= len) {
699 if (addlistitem(result, value) < 0)
700 goto Fail_1;
701 }
702 else {
703 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000704 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000705 }
706 }
707
Guido van Rossum2d951851994-08-29 12:52:16 +0000708 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000709 return result;
710
Guido van Rossum12d12c51993-10-26 17:58:25 +0000711Fail_1:
712 DECREF(result);
713Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000714 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000715 return NULL;
716}
717
718static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000719builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000720 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000721 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000722{
Guido van Rossum94390a41992-08-14 15:14:30 +0000723 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000724 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000725 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000726
727 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000728 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000729 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000730 return NULL;
731 INCREF(None);
732 return None;
733}
734
735static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000736builtin_delattr(self, args)
737 object *self;
738 object *args;
739{
740 object *v;
741 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000742
743 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000744 return NULL;
745 if (setattro(v, name, (object *)NULL) != 0)
746 return NULL;
747 INCREF(None);
748 return None;
749}
750
751static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000752builtin_hash(self, args)
753 object *self;
754 object *args;
755{
756 object *v;
757 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000758
759 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000760 return NULL;
761 x = hashobject(v);
762 if (x == -1)
763 return NULL;
764 return newintobject(x);
765}
766
767static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000768builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000769 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000770 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000771{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000772 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000773 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000774
775 if (!newgetargs(args, "O:hex", &v))
776 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000777
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000778 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000779 nb->nb_hex == NULL) {
780 err_setstr(TypeError,
781 "hex() argument can't be converted to hex");
782 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000783 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000784 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000785}
786
Guido van Rossum3165fe61992-09-25 21:59:05 +0000787static object *builtin_raw_input PROTO((object *, object *));
788
Guido van Rossum006bcd41991-10-24 14:54:44 +0000789static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000790builtin_input(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 *line;
795 char *str;
796 object *res;
Guido van Rossum6135a871995-01-09 17:53:26 +0000797 object *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000798
799 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000800 if (line == NULL)
801 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000802 if (!getargs(line, "s;embedded '\\0' in input line", &str))
803 return NULL;
804 while (*str == ' ' || *str == '\t')
805 str++;
Guido van Rossum6135a871995-01-09 17:53:26 +0000806 globals = getglobals();
807 locals = getlocals();
808 if (dictlookup(globals, "__builtins__") == NULL) {
809 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
810 return NULL;
811 }
812 res = run_string(str, eval_input, globals, locals);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000813 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000814 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000815}
816
817static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000818builtin_int(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000819 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000820 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000821{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000823 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000824
825 if (!newgetargs(args, "O:int", &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_int == NULL) {
829 err_setstr(TypeError,
830 "int() argument can't be converted to int");
831 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000832 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000833 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000834}
835
836static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000837builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000838 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000839 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000840{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000841 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000842 long len;
843 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000844
845 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000846 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000847 tp = v->ob_type;
848 if (tp->tp_as_sequence != NULL) {
849 len = (*tp->tp_as_sequence->sq_length)(v);
850 }
851 else if (tp->tp_as_mapping != NULL) {
852 len = (*tp->tp_as_mapping->mp_length)(v);
853 }
854 else {
855 err_setstr(TypeError, "len() of unsized object");
856 return NULL;
857 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000858 if (len < 0)
859 return NULL;
860 else
861 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000862}
863
864static object *
Guido van Rossumd1705771996-04-09 02:41:06 +0000865builtin_list(self, args)
866 object *self;
867 object *args;
868{
869 object *v;
870 sequence_methods *sqf;
871
872 if (!newgetargs(args, "O:list", &v))
873 return NULL;
874 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
875 int n = (*sqf->sq_length)(v);
876 int i;
877 object *l;
878 if (n < 0)
879 return NULL;
880 l = newlistobject(n);
881 if (l == NULL)
882 return NULL;
883 for (i = 0; i < n; i++) {
884 object *item = (*sqf->sq_item)(v, i);
885 if (item == NULL) {
886 DECREF(l);
887 l = NULL;
888 break;
889 }
890 setlistitem(l, i, item);
891 }
892 /* XXX Should support indefinite-length sequences */
893 return l;
894 }
895 err_setstr(TypeError, "list() argument must be a sequence");
896 return NULL;
897}
898
Guido van Rossum8861b741996-07-30 16:49:37 +0000899
900static PyObject *
901builtin_slice(self, args)
902 PyObject *self;
903 PyObject *args;
904{
905 PyObject *start, *stop, *step;
906
907 start = stop = step = NULL;
908
909 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
910 return NULL;
911
912 /*This swapping of stop and start is to maintain compatibility with
913 the range builtin.*/
914 if (stop == NULL) {
915 stop = start;
916 start = NULL;
917 }
918 return PySlice_New(start, stop, step);
919}
920
Guido van Rossumd1705771996-04-09 02:41:06 +0000921static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000922builtin_locals(self, args)
923 object *self;
924 object *args;
925{
926 object *d;
927
928 if (!newgetargs(args, ""))
929 return NULL;
930 d = getlocals();
931 INCREF(d);
932 return d;
933}
934
935static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000936builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000937 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000938 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000939{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000940 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000941 number_methods *nb;
942
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000943 if (!newgetargs(args, "O:long", &v))
944 return NULL;
945 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000946 nb->nb_long == NULL) {
947 err_setstr(TypeError,
948 "long() argument can't be converted to long");
949 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000950 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000951 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000952}
953
954static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000955min_max(args, sign)
956 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000957 int sign;
958{
Guido van Rossum2d951851994-08-29 12:52:16 +0000959 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000960 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000961 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000962
963 if (gettuplesize(args) > 1)
964 v = args;
965 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000966 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000967 sq = v->ob_type->tp_as_sequence;
968 if (sq == NULL) {
969 err_setstr(TypeError, "min() or max() of non-sequence");
970 return NULL;
971 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000972 w = NULL;
973 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000974 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000975 if (x == NULL) {
976 if (err_occurred() == IndexError) {
977 err_clear();
978 break;
979 }
980 XDECREF(w);
981 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000982 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000983 if (w == NULL)
984 w = x;
985 else {
986 if (cmpobject(x, w) * sign > 0) {
987 DECREF(w);
988 w = x;
989 }
990 else
991 DECREF(x);
992 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000993 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000994 if (w == NULL)
995 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000996 return w;
997}
998
999static object *
1000builtin_min(self, v)
1001 object *self;
1002 object *v;
1003{
1004 return min_max(v, -1);
1005}
1006
1007static object *
1008builtin_max(self, v)
1009 object *self;
1010 object *v;
1011{
1012 return min_max(v, 1);
1013}
1014
1015static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001016builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001017 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001018 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001019{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001020 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001021 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001022
1023 if (!newgetargs(args, "O:oct", &v))
1024 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001025 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1026 nb->nb_oct == NULL) {
1027 err_setstr(TypeError,
1028 "oct() argument can't be converted to oct");
1029 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001030 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001031 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001032}
1033
1034static object *
Guido van Rossum94390a41992-08-14 15:14:30 +00001035builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001036 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +00001037 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001038{
Guido van Rossum2d951851994-08-29 12:52:16 +00001039 char *name;
1040 char *mode = "r";
1041 int bufsize = -1;
1042 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001043
1044 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001045 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001046 f = newfileobject(name, mode);
1047 if (f != NULL)
1048 setfilebufsize(f, bufsize);
1049 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001050}
1051
1052static object *
Guido van Rossum94390a41992-08-14 15:14:30 +00001053builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001054 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +00001055 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001056{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001057 char c;
1058
1059 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001060 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001061 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001062}
1063
1064static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001065do_pow(v, w)
1066 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +00001067{
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001068 object *res;
1069 if (is_instanceobject(v) || is_instanceobject(w))
1070 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001071 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +00001072 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +00001073 err_setstr(TypeError, "pow() requires numeric arguments");
1074 return NULL;
1075 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001076 if (
1077#ifndef WITHOUT_COMPLEX
1078 !is_complexobject(v) &&
1079#endif
1080 is_floatobject(w) && getfloatvalue(v) < 0.0) {
Guido van Rossum8a1e8eb1995-02-18 14:51:32 +00001081 if (!err_occurred())
1082 err_setstr(ValueError, "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +00001083 return NULL;
1084 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001085 if (coerce(&v, &w) != 0)
1086 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001087 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001088 DECREF(v);
1089 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001090 return res;
1091}
1092
1093static object *
1094builtin_pow(self, args)
1095 object *self;
1096 object *args;
1097{
1098 object *v, *w, *z = None, *res;
1099 object *v1, *z1, *w2, *z2;
1100
1101 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
1102 return NULL;
1103 if (z == None)
1104 return do_pow(v, w);
1105 /* XXX The ternary version doesn't do class instance coercions */
1106 if (is_instanceobject(v))
1107 return v->ob_type->tp_as_number->nb_power(v, w, z);
1108 if (v->ob_type->tp_as_number == NULL ||
1109 z->ob_type->tp_as_number == NULL ||
1110 w->ob_type->tp_as_number == NULL) {
1111 err_setstr(TypeError, "pow() requires numeric arguments");
1112 return NULL;
1113 }
1114 if (coerce(&v, &w) != 0)
1115 return NULL;
1116 res = NULL;
1117 v1 = v;
1118 z1 = z;
1119 if (coerce(&v1, &z1) != 0)
1120 goto error2;
1121 w2 = w;
1122 z2 = z1;
1123 if (coerce(&w2, &z2) != 0)
1124 goto error1;
1125 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
1126 DECREF(w2);
1127 DECREF(z2);
1128 error1:
1129 DECREF(v1);
1130 DECREF(z1);
1131 error2:
1132 DECREF(v);
1133 DECREF(w);
1134 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001135}
1136
1137static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001138builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001139 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001140 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001141{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001142 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001143 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001144 object *v;
1145
1146 if (gettuplesize(args) <= 1) {
1147 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001148 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001149 &ihigh))
1150 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001151 }
1152 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001153 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001154 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001155 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001156 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001157 }
1158 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001159 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001160 return NULL;
1161 }
1162 /* XXX ought to check overflow of subtraction */
1163 if (istep > 0)
1164 n = (ihigh - ilow + istep - 1) / istep;
1165 else
1166 n = (ihigh - ilow + istep + 1) / istep;
1167 if (n < 0)
1168 n = 0;
1169 v = newlistobject(n);
1170 if (v == NULL)
1171 return NULL;
1172 for (i = 0; i < n; i++) {
1173 object *w = newintobject(ilow);
1174 if (w == NULL) {
1175 DECREF(v);
1176 return NULL;
1177 }
1178 setlistitem(v, i, w);
1179 ilow += istep;
1180 }
1181 return v;
1182}
1183
1184static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001185builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001186 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001187 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001188{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001189 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001190 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001191
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001192 if (gettuplesize(args) <= 1) {
1193 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001194 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001195 &ihigh))
1196 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001197 }
1198 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001199 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001200 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001201 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001202 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001203 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001204 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001205 err_setstr(ValueError, "zero step for xrange()");
1206 return NULL;
1207 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001208 /* XXX ought to check overflow of subtraction */
1209 if (istep > 0)
1210 n = (ihigh - ilow + istep - 1) / istep;
1211 else
1212 n = (ihigh - ilow + istep + 1) / istep;
1213 if (n < 0)
1214 n = 0;
1215 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001216}
1217
Guido van Rossum872537c1995-07-07 22:43:42 +00001218extern char *my_readline PROTO((char *));
1219
Guido van Rossum12d12c51993-10-26 17:58:25 +00001220static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001221builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001222 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001223 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001224{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001225 object *v = NULL;
1226 object *f;
1227
1228 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001229 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001230 if (getfilefile(sysget("stdin")) == stdin &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001231 getfilefile(sysget("stdout")) == stdout &&
1232 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum872537c1995-07-07 22:43:42 +00001233 object *po;
1234 char *prompt;
1235 char *s;
1236 object *result;
1237 if (v != NULL) {
1238 po = strobject(v);
1239 if (po == NULL)
1240 return NULL;
1241 prompt = getstringvalue(po);
1242 }
1243 else {
1244 po = NULL;
1245 prompt = "";
1246 }
1247 s = my_readline(prompt);
1248 XDECREF(po);
1249 if (s == NULL) {
1250 err_set(KeyboardInterrupt);
1251 return NULL;
1252 }
1253 if (*s == '\0') {
1254 err_set(EOFError);
1255 result = NULL;
1256 }
1257 else { /* strip trailing '\n' */
1258 result = newsizedstringobject(s, strlen(s)-1);
1259 }
1260 free(s);
1261 return result;
1262 }
Guido van Rossum90933611991-06-07 16:10:43 +00001263 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001264 f = sysget("stdout");
1265 if (f == NULL) {
1266 err_setstr(RuntimeError, "lost sys.stdout");
1267 return NULL;
1268 }
1269 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001270 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001271 return NULL;
1272 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001273 f = sysget("stdin");
1274 if (f == NULL) {
1275 err_setstr(RuntimeError, "lost sys.stdin");
1276 return NULL;
1277 }
1278 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001279}
1280
1281static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001282builtin_reduce(self, args)
1283 object *self;
1284 object *args;
1285{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001286 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001287 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001288 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001289
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1291 return NULL;
1292 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001293 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001294
1295 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1296 err_setstr(TypeError,
1297 "2nd argument to reduce() must be a sequence object");
1298 return NULL;
1299 }
1300
Guido van Rossum12d12c51993-10-26 17:58:25 +00001301 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001302 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001303
Guido van Rossum2d951851994-08-29 12:52:16 +00001304 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001305 object *op2;
1306
1307 if (args->ob_refcnt > 1) {
1308 DECREF(args);
1309 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001310 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001311 }
1312
Guido van Rossum2d951851994-08-29 12:52:16 +00001313 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1314 if (err_occurred() == IndexError) {
1315 err_clear();
1316 break;
1317 }
1318 goto Fail;
1319 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001320
Guido van Rossum2d951851994-08-29 12:52:16 +00001321 if (result == NULL)
1322 result = op2;
1323 else {
1324 settupleitem(args, 0, result);
1325 settupleitem(args, 1, op2);
1326 if ((result = call_object(func, args)) == NULL)
1327 goto Fail;
1328 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001329 }
1330
1331 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001332
Guido van Rossum2d951851994-08-29 12:52:16 +00001333 if (result == NULL)
1334 err_setstr(TypeError,
1335 "reduce of empty sequence with no initial value");
1336
Guido van Rossum12d12c51993-10-26 17:58:25 +00001337 return result;
1338
Guido van Rossum2d951851994-08-29 12:52:16 +00001339Fail:
1340 XDECREF(args);
1341 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001342 return NULL;
1343}
1344
1345static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001346builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001347 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001348 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001349{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001350 object *v;
1351
1352 if (!newgetargs(args, "O:reload", &v))
1353 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001354 return reload_module(v);
1355}
1356
1357static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001358builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001359 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001360 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001361{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001362 object *v;
1363
1364 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001365 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001366 return reprobject(v);
1367}
1368
1369static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001370builtin_round(self, args)
1371 object *self;
1372 object *args;
1373{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001374 double x;
1375 double f;
1376 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001377 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001378
1379 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001380 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001381 f = 1.0;
1382 for (i = ndigits; --i >= 0; )
1383 f = f*10.0;
1384 for (i = ndigits; ++i <= 0; )
1385 f = f*0.1;
1386 if (x >= 0.0)
1387 return newfloatobject(floor(x*f + 0.5) / f);
1388 else
1389 return newfloatobject(ceil(x*f - 0.5) / f);
1390}
1391
1392static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001393builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001394 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001395 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001396{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001397 object *v;
1398
1399 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001400 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001401 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001402}
1403
1404static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001405builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001406 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001407 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001408{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001409 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001410 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001411
1412 if (!newgetargs(args, "O:tuple", &v))
1413 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001414 if (is_tupleobject(v)) {
1415 INCREF(v);
1416 return v;
1417 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001418 if (is_listobject(v))
1419 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001420 if (is_stringobject(v)) {
1421 int n = getstringsize(v);
1422 object *t = newtupleobject(n);
1423 if (t != NULL) {
1424 int i;
1425 char *p = getstringvalue(v);
1426 for (i = 0; i < n; i++) {
1427 object *item = newsizedstringobject(p+i, 1);
1428 if (item == NULL) {
1429 DECREF(t);
1430 t = NULL;
1431 break;
1432 }
1433 settupleitem(t, i, item);
1434 }
1435 }
1436 return t;
1437 }
1438 /* Generic sequence object */
1439 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1440 int n = (*sqf->sq_length)(v);
1441 int i;
1442 object *t;
1443 if (n < 0)
1444 return NULL;
1445 t = newtupleobject(n);
1446 if (t == NULL)
1447 return NULL;
1448 for (i = 0; i < n; i++) {
1449 object *item = (*sqf->sq_item)(v, i);
1450 if (item == NULL) {
1451 DECREF(t);
1452 t = NULL;
1453 break;
1454 }
1455 settupleitem(t, i, item);
1456 }
1457 /* XXX Should support indefinite-length sequences */
1458 return t;
1459 }
1460 /* None of the above */
1461 err_setstr(TypeError, "tuple() argument must be a sequence");
1462 return NULL;
1463}
1464
1465static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001466builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001467 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001468 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001469{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001470 object *v;
1471
1472 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001473 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001474 v = (object *)v->ob_type;
1475 INCREF(v);
1476 return v;
1477}
1478
Guido van Rossum2d951851994-08-29 12:52:16 +00001479static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001480builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001481 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001482 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001483{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001484 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001485 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001486
1487 if (!newgetargs(args, "|O:vars", &v))
1488 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001489 if (v == NULL) {
1490 d = getlocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001491 if (d == NULL) {
1492 if (!err_occurred())
1493 err_setstr(SystemError, "no locals!?");
1494 }
1495 else
1496 INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001497 }
1498 else {
1499 d = getattr(v, "__dict__");
1500 if (d == NULL) {
1501 err_setstr(TypeError,
1502 "vars() argument must have __dict__ attribute");
1503 return NULL;
1504 }
1505 }
1506 return d;
1507}
1508
Guido van Rossum3f5da241990-12-20 15:06:42 +00001509static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001510 {"__import__", builtin___import__, 1},
1511 {"abs", builtin_abs, 1},
1512 {"apply", builtin_apply, 1},
1513 {"callable", builtin_callable, 1},
1514 {"chr", builtin_chr, 1},
1515 {"cmp", builtin_cmp, 1},
1516 {"coerce", builtin_coerce, 1},
1517 {"compile", builtin_compile, 1},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001518#ifndef WITHOUT_COMPLEX
1519 {"complex", builtin_complex, 1},
1520#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001521 {"delattr", builtin_delattr, 1},
1522 {"dir", builtin_dir, 1},
1523 {"divmod", builtin_divmod, 1},
1524 {"eval", builtin_eval, 1},
1525 {"execfile", builtin_execfile, 1},
1526 {"filter", builtin_filter, 1},
1527 {"float", builtin_float, 1},
1528 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001529 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001530 {"hasattr", builtin_hasattr, 1},
1531 {"hash", builtin_hash, 1},
1532 {"hex", builtin_hex, 1},
1533 {"id", builtin_id, 1},
1534 {"input", builtin_input, 1},
1535 {"int", builtin_int, 1},
1536 {"len", builtin_len, 1},
Guido van Rossumd1705771996-04-09 02:41:06 +00001537 {"list", builtin_list, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001538 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001539 {"long", builtin_long, 1},
1540 {"map", builtin_map, 1},
1541 {"max", builtin_max, 1},
1542 {"min", builtin_min, 1},
1543 {"oct", builtin_oct, 1},
1544 {"open", builtin_open, 1},
1545 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001546 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001547 {"range", builtin_range, 1},
1548 {"raw_input", builtin_raw_input, 1},
1549 {"reduce", builtin_reduce, 1},
1550 {"reload", builtin_reload, 1},
1551 {"repr", builtin_repr, 1},
1552 {"round", builtin_round, 1},
1553 {"setattr", builtin_setattr, 1},
Guido van Rossum8861b741996-07-30 16:49:37 +00001554 {"slice", builtin_slice, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001555 {"str", builtin_str, 1},
1556 {"tuple", builtin_tuple, 1},
1557 {"type", builtin_type, 1},
1558 {"vars", builtin_vars, 1},
1559 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001560 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001561};
1562
Guido van Rossum0865dd91995-01-17 16:30:22 +00001563static object *builtin_mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001564static object *builtin_dict;
1565
1566object *
Guido van Rossum0865dd91995-01-17 16:30:22 +00001567getbuiltinmod()
1568{
1569 return builtin_mod;
1570}
1571
1572object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001573getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001574{
Guido van Rossum6135a871995-01-09 17:53:26 +00001575 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001576}
1577
1578/* Predefined exceptions */
1579
Guido van Rossum25831651993-05-19 14:50:45 +00001580object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001581object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001582object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001583object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001584object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001585object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001586object *IndexError;
1587object *KeyError;
1588object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001589object *MemoryError;
1590object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001591object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001592object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001593object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001594object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001595object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001596object *TypeError;
1597object *ValueError;
1598object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001599
Guido van Rossum3f5da241990-12-20 15:06:42 +00001600static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001601newstdexception(name)
1602 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001603{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001604 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001605 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1606 fatal("no mem for new standard exception");
1607 return v;
1608}
1609
1610static void
1611initerrors()
1612{
Guido van Rossum25831651993-05-19 14:50:45 +00001613 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001614 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001615 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001616 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001617 IOError = newstdexception("IOError");
1618 ImportError = newstdexception("ImportError");
1619 IndexError = newstdexception("IndexError");
1620 KeyError = newstdexception("KeyError");
1621 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001622 MemoryError = newstdexception("MemoryError");
1623 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001624 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001625 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001626 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001627 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001628 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001629 TypeError = newstdexception("TypeError");
1630 ValueError = newstdexception("ValueError");
1631 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001632}
1633
1634void
1635initbuiltin()
1636{
Guido van Rossum0865dd91995-01-17 16:30:22 +00001637 builtin_mod = initmodule("__builtin__", builtin_methods);
1638 builtin_dict = getmoduledict(builtin_mod);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001639 INCREF(builtin_dict);
1640 initerrors();
1641 (void) dictinsert(builtin_dict, "None", None);
Guido van Rossume449af71996-10-11 16:25:41 +00001642 (void) dictinsert(builtin_dict, "Ellipsis", Py_Ellipsis);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001643}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001644
Guido van Rossum12d12c51993-10-26 17:58:25 +00001645
Guido van Rossume77a7571993-11-03 15:01:26 +00001646/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001647
1648static object *
1649filtertuple(func, tuple)
1650 object *func;
1651 object *tuple;
1652{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001653 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001654 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001655 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001656
Guido van Rossumb7b45621995-08-04 04:07:45 +00001657 if (len == 0) {
1658 INCREF(tuple);
1659 return tuple;
1660 }
1661
Guido van Rossum2586bf01993-11-01 16:21:44 +00001662 if ((result = newtupleobject(len)) == NULL)
1663 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001664
Guido van Rossum12d12c51993-10-26 17:58:25 +00001665 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001666 object *item, *good;
1667 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001668
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001669 if ((item = gettupleitem(tuple, i)) == NULL)
1670 goto Fail_1;
1671 if (func == None) {
1672 INCREF(item);
1673 good = item;
1674 }
1675 else {
1676 object *arg = mkvalue("(O)", item);
1677 if (arg == NULL)
1678 goto Fail_1;
1679 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001680 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001681 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001682 goto Fail_1;
1683 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001684 ok = testbool(good);
1685 DECREF(good);
1686 if (ok) {
1687 INCREF(item);
1688 if (settupleitem(result, j++, item) < 0)
1689 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001690 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001691 }
1692
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001693 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001694 return NULL;
1695
Guido van Rossum12d12c51993-10-26 17:58:25 +00001696 return result;
1697
Guido van Rossum12d12c51993-10-26 17:58:25 +00001698Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001699 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001700 return NULL;
1701}
1702
1703
Guido van Rossume77a7571993-11-03 15:01:26 +00001704/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001705
1706static object *
1707filterstring(func, strobj)
1708 object *func;
1709 object *strobj;
1710{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001711 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001712 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001713 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001714
Guido van Rossum2586bf01993-11-01 16:21:44 +00001715 if (func == None) {
1716 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001717 INCREF(strobj);
1718 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001719 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001720 if ((result = newsizedstringobject(NULL, len)) == NULL)
1721 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001722
Guido van Rossum12d12c51993-10-26 17:58:25 +00001723 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001724 object *item, *arg, *good;
1725 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001726
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001727 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1728 if (item == NULL)
1729 goto Fail_1;
1730 arg = mkvalue("(O)", item);
1731 DECREF(item);
1732 if (arg == NULL)
1733 goto Fail_1;
1734 good = call_object(func, arg);
1735 DECREF(arg);
1736 if (good == NULL)
1737 goto Fail_1;
1738 ok = testbool(good);
1739 DECREF(good);
1740 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001741 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001742 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001743 }
1744
Guido van Rossum79d96d61996-08-16 20:44:34 +00001745 if (j < len && resizestring(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001746 return NULL;
1747
Guido van Rossum12d12c51993-10-26 17:58:25 +00001748 return result;
1749
Guido van Rossum12d12c51993-10-26 17:58:25 +00001750Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001751 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001752 return NULL;
1753}