blob: 6a81c911ca5602a99336658612edc1015e429c0c [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 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000311 /* XXX Hack to support classes with __complex__ method */
312 if (is_instanceobject(r)) {
313 static object *complexstr;
314 object *f;
315 if (complexstr == NULL) {
316 complexstr = newstringobject("__complex__");
317 if (complexstr == NULL)
318 return NULL;
319 }
320 f = getattro(r, complexstr);
321 if (f == NULL)
322 err_clear();
323 else {
324 object *args = mkvalue("()");
325 if (args == NULL)
326 return NULL;
327 r = call_object(f, args);
328 DECREF(args);
329 if (r == NULL)
330 return NULL;
331 }
332 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000333 if (is_complexobject(r))
334 cr = ((complexobject*)r)->cval;
335 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000336 tmp = (*nbr->nb_float)(r);
337 if (tmp == NULL)
338 return NULL;
339 cr.real = getfloatvalue(tmp);
340 DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000341 cr.imag = 0.;
342 }
343 if (i == NULL) {
344 ci.real = 0.;
345 ci.imag = 0.;
346 }
347 else if (is_complexobject(i))
348 ci = ((complexobject*)i)->cval;
349 else {
Guido van Rossumb0721501996-09-07 15:55:27 +0000350 tmp = (*nbr->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000351 if (tmp == NULL)
352 return NULL;
353 ci.real = getfloatvalue(tmp);
354 DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000355 ci.imag = 0.;
356 }
357 cr.real -= ci.imag;
358 cr.imag += ci.real;
359 return newcomplexobject(cr);
360}
361
362#endif
363
Guido van Rossum5b722181993-03-30 17:46:03 +0000364static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000365builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000366 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000367 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000368{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000369 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000370 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000371
372 if (!newgetargs(args, "|O:dir", &v))
373 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000374 if (v == NULL) {
375 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000376 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000377 }
378 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000379 d = getattr(v, "__dict__");
380 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000381 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000382 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000383 return NULL;
384 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000385 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000386 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000387 v = getdictkeys(d);
388 if (sortlist(v) != 0) {
389 DECREF(v);
390 v = NULL;
391 }
392 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000393 else {
Guido van Rossum795ba581996-05-23 22:49:07 +0000394 v = PyObject_CallMethod(d, "keys", NULL);
395 if (v == NULL) {
396 PyErr_Clear();
397 v = newlistobject(0);
398 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000399 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000400 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000401 return v;
402}
403
404static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000405do_divmod(v, w)
406 object *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000407{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000408 object *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000409
Guido van Rossum180d7b41994-09-29 09:45:57 +0000410 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000411 return instancebinop(v, w, "__divmod__", "__rdivmod__",
412 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000413 if (v->ob_type->tp_as_number == NULL ||
414 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000415 err_setstr(TypeError,
416 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000417 return NULL;
418 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000419 if (coerce(&v, &w) != 0)
420 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000421 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000422 DECREF(v);
423 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000424 return res;
425}
426
427static object *
428builtin_divmod(self, args)
429 object *self;
430 object *args;
431{
432 object *v, *w;
433
434 if (!newgetargs(args, "OO:divmod", &v, &w))
435 return NULL;
436 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000437}
438
439static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000440builtin_eval(self, args)
441 object *self;
442 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000443{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000444 object *cmd;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000445 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000446 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000447
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000448 if (!newgetargs(args, "O|O!O!:eval",
449 &cmd,
450 &Mappingtype, &globals,
451 &Mappingtype, &locals))
452 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000453 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000454 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000455 if (locals == None)
456 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000457 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000458 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000459 locals = globals;
460 if (dictlookup(globals, "__builtins__") == NULL) {
461 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
462 return NULL;
463 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000464 if (is_codeobject(cmd))
Guido van Rossum681d79a1995-07-18 14:51:37 +0000465 return eval_code((codeobject *) cmd, globals, locals);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000466 if (!is_stringobject(cmd)) {
467 err_setstr(TypeError,
468 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000469 return NULL;
470 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000471 str = getstringvalue(cmd);
472 if (strlen(str) != getstringsize(cmd)) {
473 err_setstr(ValueError,
474 "embedded '\\0' in string arg");
475 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000476 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000477 while (*str == ' ' || *str == '\t')
478 str++;
479 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000480}
481
482static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000483builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000484 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000485 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000486{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000487 char *filename;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000488 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000489 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000490 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000491
492 if (!newgetargs(args, "s|O!O!:execfile",
493 &filename,
494 &Mappingtype, &globals,
495 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000496 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000497 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000498 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000499 if (locals == None)
500 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000501 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000502 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000503 locals = globals;
504 if (dictlookup(globals, "__builtins__") == NULL) {
505 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
506 return NULL;
507 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000508 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000509 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000510 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000511 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000512 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000513 return NULL;
514 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000515 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000516 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000517 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000518 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000519 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000520}
521
522static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000523builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000524 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000525 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000526{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000527 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000528 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000529
530 if (!newgetargs(args, "O:float", &v))
531 return NULL;
532 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000533 nb->nb_float == NULL) {
534 err_setstr(TypeError,
535 "float() argument can't be converted to float");
536 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000537 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000538 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000539}
540
541static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000542builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000543 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000544 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000545{
Guido van Rossum94390a41992-08-14 15:14:30 +0000546 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000547 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000548
549 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000550 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000551 return getattro(v, name);
552}
553
554static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000555builtin_globals(self, args)
556 object *self;
557 object *args;
558{
559 object *d;
560
561 if (!newgetargs(args, ""))
562 return NULL;
563 d = getglobals();
564 INCREF(d);
565 return d;
566}
567
568static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000569builtin_hasattr(self, args)
570 object *self;
571 object *args;
572{
573 object *v;
574 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000575
576 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000577 return NULL;
578 v = getattro(v, name);
579 if (v == NULL) {
580 err_clear();
581 return newintobject(0L);
582 }
583 DECREF(v);
584 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000585}
586
587static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000588builtin_id(self, args)
589 object *self;
590 object *args;
591{
592 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000593
594 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000595 return NULL;
596 return newintobject((long)v);
597}
598
599static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000600builtin_map(self, args)
601 object *self;
602 object *args;
603{
604 typedef struct {
605 object *seq;
606 sequence_methods *sqf;
607 int len;
608 } sequence;
609
610 object *func, *result;
611 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000612 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000613 register int i, j;
614
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000615 n = gettuplesize(args);
616 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000617 err_setstr(TypeError, "map() requires at least two args");
618 return NULL;
619 }
620
621 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000622 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000623
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000624 if ((seqs = NEW(sequence, n)) == NULL) {
625 err_nomem();
626 goto Fail_2;
627 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000628
Guido van Rossum2d951851994-08-29 12:52:16 +0000629 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000630 int curlen;
631
632 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
633 goto Fail_2;
634
635 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
636 static char errmsg[] =
637 "argument %d to map() must be a sequence object";
638 char errbuf[sizeof(errmsg) + 3];
639
640 sprintf(errbuf, errmsg, i+2);
641 err_setstr(TypeError, errbuf);
642 goto Fail_2;
643 }
644
645 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
646 goto Fail_2;
647
648 if (curlen > len)
649 len = curlen;
650 }
651
652 if ((result = (object *) newlistobject(len)) == NULL)
653 goto Fail_2;
654
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000655 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000656 for (i = 0; ; ++i) {
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000657 object *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000658 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000659
Guido van Rossum2d951851994-08-29 12:52:16 +0000660 if (func == None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000661 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000662 else {
Guido van Rossum32120311995-07-10 13:52:21 +0000663 if ((alist = newtupleobject(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000664 goto Fail_1;
665 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000666
667 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000668 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000669 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000670 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000671 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000672 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000673 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000674 if (item == NULL) {
675 if (i < sqp->len)
676 goto Fail_0;
677 if (err_occurred() == IndexError) {
678 err_clear();
679 INCREF(None);
680 item = None;
681 sqp->len = -1;
682 }
683 else {
684 goto Fail_0;
685 }
686 }
687 else
688 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000689
Guido van Rossum12d12c51993-10-26 17:58:25 +0000690 }
Guido van Rossum32120311995-07-10 13:52:21 +0000691 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +0000692 break;
Guido van Rossum32120311995-07-10 13:52:21 +0000693 if (settupleitem(alist, j, item) < 0) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000694 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000695 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000696 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000697 continue;
698
699 Fail_0:
Guido van Rossum32120311995-07-10 13:52:21 +0000700 XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000701 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000702 }
703
Guido van Rossum32120311995-07-10 13:52:21 +0000704 if (!alist)
705 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000706
707 if (!any) {
Guido van Rossum32120311995-07-10 13:52:21 +0000708 DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000709 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000710 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000711
712 if (func == None)
Guido van Rossum32120311995-07-10 13:52:21 +0000713 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000714 else {
Guido van Rossum32120311995-07-10 13:52:21 +0000715 value = call_object(func, alist);
716 DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000717 if (value == NULL)
718 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000719 }
720 if (i >= len) {
721 if (addlistitem(result, value) < 0)
722 goto Fail_1;
723 }
724 else {
725 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000726 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000727 }
728 }
729
Guido van Rossum2d951851994-08-29 12:52:16 +0000730 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000731 return result;
732
Guido van Rossum12d12c51993-10-26 17:58:25 +0000733Fail_1:
734 DECREF(result);
735Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000736 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000737 return NULL;
738}
739
740static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000741builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000742 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000743 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000744{
Guido van Rossum94390a41992-08-14 15:14:30 +0000745 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000746 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000747 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000748
749 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000750 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000751 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000752 return NULL;
753 INCREF(None);
754 return None;
755}
756
757static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000758builtin_delattr(self, args)
759 object *self;
760 object *args;
761{
762 object *v;
763 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000764
765 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000766 return NULL;
767 if (setattro(v, name, (object *)NULL) != 0)
768 return NULL;
769 INCREF(None);
770 return None;
771}
772
773static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000774builtin_hash(self, args)
775 object *self;
776 object *args;
777{
778 object *v;
779 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000780
781 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000782 return NULL;
783 x = hashobject(v);
784 if (x == -1)
785 return NULL;
786 return newintobject(x);
787}
788
789static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000790builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000791 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000792 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000793{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000794 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000795 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000796
797 if (!newgetargs(args, "O:hex", &v))
798 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000799
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000800 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000801 nb->nb_hex == NULL) {
802 err_setstr(TypeError,
803 "hex() argument can't be converted to hex");
804 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000805 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000806 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000807}
808
Guido van Rossum3165fe61992-09-25 21:59:05 +0000809static object *builtin_raw_input PROTO((object *, object *));
810
Guido van Rossum006bcd41991-10-24 14:54:44 +0000811static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000812builtin_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000813 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000814 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000815{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000816 object *line;
817 char *str;
818 object *res;
Guido van Rossum6135a871995-01-09 17:53:26 +0000819 object *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000820
821 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000822 if (line == NULL)
823 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000824 if (!getargs(line, "s;embedded '\\0' in input line", &str))
825 return NULL;
826 while (*str == ' ' || *str == '\t')
827 str++;
Guido van Rossum6135a871995-01-09 17:53:26 +0000828 globals = getglobals();
829 locals = getlocals();
830 if (dictlookup(globals, "__builtins__") == NULL) {
831 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
832 return NULL;
833 }
834 res = run_string(str, eval_input, globals, locals);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000835 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000836 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000837}
838
839static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000840builtin_int(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000841 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000842 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000843{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000844 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000845 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000846
847 if (!newgetargs(args, "O:int", &v))
848 return NULL;
849 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000850 nb->nb_int == NULL) {
851 err_setstr(TypeError,
852 "int() argument can't be converted to int");
853 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000854 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000855 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000856}
857
858static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000859builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000860 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000861 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000862{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000863 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000864 long len;
865 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000866
867 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000868 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000869 tp = v->ob_type;
870 if (tp->tp_as_sequence != NULL) {
871 len = (*tp->tp_as_sequence->sq_length)(v);
872 }
873 else if (tp->tp_as_mapping != NULL) {
874 len = (*tp->tp_as_mapping->mp_length)(v);
875 }
876 else {
877 err_setstr(TypeError, "len() of unsized object");
878 return NULL;
879 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000880 if (len < 0)
881 return NULL;
882 else
883 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000884}
885
886static object *
Guido van Rossumd1705771996-04-09 02:41:06 +0000887builtin_list(self, args)
888 object *self;
889 object *args;
890{
891 object *v;
892 sequence_methods *sqf;
893
894 if (!newgetargs(args, "O:list", &v))
895 return NULL;
896 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
897 int n = (*sqf->sq_length)(v);
898 int i;
899 object *l;
900 if (n < 0)
901 return NULL;
902 l = newlistobject(n);
903 if (l == NULL)
904 return NULL;
905 for (i = 0; i < n; i++) {
906 object *item = (*sqf->sq_item)(v, i);
907 if (item == NULL) {
908 DECREF(l);
909 l = NULL;
910 break;
911 }
912 setlistitem(l, i, item);
913 }
914 /* XXX Should support indefinite-length sequences */
915 return l;
916 }
917 err_setstr(TypeError, "list() argument must be a sequence");
918 return NULL;
919}
920
Guido van Rossum8861b741996-07-30 16:49:37 +0000921
922static PyObject *
923builtin_slice(self, args)
924 PyObject *self;
925 PyObject *args;
926{
927 PyObject *start, *stop, *step;
928
929 start = stop = step = NULL;
930
931 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
932 return NULL;
933
934 /*This swapping of stop and start is to maintain compatibility with
935 the range builtin.*/
936 if (stop == NULL) {
937 stop = start;
938 start = NULL;
939 }
940 return PySlice_New(start, stop, step);
941}
942
Guido van Rossumd1705771996-04-09 02:41:06 +0000943static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000944builtin_locals(self, args)
945 object *self;
946 object *args;
947{
948 object *d;
949
950 if (!newgetargs(args, ""))
951 return NULL;
952 d = getlocals();
953 INCREF(d);
954 return d;
955}
956
957static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000958builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000959 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000960 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000961{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000962 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000963 number_methods *nb;
964
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000965 if (!newgetargs(args, "O:long", &v))
966 return NULL;
967 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000968 nb->nb_long == NULL) {
969 err_setstr(TypeError,
970 "long() argument can't be converted to long");
971 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000972 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000973 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000974}
975
976static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000977min_max(args, sign)
978 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000979 int sign;
980{
Guido van Rossum2d951851994-08-29 12:52:16 +0000981 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000982 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000983 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000984
985 if (gettuplesize(args) > 1)
986 v = args;
987 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000988 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000989 sq = v->ob_type->tp_as_sequence;
990 if (sq == NULL) {
991 err_setstr(TypeError, "min() or max() of non-sequence");
992 return NULL;
993 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000994 w = NULL;
995 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000996 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000997 if (x == NULL) {
998 if (err_occurred() == IndexError) {
999 err_clear();
1000 break;
1001 }
1002 XDECREF(w);
1003 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001004 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001005 if (w == NULL)
1006 w = x;
1007 else {
1008 if (cmpobject(x, w) * sign > 0) {
1009 DECREF(w);
1010 w = x;
1011 }
1012 else
1013 DECREF(x);
1014 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001015 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001016 if (w == NULL)
1017 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001018 return w;
1019}
1020
1021static object *
1022builtin_min(self, v)
1023 object *self;
1024 object *v;
1025{
1026 return min_max(v, -1);
1027}
1028
1029static object *
1030builtin_max(self, v)
1031 object *self;
1032 object *v;
1033{
1034 return min_max(v, 1);
1035}
1036
1037static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001038builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001039 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001040 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001041{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001042 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001043 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001044
1045 if (!newgetargs(args, "O:oct", &v))
1046 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001047 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1048 nb->nb_oct == NULL) {
1049 err_setstr(TypeError,
1050 "oct() argument can't be converted to oct");
1051 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001052 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001053 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001054}
1055
1056static object *
Guido van Rossum94390a41992-08-14 15:14:30 +00001057builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001058 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +00001059 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001060{
Guido van Rossum2d951851994-08-29 12:52:16 +00001061 char *name;
1062 char *mode = "r";
1063 int bufsize = -1;
1064 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001065
1066 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001067 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001068 f = newfileobject(name, mode);
1069 if (f != NULL)
1070 setfilebufsize(f, bufsize);
1071 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001072}
1073
1074static object *
Guido van Rossum94390a41992-08-14 15:14:30 +00001075builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001076 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +00001077 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001078{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001079 char c;
1080
1081 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001082 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001083 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001084}
1085
1086static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001087do_pow(v, w)
1088 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +00001089{
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001090 object *res;
1091 if (is_instanceobject(v) || is_instanceobject(w))
1092 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001093 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +00001094 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +00001095 err_setstr(TypeError, "pow() requires numeric arguments");
1096 return NULL;
1097 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001098 if (
1099#ifndef WITHOUT_COMPLEX
1100 !is_complexobject(v) &&
1101#endif
1102 is_floatobject(w) && getfloatvalue(v) < 0.0) {
Guido van Rossum8a1e8eb1995-02-18 14:51:32 +00001103 if (!err_occurred())
1104 err_setstr(ValueError, "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +00001105 return NULL;
1106 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001107 if (coerce(&v, &w) != 0)
1108 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001109 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001110 DECREF(v);
1111 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001112 return res;
1113}
1114
1115static object *
1116builtin_pow(self, args)
1117 object *self;
1118 object *args;
1119{
1120 object *v, *w, *z = None, *res;
1121 object *v1, *z1, *w2, *z2;
1122
1123 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
1124 return NULL;
1125 if (z == None)
1126 return do_pow(v, w);
1127 /* XXX The ternary version doesn't do class instance coercions */
1128 if (is_instanceobject(v))
1129 return v->ob_type->tp_as_number->nb_power(v, w, z);
1130 if (v->ob_type->tp_as_number == NULL ||
1131 z->ob_type->tp_as_number == NULL ||
1132 w->ob_type->tp_as_number == NULL) {
1133 err_setstr(TypeError, "pow() requires numeric arguments");
1134 return NULL;
1135 }
1136 if (coerce(&v, &w) != 0)
1137 return NULL;
1138 res = NULL;
1139 v1 = v;
1140 z1 = z;
1141 if (coerce(&v1, &z1) != 0)
1142 goto error2;
1143 w2 = w;
1144 z2 = z1;
1145 if (coerce(&w2, &z2) != 0)
1146 goto error1;
1147 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
1148 DECREF(w2);
1149 DECREF(z2);
1150 error1:
1151 DECREF(v1);
1152 DECREF(z1);
1153 error2:
1154 DECREF(v);
1155 DECREF(w);
1156 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001157}
1158
1159static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001160builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001161 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001162 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001163{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001164 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001165 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001166 object *v;
1167
1168 if (gettuplesize(args) <= 1) {
1169 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001170 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001171 &ihigh))
1172 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001173 }
1174 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001175 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001176 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001177 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001178 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001179 }
1180 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001181 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001182 return NULL;
1183 }
1184 /* XXX ought to check overflow of subtraction */
1185 if (istep > 0)
1186 n = (ihigh - ilow + istep - 1) / istep;
1187 else
1188 n = (ihigh - ilow + istep + 1) / istep;
1189 if (n < 0)
1190 n = 0;
1191 v = newlistobject(n);
1192 if (v == NULL)
1193 return NULL;
1194 for (i = 0; i < n; i++) {
1195 object *w = newintobject(ilow);
1196 if (w == NULL) {
1197 DECREF(v);
1198 return NULL;
1199 }
1200 setlistitem(v, i, w);
1201 ilow += istep;
1202 }
1203 return v;
1204}
1205
1206static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001207builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001208 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001209 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001210{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001211 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001212 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001213
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001214 if (gettuplesize(args) <= 1) {
1215 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001216 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001217 &ihigh))
1218 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001219 }
1220 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001221 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001222 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001223 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001224 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001225 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001226 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001227 err_setstr(ValueError, "zero step for xrange()");
1228 return NULL;
1229 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001230 /* XXX ought to check overflow of subtraction */
1231 if (istep > 0)
1232 n = (ihigh - ilow + istep - 1) / istep;
1233 else
1234 n = (ihigh - ilow + istep + 1) / istep;
1235 if (n < 0)
1236 n = 0;
1237 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001238}
1239
Guido van Rossum872537c1995-07-07 22:43:42 +00001240extern char *my_readline PROTO((char *));
1241
Guido van Rossum12d12c51993-10-26 17:58:25 +00001242static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001243builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001244 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001245 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001246{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001247 object *v = NULL;
1248 object *f;
1249
1250 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001251 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001252 if (getfilefile(sysget("stdin")) == stdin &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001253 getfilefile(sysget("stdout")) == stdout &&
1254 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum872537c1995-07-07 22:43:42 +00001255 object *po;
1256 char *prompt;
1257 char *s;
1258 object *result;
1259 if (v != NULL) {
1260 po = strobject(v);
1261 if (po == NULL)
1262 return NULL;
1263 prompt = getstringvalue(po);
1264 }
1265 else {
1266 po = NULL;
1267 prompt = "";
1268 }
1269 s = my_readline(prompt);
1270 XDECREF(po);
1271 if (s == NULL) {
1272 err_set(KeyboardInterrupt);
1273 return NULL;
1274 }
1275 if (*s == '\0') {
1276 err_set(EOFError);
1277 result = NULL;
1278 }
1279 else { /* strip trailing '\n' */
1280 result = newsizedstringobject(s, strlen(s)-1);
1281 }
1282 free(s);
1283 return result;
1284 }
Guido van Rossum90933611991-06-07 16:10:43 +00001285 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001286 f = sysget("stdout");
1287 if (f == NULL) {
1288 err_setstr(RuntimeError, "lost sys.stdout");
1289 return NULL;
1290 }
1291 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001292 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001293 return NULL;
1294 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001295 f = sysget("stdin");
1296 if (f == NULL) {
1297 err_setstr(RuntimeError, "lost sys.stdin");
1298 return NULL;
1299 }
1300 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001301}
1302
1303static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001304builtin_reduce(self, args)
1305 object *self;
1306 object *args;
1307{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001308 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001309 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001310 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001311
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001312 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1313 return NULL;
1314 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001315 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001316
1317 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1318 err_setstr(TypeError,
1319 "2nd argument to reduce() must be a sequence object");
1320 return NULL;
1321 }
1322
Guido van Rossum12d12c51993-10-26 17:58:25 +00001323 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001324 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001325
Guido van Rossum2d951851994-08-29 12:52:16 +00001326 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001327 object *op2;
1328
1329 if (args->ob_refcnt > 1) {
1330 DECREF(args);
1331 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001332 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001333 }
1334
Guido van Rossum2d951851994-08-29 12:52:16 +00001335 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1336 if (err_occurred() == IndexError) {
1337 err_clear();
1338 break;
1339 }
1340 goto Fail;
1341 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001342
Guido van Rossum2d951851994-08-29 12:52:16 +00001343 if (result == NULL)
1344 result = op2;
1345 else {
1346 settupleitem(args, 0, result);
1347 settupleitem(args, 1, op2);
1348 if ((result = call_object(func, args)) == NULL)
1349 goto Fail;
1350 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001351 }
1352
1353 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001354
Guido van Rossum2d951851994-08-29 12:52:16 +00001355 if (result == NULL)
1356 err_setstr(TypeError,
1357 "reduce of empty sequence with no initial value");
1358
Guido van Rossum12d12c51993-10-26 17:58:25 +00001359 return result;
1360
Guido van Rossum2d951851994-08-29 12:52:16 +00001361Fail:
1362 XDECREF(args);
1363 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001364 return NULL;
1365}
1366
1367static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001368builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001369 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001370 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001371{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001372 object *v;
1373
1374 if (!newgetargs(args, "O:reload", &v))
1375 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001376 return reload_module(v);
1377}
1378
1379static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001380builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001381 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001382 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001383{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001384 object *v;
1385
1386 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001387 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001388 return reprobject(v);
1389}
1390
1391static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001392builtin_round(self, args)
1393 object *self;
1394 object *args;
1395{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001396 double x;
1397 double f;
1398 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001399 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001400
1401 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001402 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001403 f = 1.0;
1404 for (i = ndigits; --i >= 0; )
1405 f = f*10.0;
1406 for (i = ndigits; ++i <= 0; )
1407 f = f*0.1;
1408 if (x >= 0.0)
1409 return newfloatobject(floor(x*f + 0.5) / f);
1410 else
1411 return newfloatobject(ceil(x*f - 0.5) / f);
1412}
1413
1414static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001415builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001416 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001417 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001418{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001419 object *v;
1420
1421 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001422 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001423 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001424}
1425
1426static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001427builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001428 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001429 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001430{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001431 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001432 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001433
1434 if (!newgetargs(args, "O:tuple", &v))
1435 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001436 if (is_tupleobject(v)) {
1437 INCREF(v);
1438 return v;
1439 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001440 if (is_listobject(v))
1441 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001442 if (is_stringobject(v)) {
1443 int n = getstringsize(v);
1444 object *t = newtupleobject(n);
1445 if (t != NULL) {
1446 int i;
1447 char *p = getstringvalue(v);
1448 for (i = 0; i < n; i++) {
1449 object *item = newsizedstringobject(p+i, 1);
1450 if (item == NULL) {
1451 DECREF(t);
1452 t = NULL;
1453 break;
1454 }
1455 settupleitem(t, i, item);
1456 }
1457 }
1458 return t;
1459 }
1460 /* Generic sequence object */
1461 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1462 int n = (*sqf->sq_length)(v);
1463 int i;
1464 object *t;
1465 if (n < 0)
1466 return NULL;
1467 t = newtupleobject(n);
1468 if (t == NULL)
1469 return NULL;
1470 for (i = 0; i < n; i++) {
1471 object *item = (*sqf->sq_item)(v, i);
1472 if (item == NULL) {
1473 DECREF(t);
1474 t = NULL;
1475 break;
1476 }
1477 settupleitem(t, i, item);
1478 }
1479 /* XXX Should support indefinite-length sequences */
1480 return t;
1481 }
1482 /* None of the above */
1483 err_setstr(TypeError, "tuple() argument must be a sequence");
1484 return NULL;
1485}
1486
1487static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001488builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001489 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001490 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001491{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001492 object *v;
1493
1494 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001495 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001496 v = (object *)v->ob_type;
1497 INCREF(v);
1498 return v;
1499}
1500
Guido van Rossum2d951851994-08-29 12:52:16 +00001501static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001502builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001503 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001504 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001505{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001506 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001507 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001508
1509 if (!newgetargs(args, "|O:vars", &v))
1510 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001511 if (v == NULL) {
1512 d = getlocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001513 if (d == NULL) {
1514 if (!err_occurred())
1515 err_setstr(SystemError, "no locals!?");
1516 }
1517 else
1518 INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001519 }
1520 else {
1521 d = getattr(v, "__dict__");
1522 if (d == NULL) {
1523 err_setstr(TypeError,
1524 "vars() argument must have __dict__ attribute");
1525 return NULL;
1526 }
1527 }
1528 return d;
1529}
1530
Guido van Rossum3f5da241990-12-20 15:06:42 +00001531static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001532 {"__import__", builtin___import__, 1},
1533 {"abs", builtin_abs, 1},
1534 {"apply", builtin_apply, 1},
1535 {"callable", builtin_callable, 1},
1536 {"chr", builtin_chr, 1},
1537 {"cmp", builtin_cmp, 1},
1538 {"coerce", builtin_coerce, 1},
1539 {"compile", builtin_compile, 1},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001540#ifndef WITHOUT_COMPLEX
1541 {"complex", builtin_complex, 1},
1542#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001543 {"delattr", builtin_delattr, 1},
1544 {"dir", builtin_dir, 1},
1545 {"divmod", builtin_divmod, 1},
1546 {"eval", builtin_eval, 1},
1547 {"execfile", builtin_execfile, 1},
1548 {"filter", builtin_filter, 1},
1549 {"float", builtin_float, 1},
1550 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001551 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001552 {"hasattr", builtin_hasattr, 1},
1553 {"hash", builtin_hash, 1},
1554 {"hex", builtin_hex, 1},
1555 {"id", builtin_id, 1},
1556 {"input", builtin_input, 1},
1557 {"int", builtin_int, 1},
1558 {"len", builtin_len, 1},
Guido van Rossumd1705771996-04-09 02:41:06 +00001559 {"list", builtin_list, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001560 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001561 {"long", builtin_long, 1},
1562 {"map", builtin_map, 1},
1563 {"max", builtin_max, 1},
1564 {"min", builtin_min, 1},
1565 {"oct", builtin_oct, 1},
1566 {"open", builtin_open, 1},
1567 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001568 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001569 {"range", builtin_range, 1},
1570 {"raw_input", builtin_raw_input, 1},
1571 {"reduce", builtin_reduce, 1},
1572 {"reload", builtin_reload, 1},
1573 {"repr", builtin_repr, 1},
1574 {"round", builtin_round, 1},
1575 {"setattr", builtin_setattr, 1},
Guido van Rossum8861b741996-07-30 16:49:37 +00001576 {"slice", builtin_slice, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001577 {"str", builtin_str, 1},
1578 {"tuple", builtin_tuple, 1},
1579 {"type", builtin_type, 1},
1580 {"vars", builtin_vars, 1},
1581 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001582 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001583};
1584
Guido van Rossum0865dd91995-01-17 16:30:22 +00001585static object *builtin_mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001586static object *builtin_dict;
1587
1588object *
Guido van Rossum0865dd91995-01-17 16:30:22 +00001589getbuiltinmod()
1590{
1591 return builtin_mod;
1592}
1593
1594object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001595getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001596{
Guido van Rossum6135a871995-01-09 17:53:26 +00001597 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001598}
1599
1600/* Predefined exceptions */
1601
Guido van Rossum25831651993-05-19 14:50:45 +00001602object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001603object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001604object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001605object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001606object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001607object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001608object *IndexError;
1609object *KeyError;
1610object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001611object *MemoryError;
1612object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001613object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001614object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001615object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001616object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001617object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001618object *TypeError;
1619object *ValueError;
1620object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001621
Guido van Rossum3f5da241990-12-20 15:06:42 +00001622static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001623newstdexception(name)
1624 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001625{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001626 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001627 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1628 fatal("no mem for new standard exception");
1629 return v;
1630}
1631
1632static void
1633initerrors()
1634{
Guido van Rossum25831651993-05-19 14:50:45 +00001635 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001636 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001637 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001638 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001639 IOError = newstdexception("IOError");
1640 ImportError = newstdexception("ImportError");
1641 IndexError = newstdexception("IndexError");
1642 KeyError = newstdexception("KeyError");
1643 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001644 MemoryError = newstdexception("MemoryError");
1645 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001646 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001647 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001648 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001649 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001650 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001651 TypeError = newstdexception("TypeError");
1652 ValueError = newstdexception("ValueError");
1653 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001654}
1655
1656void
1657initbuiltin()
1658{
Guido van Rossum0865dd91995-01-17 16:30:22 +00001659 builtin_mod = initmodule("__builtin__", builtin_methods);
1660 builtin_dict = getmoduledict(builtin_mod);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001661 INCREF(builtin_dict);
1662 initerrors();
1663 (void) dictinsert(builtin_dict, "None", None);
Guido van Rossume449af71996-10-11 16:25:41 +00001664 (void) dictinsert(builtin_dict, "Ellipsis", Py_Ellipsis);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001665}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001666
Guido van Rossum12d12c51993-10-26 17:58:25 +00001667
Guido van Rossume77a7571993-11-03 15:01:26 +00001668/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001669
1670static object *
1671filtertuple(func, tuple)
1672 object *func;
1673 object *tuple;
1674{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001675 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001676 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001677 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001678
Guido van Rossumb7b45621995-08-04 04:07:45 +00001679 if (len == 0) {
1680 INCREF(tuple);
1681 return tuple;
1682 }
1683
Guido van Rossum2586bf01993-11-01 16:21:44 +00001684 if ((result = newtupleobject(len)) == NULL)
1685 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001686
Guido van Rossum12d12c51993-10-26 17:58:25 +00001687 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001688 object *item, *good;
1689 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001690
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001691 if ((item = gettupleitem(tuple, i)) == NULL)
1692 goto Fail_1;
1693 if (func == None) {
1694 INCREF(item);
1695 good = item;
1696 }
1697 else {
1698 object *arg = mkvalue("(O)", item);
1699 if (arg == NULL)
1700 goto Fail_1;
1701 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001702 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001703 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001704 goto Fail_1;
1705 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001706 ok = testbool(good);
1707 DECREF(good);
1708 if (ok) {
1709 INCREF(item);
1710 if (settupleitem(result, j++, item) < 0)
1711 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001712 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001713 }
1714
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001715 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001716 return NULL;
1717
Guido van Rossum12d12c51993-10-26 17:58:25 +00001718 return result;
1719
Guido van Rossum12d12c51993-10-26 17:58:25 +00001720Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001721 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001722 return NULL;
1723}
1724
1725
Guido van Rossume77a7571993-11-03 15:01:26 +00001726/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001727
1728static object *
1729filterstring(func, strobj)
1730 object *func;
1731 object *strobj;
1732{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001733 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001734 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001735 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001736
Guido van Rossum2586bf01993-11-01 16:21:44 +00001737 if (func == None) {
1738 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001739 INCREF(strobj);
1740 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001741 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001742 if ((result = newsizedstringobject(NULL, len)) == NULL)
1743 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001744
Guido van Rossum12d12c51993-10-26 17:58:25 +00001745 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001746 object *item, *arg, *good;
1747 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001748
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001749 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1750 if (item == NULL)
1751 goto Fail_1;
1752 arg = mkvalue("(O)", item);
1753 DECREF(item);
1754 if (arg == NULL)
1755 goto Fail_1;
1756 good = call_object(func, arg);
1757 DECREF(arg);
1758 if (good == NULL)
1759 goto Fail_1;
1760 ok = testbool(good);
1761 DECREF(good);
1762 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001763 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001764 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001765 }
1766
Guido van Rossum79d96d61996-08-16 20:44:34 +00001767 if (j < len && resizestring(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001768 return NULL;
1769
Guido van Rossum12d12c51993-10-26 17:58:25 +00001770 return result;
1771
Guido van Rossum12d12c51993-10-26 17:58:25 +00001772Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001773 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001774 return NULL;
1775}