blob: be86473d1c6e0fe266f950a909cfdb6e553df9b7 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum3f5da241990-12-20 15:06:42 +000025/* Built-in functions */
26
27#include "allobjects.h"
28
29#include "node.h"
30#include "graminit.h"
Guido van Rossum86cd6e61991-01-21 15:12:35 +000031#include "bltinmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000032#include "import.h"
Guido van Rossum5b722181993-03-30 17:46:03 +000033#include "compile.h"
34#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +000036#include "mymath.h"
37
Guido van Rossum12d12c51993-10-26 17:58:25 +000038/* Forward */
39static object *filterstring PROTO((object *, object *));
40static object *filtertuple PROTO((object *, object *));
Guido van Rossum12d12c51993-10-26 17:58:25 +000041
Guido van Rossum3f5da241990-12-20 15:06:42 +000042static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000043builtin___import__(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000044 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000045 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000046{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000047 char *name;
Guido van Rossum24c13741995-02-14 09:42:43 +000048 object *globals = NULL;
49 object *locals = NULL;
50 object *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000051
Guido van Rossum24c13741995-02-14 09:42:43 +000052 if (!newgetargs(args, "s|OOO:__import__",
53 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000054 return NULL;
Guido van Rossum7f9fa971995-01-20 16:53:12 +000055 return import_module(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000056}
57
58
59static object *
60builtin_abs(self, args)
61 object *self;
62 object *args;
63{
64 object *v;
Guido van Rossumd4905451991-05-05 20:00:36 +000065 number_methods *nm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000066
67 if (!newgetargs(args, "O:abs", &v))
68 return NULL;
69 if ((nm = v->ob_type->tp_as_number) == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +000070 err_setstr(TypeError, "abs() requires numeric argument");
71 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000072 }
Guido van Rossumd4905451991-05-05 20:00:36 +000073 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000074}
75
76static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000077builtin_apply(self, args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000078 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000079 object *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000080{
Guido van Rossumc96ef6a1996-01-26 20:44:30 +000081 object *func, *alist = NULL, *kwdict = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000082
Guido van Rossum681d79a1995-07-18 14:51:37 +000083 if (!newgetargs(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000084 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +000085 if (alist != NULL && !is_tupleobject(alist)) {
Guido van Rossum2d951851994-08-29 12:52:16 +000086 err_setstr(TypeError, "apply() 2nd argument must be tuple");
87 return NULL;
88 }
Guido van Rossum681d79a1995-07-18 14:51:37 +000089 if (kwdict != NULL && !is_dictobject(kwdict)) {
90 err_setstr(TypeError,
91 "apply() 3rd argument must be dictionary");
92 return NULL;
93 }
94 return PyEval_CallObjectWithKeywords(func, alist, kwdict);
Guido van Rossumc02e15c1991-12-16 13:03:00 +000095}
96
Guido van Rossum2d951851994-08-29 12:52:16 +000097static object *
98builtin_callable(self, args)
99 object *self;
100 object *args;
101{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000102 object *v;
103
104 if (!newgetargs(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000105 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000106 return newintobject((long)callable(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000107}
108
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000109static object *
Guido van Rossume77a7571993-11-03 15:01:26 +0000110builtin_filter(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000111 object *self;
112 object *args;
113{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000114 object *func, *seq, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000115 sequence_methods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000116 int len;
117 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000118
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000119 if (!newgetargs(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000120 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000121
Guido van Rossum12d12c51993-10-26 17:58:25 +0000122 if (is_stringobject(seq)) {
123 object *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000124 return r;
125 }
126
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000127 if (is_tupleobject(seq)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000128 object *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000129 return r;
130 }
131
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000132 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000133 err_setstr(TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000134 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000135 goto Fail_2;
136 }
137
138 if ((len = (*sqf->sq_length)(seq)) < 0)
139 goto Fail_2;
140
141 if (is_listobject(seq) && seq->ob_refcnt == 1) {
142 INCREF(seq);
143 result = seq;
144 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000145 else {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000146 if ((result = newlistobject(len)) == NULL)
147 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000148 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000149
Guido van Rossum2d951851994-08-29 12:52:16 +0000150 for (i = j = 0; ; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000151 object *item, *good;
152 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000153
Guido van Rossum2d951851994-08-29 12:52:16 +0000154 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
155 if (i < len)
156 goto Fail_1;
157 if (err_occurred() == IndexError) {
158 err_clear();
159 break;
160 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000161 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000162 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000163
164 if (func == None) {
165 good = item;
Guido van Rossum58b68731995-01-10 17:40:55 +0000166 INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000167 }
168 else {
169 object *arg = mkvalue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000170 if (arg == NULL)
171 goto Fail_1;
172 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000173 DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000174 if (good == NULL) {
175 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000176 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000177 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000178 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000179 ok = testbool(good);
180 DECREF(good);
181 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000182 if (j < len) {
183 if (setlistitem(result, j++, item) < 0)
184 goto Fail_1;
185 }
186 else {
187 j++;
188 if (addlistitem(result, item) < 0)
189 goto Fail_1;
190 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000191 } else {
192 DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000193 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000194 }
195
Guido van Rossum12d12c51993-10-26 17:58:25 +0000196
Guido van Rossum2d951851994-08-29 12:52:16 +0000197 if (j < len && setlistslice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000198 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000199
Guido van Rossum12d12c51993-10-26 17:58:25 +0000200 return result;
201
Guido van Rossum12d12c51993-10-26 17:58:25 +0000202Fail_1:
203 DECREF(result);
204Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000205 return NULL;
206}
207
208static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000209builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000210 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000211 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000212{
213 long x;
214 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000215
216 if (!newgetargs(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000217 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000218 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000219 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000220 return NULL;
221 }
222 s[0] = x;
223 return newsizedstringobject(s, 1);
224}
225
226static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000227builtin_cmp(self, args)
228 object *self;
229 object *args;
230{
231 object *a, *b;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000232
233 if (!newgetargs(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000234 return NULL;
235 return newintobject((long)cmpobject(a, b));
236}
237
238static object *
Guido van Rossum5524a591995-01-10 15:26:20 +0000239builtin_coerce(self, args)
240 object *self;
241 object *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000242{
Guido van Rossum5524a591995-01-10 15:26:20 +0000243 object *v, *w;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000244 object *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000245
246 if (!newgetargs(args, "OO:coerce", &v, &w))
247 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000248 if (coerce(&v, &w) < 0)
249 return NULL;
250 res = mkvalue("(OO)", v, w);
251 DECREF(v);
252 DECREF(w);
253 return res;
254}
255
256static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000257builtin_compile(self, args)
258 object *self;
259 object *args;
260{
261 char *str;
262 char *filename;
263 char *startstr;
264 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000265
266 if (!newgetargs(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000267 return NULL;
268 if (strcmp(startstr, "exec") == 0)
269 start = file_input;
270 else if (strcmp(startstr, "eval") == 0)
271 start = eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000272 else if (strcmp(startstr, "single") == 0)
273 start = single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000274 else {
275 err_setstr(ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000276 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000277 return NULL;
278 }
279 return compile_string(str, filename, start);
280}
281
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000282#ifndef WITHOUT_COMPLEX
283
284static object *
285builtin_complex(self, args)
286 object *self;
287 object *args;
288{
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000289 object *r, *i, *tmp;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000290 number_methods *nbr, *nbi;
Guido van Rossum530956d1996-07-21 02:27:43 +0000291 Py_complex cr, ci;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000292
293 i = NULL;
294 if (!newgetargs(args, "O|O:complex", &r, &i))
295 return NULL;
296 if ((nbr = r->ob_type->tp_as_number) == NULL ||
297 nbr->nb_float == NULL || (i != NULL &&
298 ((nbi = i->ob_type->tp_as_number) == NULL ||
299 nbi->nb_float == NULL))) {
300 err_setstr(TypeError,
301 "complex() argument can't be converted to complex");
302 return NULL;
303 }
304 if (is_complexobject(r))
305 cr = ((complexobject*)r)->cval;
306 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000307 tmp = (*nbr->nb_float)(r);
308 if (tmp == NULL)
309 return NULL;
310 cr.real = getfloatvalue(tmp);
311 DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000312 cr.imag = 0.;
313 }
314 if (i == NULL) {
315 ci.real = 0.;
316 ci.imag = 0.;
317 }
318 else if (is_complexobject(i))
319 ci = ((complexobject*)i)->cval;
320 else {
Guido van Rossumb0721501996-09-07 15:55:27 +0000321 tmp = (*nbr->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000322 if (tmp == NULL)
323 return NULL;
324 ci.real = getfloatvalue(tmp);
325 DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000326 ci.imag = 0.;
327 }
328 cr.real -= ci.imag;
329 cr.imag += ci.real;
330 return newcomplexobject(cr);
331}
332
333#endif
334
Guido van Rossum5b722181993-03-30 17:46:03 +0000335static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000336builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000337 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000338 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000339{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000340 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000341 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000342
343 if (!newgetargs(args, "|O:dir", &v))
344 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000345 if (v == NULL) {
346 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000347 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000348 }
349 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000350 d = getattr(v, "__dict__");
351 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000352 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000353 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000354 return NULL;
355 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000356 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000357 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000358 v = getdictkeys(d);
359 if (sortlist(v) != 0) {
360 DECREF(v);
361 v = NULL;
362 }
363 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000364 else {
Guido van Rossum795ba581996-05-23 22:49:07 +0000365 v = PyObject_CallMethod(d, "keys", NULL);
366 if (v == NULL) {
367 PyErr_Clear();
368 v = newlistobject(0);
369 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000370 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000371 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000372 return v;
373}
374
375static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000376do_divmod(v, w)
377 object *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000378{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000379 object *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000380
Guido van Rossum180d7b41994-09-29 09:45:57 +0000381 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000382 return instancebinop(v, w, "__divmod__", "__rdivmod__",
383 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000384 if (v->ob_type->tp_as_number == NULL ||
385 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000386 err_setstr(TypeError,
387 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000388 return NULL;
389 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000390 if (coerce(&v, &w) != 0)
391 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000392 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000393 DECREF(v);
394 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000395 return res;
396}
397
398static object *
399builtin_divmod(self, args)
400 object *self;
401 object *args;
402{
403 object *v, *w;
404
405 if (!newgetargs(args, "OO:divmod", &v, &w))
406 return NULL;
407 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000408}
409
410static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000411builtin_eval(self, args)
412 object *self;
413 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000414{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000415 object *cmd;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000416 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000417 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000418
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000419 if (!newgetargs(args, "O|O!O!:eval",
420 &cmd,
421 &Mappingtype, &globals,
422 &Mappingtype, &locals))
423 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000424 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000425 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000426 if (locals == None)
427 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000428 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000429 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000430 locals = globals;
431 if (dictlookup(globals, "__builtins__") == NULL) {
432 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
433 return NULL;
434 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435 if (is_codeobject(cmd))
Guido van Rossum681d79a1995-07-18 14:51:37 +0000436 return eval_code((codeobject *) cmd, globals, locals);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000437 if (!is_stringobject(cmd)) {
438 err_setstr(TypeError,
439 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000440 return NULL;
441 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442 str = getstringvalue(cmd);
443 if (strlen(str) != getstringsize(cmd)) {
444 err_setstr(ValueError,
445 "embedded '\\0' in string arg");
446 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000447 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000448 while (*str == ' ' || *str == '\t')
449 str++;
450 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000451}
452
453static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000454builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000455 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000456 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000457{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458 char *filename;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000459 object *globals = None, *locals = None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000460 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000461 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000462
463 if (!newgetargs(args, "s|O!O!:execfile",
464 &filename,
465 &Mappingtype, &globals,
466 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000467 return NULL;
Guido van Rossum84eaa831995-01-10 10:47:05 +0000468 if (globals == None) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000469 globals = getglobals();
Guido van Rossum84eaa831995-01-10 10:47:05 +0000470 if (locals == None)
471 locals = getlocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000472 }
Guido van Rossum84eaa831995-01-10 10:47:05 +0000473 else if (locals == None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000474 locals = globals;
475 if (dictlookup(globals, "__builtins__") == NULL) {
476 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
477 return NULL;
478 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000479 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000480 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000481 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000482 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000483 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000484 return NULL;
485 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000486 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000487 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000488 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000489 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000490 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000491}
492
493static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000494builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000495 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000496 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000497{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000498 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000499 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000500
501 if (!newgetargs(args, "O:float", &v))
502 return NULL;
503 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000504 nb->nb_float == NULL) {
505 err_setstr(TypeError,
506 "float() argument can't be converted to float");
507 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000508 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000509 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000510}
511
512static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000513builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000514 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000515 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000516{
Guido van Rossum94390a41992-08-14 15:14:30 +0000517 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000518 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000519
520 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000521 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000522 return getattro(v, name);
523}
524
525static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000526builtin_globals(self, args)
527 object *self;
528 object *args;
529{
530 object *d;
531
532 if (!newgetargs(args, ""))
533 return NULL;
534 d = getglobals();
535 INCREF(d);
536 return d;
537}
538
539static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000540builtin_hasattr(self, args)
541 object *self;
542 object *args;
543{
544 object *v;
545 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000546
547 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000548 return NULL;
549 v = getattro(v, name);
550 if (v == NULL) {
551 err_clear();
552 return newintobject(0L);
553 }
554 DECREF(v);
555 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000556}
557
558static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000559builtin_id(self, args)
560 object *self;
561 object *args;
562{
563 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000564
565 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000566 return NULL;
567 return newintobject((long)v);
568}
569
570static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000571builtin_map(self, args)
572 object *self;
573 object *args;
574{
575 typedef struct {
576 object *seq;
577 sequence_methods *sqf;
578 int len;
579 } sequence;
580
581 object *func, *result;
582 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000583 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000584 register int i, j;
585
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000586 n = gettuplesize(args);
587 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000588 err_setstr(TypeError, "map() requires at least two args");
589 return NULL;
590 }
591
592 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000593 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000594
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000595 if ((seqs = NEW(sequence, n)) == NULL) {
596 err_nomem();
597 goto Fail_2;
598 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000599
Guido van Rossum2d951851994-08-29 12:52:16 +0000600 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000601 int curlen;
602
603 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
604 goto Fail_2;
605
606 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
607 static char errmsg[] =
608 "argument %d to map() must be a sequence object";
609 char errbuf[sizeof(errmsg) + 3];
610
611 sprintf(errbuf, errmsg, i+2);
612 err_setstr(TypeError, errbuf);
613 goto Fail_2;
614 }
615
616 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
617 goto Fail_2;
618
619 if (curlen > len)
620 len = curlen;
621 }
622
623 if ((result = (object *) newlistobject(len)) == NULL)
624 goto Fail_2;
625
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000626 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000627 for (i = 0; ; ++i) {
Guido van Rossum32120311995-07-10 13:52:21 +0000628 object *alist, *item, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000629 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000630
Guido van Rossum2d951851994-08-29 12:52:16 +0000631 if (func == None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000632 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000633 else {
Guido van Rossum32120311995-07-10 13:52:21 +0000634 if ((alist = newtupleobject(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000635 goto Fail_1;
636 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000637
638 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000639 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000640 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000641 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000642 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000643 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000644 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000645 if (item == NULL) {
646 if (i < sqp->len)
647 goto Fail_0;
648 if (err_occurred() == IndexError) {
649 err_clear();
650 INCREF(None);
651 item = None;
652 sqp->len = -1;
653 }
654 else {
655 goto Fail_0;
656 }
657 }
658 else
659 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000660
Guido van Rossum12d12c51993-10-26 17:58:25 +0000661 }
Guido van Rossum32120311995-07-10 13:52:21 +0000662 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +0000663 break;
Guido van Rossum32120311995-07-10 13:52:21 +0000664 if (settupleitem(alist, j, item) < 0) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000665 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000666 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000667 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000668 continue;
669
670 Fail_0:
Guido van Rossum32120311995-07-10 13:52:21 +0000671 XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000672 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000673 }
674
Guido van Rossum32120311995-07-10 13:52:21 +0000675 if (!alist)
676 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000677
678 if (!any) {
Guido van Rossum32120311995-07-10 13:52:21 +0000679 DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000680 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000681 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000682
683 if (func == None)
Guido van Rossum32120311995-07-10 13:52:21 +0000684 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000685 else {
Guido van Rossum32120311995-07-10 13:52:21 +0000686 value = call_object(func, alist);
687 DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000688 if (value == NULL)
689 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000690 }
691 if (i >= len) {
692 if (addlistitem(result, value) < 0)
693 goto Fail_1;
694 }
695 else {
696 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000697 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000698 }
699 }
700
Guido van Rossum2d951851994-08-29 12:52:16 +0000701 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000702 return result;
703
Guido van Rossum12d12c51993-10-26 17:58:25 +0000704Fail_1:
705 DECREF(result);
706Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000707 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000708 return NULL;
709}
710
711static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000712builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000713 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000714 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000715{
Guido van Rossum94390a41992-08-14 15:14:30 +0000716 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000717 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000718 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000719
720 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000721 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000722 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000723 return NULL;
724 INCREF(None);
725 return None;
726}
727
728static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000729builtin_delattr(self, args)
730 object *self;
731 object *args;
732{
733 object *v;
734 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000735
736 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000737 return NULL;
738 if (setattro(v, name, (object *)NULL) != 0)
739 return NULL;
740 INCREF(None);
741 return None;
742}
743
744static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000745builtin_hash(self, args)
746 object *self;
747 object *args;
748{
749 object *v;
750 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000751
752 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000753 return NULL;
754 x = hashobject(v);
755 if (x == -1)
756 return NULL;
757 return newintobject(x);
758}
759
760static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000761builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000762 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000763 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000764{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000765 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000766 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000767
768 if (!newgetargs(args, "O:hex", &v))
769 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000770
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000771 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000772 nb->nb_hex == NULL) {
773 err_setstr(TypeError,
774 "hex() argument can't be converted to hex");
775 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000776 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000777 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000778}
779
Guido van Rossum3165fe61992-09-25 21:59:05 +0000780static object *builtin_raw_input PROTO((object *, object *));
781
Guido van Rossum006bcd41991-10-24 14:54:44 +0000782static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000783builtin_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000784 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000785 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000786{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000787 object *line;
788 char *str;
789 object *res;
Guido van Rossum6135a871995-01-09 17:53:26 +0000790 object *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000791
792 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000793 if (line == NULL)
794 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000795 if (!getargs(line, "s;embedded '\\0' in input line", &str))
796 return NULL;
797 while (*str == ' ' || *str == '\t')
798 str++;
Guido van Rossum6135a871995-01-09 17:53:26 +0000799 globals = getglobals();
800 locals = getlocals();
801 if (dictlookup(globals, "__builtins__") == NULL) {
802 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0)
803 return NULL;
804 }
805 res = run_string(str, eval_input, globals, locals);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000806 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000808}
809
810static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000811builtin_int(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000812 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000813 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000814{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000815 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000816 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000817
818 if (!newgetargs(args, "O:int", &v))
819 return NULL;
820 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000821 nb->nb_int == NULL) {
822 err_setstr(TypeError,
823 "int() argument can't be converted to int");
824 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000825 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000826 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000827}
828
829static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000830builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000831 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000832 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000833{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000834 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000835 long len;
836 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000837
838 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000839 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000840 tp = v->ob_type;
841 if (tp->tp_as_sequence != NULL) {
842 len = (*tp->tp_as_sequence->sq_length)(v);
843 }
844 else if (tp->tp_as_mapping != NULL) {
845 len = (*tp->tp_as_mapping->mp_length)(v);
846 }
847 else {
848 err_setstr(TypeError, "len() of unsized object");
849 return NULL;
850 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000851 if (len < 0)
852 return NULL;
853 else
854 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000855}
856
857static object *
Guido van Rossumd1705771996-04-09 02:41:06 +0000858builtin_list(self, args)
859 object *self;
860 object *args;
861{
862 object *v;
863 sequence_methods *sqf;
864
865 if (!newgetargs(args, "O:list", &v))
866 return NULL;
867 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
868 int n = (*sqf->sq_length)(v);
869 int i;
870 object *l;
871 if (n < 0)
872 return NULL;
873 l = newlistobject(n);
874 if (l == NULL)
875 return NULL;
876 for (i = 0; i < n; i++) {
877 object *item = (*sqf->sq_item)(v, i);
878 if (item == NULL) {
879 DECREF(l);
880 l = NULL;
881 break;
882 }
883 setlistitem(l, i, item);
884 }
885 /* XXX Should support indefinite-length sequences */
886 return l;
887 }
888 err_setstr(TypeError, "list() argument must be a sequence");
889 return NULL;
890}
891
Guido van Rossum8861b741996-07-30 16:49:37 +0000892
893static PyObject *
894builtin_slice(self, args)
895 PyObject *self;
896 PyObject *args;
897{
898 PyObject *start, *stop, *step;
899
900 start = stop = step = NULL;
901
902 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
903 return NULL;
904
905 /*This swapping of stop and start is to maintain compatibility with
906 the range builtin.*/
907 if (stop == NULL) {
908 stop = start;
909 start = NULL;
910 }
911 return PySlice_New(start, stop, step);
912}
913
Guido van Rossumd1705771996-04-09 02:41:06 +0000914static object *
Guido van Rossum872537c1995-07-07 22:43:42 +0000915builtin_locals(self, args)
916 object *self;
917 object *args;
918{
919 object *d;
920
921 if (!newgetargs(args, ""))
922 return NULL;
923 d = getlocals();
924 INCREF(d);
925 return d;
926}
927
928static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000929builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000930 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000931 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000932{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000933 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000934 number_methods *nb;
935
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000936 if (!newgetargs(args, "O:long", &v))
937 return NULL;
938 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000939 nb->nb_long == NULL) {
940 err_setstr(TypeError,
941 "long() argument can't be converted to long");
942 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000943 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000944 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000945}
946
947static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000948min_max(args, sign)
949 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000950 int sign;
951{
Guido van Rossum2d951851994-08-29 12:52:16 +0000952 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000953 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000954 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000955
956 if (gettuplesize(args) > 1)
957 v = args;
958 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000959 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000960 sq = v->ob_type->tp_as_sequence;
961 if (sq == NULL) {
962 err_setstr(TypeError, "min() or max() of non-sequence");
963 return NULL;
964 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000965 w = NULL;
966 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000967 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000968 if (x == NULL) {
969 if (err_occurred() == IndexError) {
970 err_clear();
971 break;
972 }
973 XDECREF(w);
974 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000975 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000976 if (w == NULL)
977 w = x;
978 else {
979 if (cmpobject(x, w) * sign > 0) {
980 DECREF(w);
981 w = x;
982 }
983 else
984 DECREF(x);
985 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000986 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000987 if (w == NULL)
988 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000989 return w;
990}
991
992static object *
993builtin_min(self, v)
994 object *self;
995 object *v;
996{
997 return min_max(v, -1);
998}
999
1000static object *
1001builtin_max(self, v)
1002 object *self;
1003 object *v;
1004{
1005 return min_max(v, 1);
1006}
1007
1008static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001009builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001010 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001011 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001012{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001013 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001014 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001015
1016 if (!newgetargs(args, "O:oct", &v))
1017 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001018 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1019 nb->nb_oct == NULL) {
1020 err_setstr(TypeError,
1021 "oct() argument can't be converted to oct");
1022 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001023 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001024 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001025}
1026
1027static object *
Guido van Rossum94390a41992-08-14 15:14:30 +00001028builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001029 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +00001030 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001031{
Guido van Rossum2d951851994-08-29 12:52:16 +00001032 char *name;
1033 char *mode = "r";
1034 int bufsize = -1;
1035 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001036
1037 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001038 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001039 f = newfileobject(name, mode);
1040 if (f != NULL)
1041 setfilebufsize(f, bufsize);
1042 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001043}
1044
1045static object *
Guido van Rossum94390a41992-08-14 15:14:30 +00001046builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001047 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +00001048 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001049{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001050 char c;
1051
1052 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001053 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001054 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001055}
1056
1057static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001058do_pow(v, w)
1059 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +00001060{
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001061 object *res;
1062 if (is_instanceobject(v) || is_instanceobject(w))
1063 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001064 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +00001065 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +00001066 err_setstr(TypeError, "pow() requires numeric arguments");
1067 return NULL;
1068 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001069 if (
1070#ifndef WITHOUT_COMPLEX
1071 !is_complexobject(v) &&
1072#endif
1073 is_floatobject(w) && getfloatvalue(v) < 0.0) {
Guido van Rossum8a1e8eb1995-02-18 14:51:32 +00001074 if (!err_occurred())
1075 err_setstr(ValueError, "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +00001076 return NULL;
1077 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001078 if (coerce(&v, &w) != 0)
1079 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001080 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001081 DECREF(v);
1082 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001083 return res;
1084}
1085
1086static object *
1087builtin_pow(self, args)
1088 object *self;
1089 object *args;
1090{
1091 object *v, *w, *z = None, *res;
1092 object *v1, *z1, *w2, *z2;
1093
1094 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
1095 return NULL;
1096 if (z == None)
1097 return do_pow(v, w);
1098 /* XXX The ternary version doesn't do class instance coercions */
1099 if (is_instanceobject(v))
1100 return v->ob_type->tp_as_number->nb_power(v, w, z);
1101 if (v->ob_type->tp_as_number == NULL ||
1102 z->ob_type->tp_as_number == NULL ||
1103 w->ob_type->tp_as_number == NULL) {
1104 err_setstr(TypeError, "pow() requires numeric arguments");
1105 return NULL;
1106 }
1107 if (coerce(&v, &w) != 0)
1108 return NULL;
1109 res = NULL;
1110 v1 = v;
1111 z1 = z;
1112 if (coerce(&v1, &z1) != 0)
1113 goto error2;
1114 w2 = w;
1115 z2 = z1;
1116 if (coerce(&w2, &z2) != 0)
1117 goto error1;
1118 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
1119 DECREF(w2);
1120 DECREF(z2);
1121 error1:
1122 DECREF(v1);
1123 DECREF(z1);
1124 error2:
1125 DECREF(v);
1126 DECREF(w);
1127 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001128}
1129
1130static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001131builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001132 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001133 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001134{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001135 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001136 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001137 object *v;
1138
1139 if (gettuplesize(args) <= 1) {
1140 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001141 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001142 &ihigh))
1143 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001144 }
1145 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001146 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001147 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001148 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001149 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001150 }
1151 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001152 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001153 return NULL;
1154 }
1155 /* XXX ought to check overflow of subtraction */
1156 if (istep > 0)
1157 n = (ihigh - ilow + istep - 1) / istep;
1158 else
1159 n = (ihigh - ilow + istep + 1) / istep;
1160 if (n < 0)
1161 n = 0;
1162 v = newlistobject(n);
1163 if (v == NULL)
1164 return NULL;
1165 for (i = 0; i < n; i++) {
1166 object *w = newintobject(ilow);
1167 if (w == NULL) {
1168 DECREF(v);
1169 return NULL;
1170 }
1171 setlistitem(v, i, w);
1172 ilow += istep;
1173 }
1174 return v;
1175}
1176
1177static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001178builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001179 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001180 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001181{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001182 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001183 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001184
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001185 if (gettuplesize(args) <= 1) {
1186 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001187 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001188 &ihigh))
1189 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001190 }
1191 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001192 if (!newgetargs(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001193 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001194 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001195 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001196 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001197 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001198 err_setstr(ValueError, "zero step for xrange()");
1199 return NULL;
1200 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001201 /* XXX ought to check overflow of subtraction */
1202 if (istep > 0)
1203 n = (ihigh - ilow + istep - 1) / istep;
1204 else
1205 n = (ihigh - ilow + istep + 1) / istep;
1206 if (n < 0)
1207 n = 0;
1208 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001209}
1210
Guido van Rossum872537c1995-07-07 22:43:42 +00001211extern char *my_readline PROTO((char *));
1212
Guido van Rossum12d12c51993-10-26 17:58:25 +00001213static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001214builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001215 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001216 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001217{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001218 object *v = NULL;
1219 object *f;
1220
1221 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001222 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001223 if (getfilefile(sysget("stdin")) == stdin &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001224 getfilefile(sysget("stdout")) == stdout &&
1225 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum872537c1995-07-07 22:43:42 +00001226 object *po;
1227 char *prompt;
1228 char *s;
1229 object *result;
1230 if (v != NULL) {
1231 po = strobject(v);
1232 if (po == NULL)
1233 return NULL;
1234 prompt = getstringvalue(po);
1235 }
1236 else {
1237 po = NULL;
1238 prompt = "";
1239 }
1240 s = my_readline(prompt);
1241 XDECREF(po);
1242 if (s == NULL) {
1243 err_set(KeyboardInterrupt);
1244 return NULL;
1245 }
1246 if (*s == '\0') {
1247 err_set(EOFError);
1248 result = NULL;
1249 }
1250 else { /* strip trailing '\n' */
1251 result = newsizedstringobject(s, strlen(s)-1);
1252 }
1253 free(s);
1254 return result;
1255 }
Guido van Rossum90933611991-06-07 16:10:43 +00001256 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001257 f = sysget("stdout");
1258 if (f == NULL) {
1259 err_setstr(RuntimeError, "lost sys.stdout");
1260 return NULL;
1261 }
1262 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001263 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001264 return NULL;
1265 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001266 f = sysget("stdin");
1267 if (f == NULL) {
1268 err_setstr(RuntimeError, "lost sys.stdin");
1269 return NULL;
1270 }
1271 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001272}
1273
1274static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001275builtin_reduce(self, args)
1276 object *self;
1277 object *args;
1278{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001279 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001280 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001281 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001282
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001283 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1284 return NULL;
1285 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001286 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001287
1288 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1289 err_setstr(TypeError,
1290 "2nd argument to reduce() must be a sequence object");
1291 return NULL;
1292 }
1293
Guido van Rossum12d12c51993-10-26 17:58:25 +00001294 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001295 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001296
Guido van Rossum2d951851994-08-29 12:52:16 +00001297 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001298 object *op2;
1299
1300 if (args->ob_refcnt > 1) {
1301 DECREF(args);
1302 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001303 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001304 }
1305
Guido van Rossum2d951851994-08-29 12:52:16 +00001306 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1307 if (err_occurred() == IndexError) {
1308 err_clear();
1309 break;
1310 }
1311 goto Fail;
1312 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001313
Guido van Rossum2d951851994-08-29 12:52:16 +00001314 if (result == NULL)
1315 result = op2;
1316 else {
1317 settupleitem(args, 0, result);
1318 settupleitem(args, 1, op2);
1319 if ((result = call_object(func, args)) == NULL)
1320 goto Fail;
1321 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001322 }
1323
1324 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001325
Guido van Rossum2d951851994-08-29 12:52:16 +00001326 if (result == NULL)
1327 err_setstr(TypeError,
1328 "reduce of empty sequence with no initial value");
1329
Guido van Rossum12d12c51993-10-26 17:58:25 +00001330 return result;
1331
Guido van Rossum2d951851994-08-29 12:52:16 +00001332Fail:
1333 XDECREF(args);
1334 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001335 return NULL;
1336}
1337
1338static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001339builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001340 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001341 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001342{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001343 object *v;
1344
1345 if (!newgetargs(args, "O:reload", &v))
1346 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001347 return reload_module(v);
1348}
1349
1350static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001351builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001352 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001353 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001354{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001355 object *v;
1356
1357 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001358 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001359 return reprobject(v);
1360}
1361
1362static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001363builtin_round(self, args)
1364 object *self;
1365 object *args;
1366{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001367 double x;
1368 double f;
1369 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001370 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001371
1372 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001373 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001374 f = 1.0;
1375 for (i = ndigits; --i >= 0; )
1376 f = f*10.0;
1377 for (i = ndigits; ++i <= 0; )
1378 f = f*0.1;
1379 if (x >= 0.0)
1380 return newfloatobject(floor(x*f + 0.5) / f);
1381 else
1382 return newfloatobject(ceil(x*f - 0.5) / f);
1383}
1384
1385static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001386builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001387 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001388 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001389{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001390 object *v;
1391
1392 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001393 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001394 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001395}
1396
1397static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001398builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001399 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001400 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001401{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001402 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001403 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001404
1405 if (!newgetargs(args, "O:tuple", &v))
1406 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001407 if (is_tupleobject(v)) {
1408 INCREF(v);
1409 return v;
1410 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001411 if (is_listobject(v))
1412 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001413 if (is_stringobject(v)) {
1414 int n = getstringsize(v);
1415 object *t = newtupleobject(n);
1416 if (t != NULL) {
1417 int i;
1418 char *p = getstringvalue(v);
1419 for (i = 0; i < n; i++) {
1420 object *item = newsizedstringobject(p+i, 1);
1421 if (item == NULL) {
1422 DECREF(t);
1423 t = NULL;
1424 break;
1425 }
1426 settupleitem(t, i, item);
1427 }
1428 }
1429 return t;
1430 }
1431 /* Generic sequence object */
1432 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1433 int n = (*sqf->sq_length)(v);
1434 int i;
1435 object *t;
1436 if (n < 0)
1437 return NULL;
1438 t = newtupleobject(n);
1439 if (t == NULL)
1440 return NULL;
1441 for (i = 0; i < n; i++) {
1442 object *item = (*sqf->sq_item)(v, i);
1443 if (item == NULL) {
1444 DECREF(t);
1445 t = NULL;
1446 break;
1447 }
1448 settupleitem(t, i, item);
1449 }
1450 /* XXX Should support indefinite-length sequences */
1451 return t;
1452 }
1453 /* None of the above */
1454 err_setstr(TypeError, "tuple() argument must be a sequence");
1455 return NULL;
1456}
1457
1458static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001459builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001460 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001461 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001462{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001463 object *v;
1464
1465 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001466 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001467 v = (object *)v->ob_type;
1468 INCREF(v);
1469 return v;
1470}
1471
Guido van Rossum2d951851994-08-29 12:52:16 +00001472static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001473builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001474 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001475 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001476{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001477 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001478 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001479
1480 if (!newgetargs(args, "|O:vars", &v))
1481 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001482 if (v == NULL) {
1483 d = getlocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001484 if (d == NULL) {
1485 if (!err_occurred())
1486 err_setstr(SystemError, "no locals!?");
1487 }
1488 else
1489 INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001490 }
1491 else {
1492 d = getattr(v, "__dict__");
1493 if (d == NULL) {
1494 err_setstr(TypeError,
1495 "vars() argument must have __dict__ attribute");
1496 return NULL;
1497 }
1498 }
1499 return d;
1500}
1501
Guido van Rossum3f5da241990-12-20 15:06:42 +00001502static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001503 {"__import__", builtin___import__, 1},
1504 {"abs", builtin_abs, 1},
1505 {"apply", builtin_apply, 1},
1506 {"callable", builtin_callable, 1},
1507 {"chr", builtin_chr, 1},
1508 {"cmp", builtin_cmp, 1},
1509 {"coerce", builtin_coerce, 1},
1510 {"compile", builtin_compile, 1},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001511#ifndef WITHOUT_COMPLEX
1512 {"complex", builtin_complex, 1},
1513#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001514 {"delattr", builtin_delattr, 1},
1515 {"dir", builtin_dir, 1},
1516 {"divmod", builtin_divmod, 1},
1517 {"eval", builtin_eval, 1},
1518 {"execfile", builtin_execfile, 1},
1519 {"filter", builtin_filter, 1},
1520 {"float", builtin_float, 1},
1521 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001522 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001523 {"hasattr", builtin_hasattr, 1},
1524 {"hash", builtin_hash, 1},
1525 {"hex", builtin_hex, 1},
1526 {"id", builtin_id, 1},
1527 {"input", builtin_input, 1},
1528 {"int", builtin_int, 1},
1529 {"len", builtin_len, 1},
Guido van Rossumd1705771996-04-09 02:41:06 +00001530 {"list", builtin_list, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001531 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001532 {"long", builtin_long, 1},
1533 {"map", builtin_map, 1},
1534 {"max", builtin_max, 1},
1535 {"min", builtin_min, 1},
1536 {"oct", builtin_oct, 1},
1537 {"open", builtin_open, 1},
1538 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001539 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001540 {"range", builtin_range, 1},
1541 {"raw_input", builtin_raw_input, 1},
1542 {"reduce", builtin_reduce, 1},
1543 {"reload", builtin_reload, 1},
1544 {"repr", builtin_repr, 1},
1545 {"round", builtin_round, 1},
1546 {"setattr", builtin_setattr, 1},
Guido van Rossum8861b741996-07-30 16:49:37 +00001547 {"slice", builtin_slice, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001548 {"str", builtin_str, 1},
1549 {"tuple", builtin_tuple, 1},
1550 {"type", builtin_type, 1},
1551 {"vars", builtin_vars, 1},
1552 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001553 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001554};
1555
Guido van Rossum0865dd91995-01-17 16:30:22 +00001556static object *builtin_mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001557static object *builtin_dict;
1558
1559object *
Guido van Rossum0865dd91995-01-17 16:30:22 +00001560getbuiltinmod()
1561{
1562 return builtin_mod;
1563}
1564
1565object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001566getbuiltindict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001567{
Guido van Rossum6135a871995-01-09 17:53:26 +00001568 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001569}
1570
1571/* Predefined exceptions */
1572
Guido van Rossum25831651993-05-19 14:50:45 +00001573object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001574object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001575object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001576object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001577object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001578object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001579object *IndexError;
1580object *KeyError;
1581object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001582object *MemoryError;
1583object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001584object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001585object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001586object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001587object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001588object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001589object *TypeError;
1590object *ValueError;
1591object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001592
Guido van Rossum3f5da241990-12-20 15:06:42 +00001593static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001594newstdexception(name)
1595 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001596{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001597 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001598 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1599 fatal("no mem for new standard exception");
1600 return v;
1601}
1602
1603static void
1604initerrors()
1605{
Guido van Rossum25831651993-05-19 14:50:45 +00001606 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001607 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001608 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001609 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001610 IOError = newstdexception("IOError");
1611 ImportError = newstdexception("ImportError");
1612 IndexError = newstdexception("IndexError");
1613 KeyError = newstdexception("KeyError");
1614 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001615 MemoryError = newstdexception("MemoryError");
1616 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001617 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001618 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001619 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001620 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001621 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001622 TypeError = newstdexception("TypeError");
1623 ValueError = newstdexception("ValueError");
1624 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001625}
1626
1627void
1628initbuiltin()
1629{
Guido van Rossum0865dd91995-01-17 16:30:22 +00001630 builtin_mod = initmodule("__builtin__", builtin_methods);
1631 builtin_dict = getmoduledict(builtin_mod);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001632 INCREF(builtin_dict);
1633 initerrors();
1634 (void) dictinsert(builtin_dict, "None", None);
Guido van Rossume449af71996-10-11 16:25:41 +00001635 (void) dictinsert(builtin_dict, "Ellipsis", Py_Ellipsis);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001636}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001637
Guido van Rossum12d12c51993-10-26 17:58:25 +00001638
Guido van Rossume77a7571993-11-03 15:01:26 +00001639/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001640
1641static object *
1642filtertuple(func, tuple)
1643 object *func;
1644 object *tuple;
1645{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001646 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001647 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001648 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001649
Guido van Rossumb7b45621995-08-04 04:07:45 +00001650 if (len == 0) {
1651 INCREF(tuple);
1652 return tuple;
1653 }
1654
Guido van Rossum2586bf01993-11-01 16:21:44 +00001655 if ((result = newtupleobject(len)) == NULL)
1656 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001657
Guido van Rossum12d12c51993-10-26 17:58:25 +00001658 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001659 object *item, *good;
1660 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001661
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001662 if ((item = gettupleitem(tuple, i)) == NULL)
1663 goto Fail_1;
1664 if (func == None) {
1665 INCREF(item);
1666 good = item;
1667 }
1668 else {
1669 object *arg = mkvalue("(O)", item);
1670 if (arg == NULL)
1671 goto Fail_1;
1672 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001673 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001674 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001675 goto Fail_1;
1676 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001677 ok = testbool(good);
1678 DECREF(good);
1679 if (ok) {
1680 INCREF(item);
1681 if (settupleitem(result, j++, item) < 0)
1682 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001683 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001684 }
1685
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001686 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001687 return NULL;
1688
Guido van Rossum12d12c51993-10-26 17:58:25 +00001689 return result;
1690
Guido van Rossum12d12c51993-10-26 17:58:25 +00001691Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001692 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001693 return NULL;
1694}
1695
1696
Guido van Rossume77a7571993-11-03 15:01:26 +00001697/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001698
1699static object *
1700filterstring(func, strobj)
1701 object *func;
1702 object *strobj;
1703{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001704 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001705 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001706 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001707
Guido van Rossum2586bf01993-11-01 16:21:44 +00001708 if (func == None) {
1709 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001710 INCREF(strobj);
1711 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001712 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001713 if ((result = newsizedstringobject(NULL, len)) == NULL)
1714 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001715
Guido van Rossum12d12c51993-10-26 17:58:25 +00001716 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001717 object *item, *arg, *good;
1718 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001719
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001720 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1721 if (item == NULL)
1722 goto Fail_1;
1723 arg = mkvalue("(O)", item);
1724 DECREF(item);
1725 if (arg == NULL)
1726 goto Fail_1;
1727 good = call_object(func, arg);
1728 DECREF(arg);
1729 if (good == NULL)
1730 goto Fail_1;
1731 ok = testbool(good);
1732 DECREF(good);
1733 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001734 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001735 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001736 }
1737
Guido van Rossum79d96d61996-08-16 20:44:34 +00001738 if (j < len && resizestring(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001739 return NULL;
1740
Guido van Rossum12d12c51993-10-26 17:58:25 +00001741 return result;
1742
Guido van Rossum12d12c51993-10-26 17:58:25 +00001743Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001744 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001745 return NULL;
1746}