blob: 59e15e1f4bd9f701ffe6c9e396847176eeb32211 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum3f5da241990-12-20 15:06:42 +000025/* Built-in functions */
26
27#include "allobjects.h"
28
29#include "node.h"
30#include "graminit.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000031#include "sysmodule.h"
Guido van Rossum86cd6e61991-01-21 15:12:35 +000032#include "bltinmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000033#include "import.h"
34#include "pythonrun.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035#include "ceval.h"
36#include "modsupport.h"
Guido van Rossum5b722181993-03-30 17:46:03 +000037#include "compile.h"
38#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000039
Guido van Rossum12d12c51993-10-26 17:58:25 +000040/* Forward */
41static object *filterstring PROTO((object *, object *));
42static object *filtertuple PROTO((object *, object *));
Guido van Rossum12d12c51993-10-26 17:58:25 +000043
Guido van Rossum3f5da241990-12-20 15:06:42 +000044static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000045builtin___import__(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000046 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000047 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000048{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000049 char *name;
50 object *m;
51
52 if (!newgetargs(args, "s:__import__", &name))
53 return NULL;
54 m = import_module(name);
55 XINCREF(m);
56
57 return m;
58}
59
60
61static object *
62builtin_abs(self, args)
63 object *self;
64 object *args;
65{
66 object *v;
Guido van Rossumd4905451991-05-05 20:00:36 +000067 number_methods *nm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000068
69 if (!newgetargs(args, "O:abs", &v))
70 return NULL;
71 if ((nm = v->ob_type->tp_as_number) == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +000072 err_setstr(TypeError, "abs() requires numeric argument");
73 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000074 }
Guido van Rossumd4905451991-05-05 20:00:36 +000075 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000076}
77
78static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000079builtin_apply(self, args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000080 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000081 object *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000082{
Guido van Rossum94390a41992-08-14 15:14:30 +000083 object *func, *arglist;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000084
85 if (!newgetargs(args, "OO:apply", &func, &arglist))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000086 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +000087 if (!is_tupleobject(arglist)) {
88 err_setstr(TypeError, "apply() 2nd argument must be tuple");
89 return NULL;
90 }
Guido van Rossum94390a41992-08-14 15:14:30 +000091 return call_object(func, arglist);
Guido van Rossumc02e15c1991-12-16 13:03:00 +000092}
93
Guido van Rossum2d951851994-08-29 12:52:16 +000094static int
95callable(x)
96 object *x;
97{
98 if (x == NULL)
99 return 0;
100 if (x->ob_type->tp_call != NULL ||
101 is_funcobject(x) ||
102 is_instancemethodobject(x) ||
103 is_methodobject(x) ||
104 is_classobject(x))
105 return 1;
106 if (is_instanceobject(x)) {
107 object *call = getattr(x, "__call__");
108 if (call == NULL) {
109 err_clear();
110 return 0;
111 }
112 /* Could test recursively but don't, for fear of endless
113 recursion if some joker sets self.__call__ = self */
114 DECREF(call);
115 return 1;
116 }
117 return 0;
118}
119
120static object *
121builtin_callable(self, args)
122 object *self;
123 object *args;
124{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000125 object *v;
126
127 if (!newgetargs(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000128 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000129 return newintobject((long)callable(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000130}
131
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000132static object *
Guido van Rossume77a7571993-11-03 15:01:26 +0000133builtin_filter(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000134 object *self;
135 object *args;
136{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000137 object *func, *seq, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000138 sequence_methods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000139 int len;
140 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000141
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000142 if (!newgetargs(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000143 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000144
Guido van Rossum12d12c51993-10-26 17:58:25 +0000145 if (is_stringobject(seq)) {
146 object *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000147 return r;
148 }
149
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000150 if (is_tupleobject(seq)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000151 object *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000152 return r;
153 }
154
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000155 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000156 err_setstr(TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000157 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000158 goto Fail_2;
159 }
160
161 if ((len = (*sqf->sq_length)(seq)) < 0)
162 goto Fail_2;
163
164 if (is_listobject(seq) && seq->ob_refcnt == 1) {
165 INCREF(seq);
166 result = seq;
167 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000168 else {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000169 if ((result = newlistobject(len)) == NULL)
170 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000171 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000172
Guido van Rossum2d951851994-08-29 12:52:16 +0000173 for (i = j = 0; ; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000174 object *item, *good;
175 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000176
Guido van Rossum2d951851994-08-29 12:52:16 +0000177 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
178 if (i < len)
179 goto Fail_1;
180 if (err_occurred() == IndexError) {
181 err_clear();
182 break;
183 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000184 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000185 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000186
187 if (func == None) {
188 good = item;
189 }
190 else {
191 object *arg = mkvalue("(O)", item);
192 DECREF(item);
193 if (arg == NULL)
194 goto Fail_1;
195 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000196 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000197 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000198 goto Fail_1;
199 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000200 ok = testbool(good);
201 DECREF(good);
202 if (ok) {
203 INCREF(item);
Guido van Rossum2d951851994-08-29 12:52:16 +0000204 if (j < len) {
205 if (setlistitem(result, j++, item) < 0)
206 goto Fail_1;
207 }
208 else {
209 j++;
210 if (addlistitem(result, item) < 0)
211 goto Fail_1;
212 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000213 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000214 }
215
Guido van Rossum12d12c51993-10-26 17:58:25 +0000216
Guido van Rossum2d951851994-08-29 12:52:16 +0000217 if (j < len && setlistslice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000218 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000219
Guido van Rossum12d12c51993-10-26 17:58:25 +0000220 return result;
221
Guido van Rossum12d12c51993-10-26 17:58:25 +0000222Fail_1:
223 DECREF(result);
224Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000225 return NULL;
226}
227
228static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000229builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000230 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000231 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000232{
233 long x;
234 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000235
236 if (!newgetargs(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000237 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000238 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000239 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000240 return NULL;
241 }
242 s[0] = x;
243 return newsizedstringobject(s, 1);
244}
245
246static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000247builtin_cmp(self, args)
248 object *self;
249 object *args;
250{
251 object *a, *b;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000252
253 if (!newgetargs(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000254 return NULL;
255 return newintobject((long)cmpobject(a, b));
256}
257
258static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000259do_coerce(v, w)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000260 object *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000261{
Guido van Rossum04691fc1992-08-12 15:35:34 +0000262 object *res;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000263 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000264 return instancebinop(v, w, "__coerce__", "__rcoerce__",
265 do_coerce);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000266 if (coerce(&v, &w) < 0)
267 return NULL;
268 res = mkvalue("(OO)", v, w);
269 DECREF(v);
270 DECREF(w);
271 return res;
272}
273
274static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000275builtin_coerce(self, args)
276 object *self;
277 object *args;
278{
279 object *v, *w;
280
281 if (!newgetargs(args, "OO:coerce", &v, &w))
282 return NULL;
283 return do_coerce(v, w);
284}
285
286static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000287builtin_compile(self, args)
288 object *self;
289 object *args;
290{
291 char *str;
292 char *filename;
293 char *startstr;
294 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000295
296 if (!newgetargs(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000297 return NULL;
298 if (strcmp(startstr, "exec") == 0)
299 start = file_input;
300 else if (strcmp(startstr, "eval") == 0)
301 start = eval_input;
302 else {
303 err_setstr(ValueError,
304 "compile() mode must be 'exec' or 'eval'");
305 return NULL;
306 }
307 return compile_string(str, filename, start);
308}
309
310static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000311builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000312 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000313 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000314{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000315 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000316 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000317
318 if (!newgetargs(args, "|O:dir", &v))
319 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000320 if (v == NULL) {
321 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000322 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000323 }
324 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000325 d = getattr(v, "__dict__");
326 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000327 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000328 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000329 return NULL;
330 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000331 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000332 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000333 v = getdictkeys(d);
334 if (sortlist(v) != 0) {
335 DECREF(v);
336 v = NULL;
337 }
338 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000339 else {
340 v = newlistobject(0);
341 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000342 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000343 return v;
344}
345
346static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000347do_divmod(v, w)
348 object *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000349{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000350 object *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000351
Guido van Rossum180d7b41994-09-29 09:45:57 +0000352 if (is_instanceobject(v) || is_instanceobject(w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000353 return instancebinop(v, w, "__divmod__", "__rdivmod__",
354 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000355 if (v->ob_type->tp_as_number == NULL ||
356 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000357 err_setstr(TypeError,
358 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000359 return NULL;
360 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000361 if (coerce(&v, &w) != 0)
362 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000363 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000364 DECREF(v);
365 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000366 return res;
367}
368
369static object *
370builtin_divmod(self, args)
371 object *self;
372 object *args;
373{
374 object *v, *w;
375
376 if (!newgetargs(args, "OO:divmod", &v, &w))
377 return NULL;
378 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000379}
380
381static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000382builtin_eval(self, args)
383 object *self;
384 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000385{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000386 object *cmd;
387 object *globals = NULL, *locals = NULL;
388 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000389
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000390 if (!newgetargs(args, "O|O!O!:eval",
391 &cmd,
392 &Mappingtype, &globals,
393 &Mappingtype, &locals))
394 return NULL;
395 if (is_codeobject(cmd))
396 return eval_code((codeobject *) cmd, globals, locals,
Guido van Rossum81daa321993-05-20 14:24:46 +0000397 (object *)NULL, (object *)NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000398 if (!is_stringobject(cmd)) {
399 err_setstr(TypeError,
400 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000401 return NULL;
402 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000403 str = getstringvalue(cmd);
404 if (strlen(str) != getstringsize(cmd)) {
405 err_setstr(ValueError,
406 "embedded '\\0' in string arg");
407 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000408 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000409 while (*str == ' ' || *str == '\t')
410 str++;
411 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000412}
413
414static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000415builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000416 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000417 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000418{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000419 char *filename;
420 object *globals = NULL, *locals = NULL;
421 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000422 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000423 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000424 int n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000425
426 if (!newgetargs(args, "s|O!O!:execfile",
427 &filename,
428 &Mappingtype, &globals,
429 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000430 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000431 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000433 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000434 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000436 return NULL;
437 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000438 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000439 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000440 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000441 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000442 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000443}
444
445static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000446builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000447 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000448 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000449{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000450 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000451 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000452
453 if (!newgetargs(args, "O:float", &v))
454 return NULL;
455 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000456 nb->nb_float == NULL) {
457 err_setstr(TypeError,
458 "float() argument can't be converted to float");
459 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000460 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000461 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000462}
463
464static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000465builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000466 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000467 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000468{
Guido van Rossum94390a41992-08-14 15:14:30 +0000469 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000470 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000471
472 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000473 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000474 return getattro(v, name);
475}
476
477static object *
478builtin_hasattr(self, args)
479 object *self;
480 object *args;
481{
482 object *v;
483 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000484
485 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000486 return NULL;
487 v = getattro(v, name);
488 if (v == NULL) {
489 err_clear();
490 return newintobject(0L);
491 }
492 DECREF(v);
493 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000494}
495
496static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000497builtin_id(self, args)
498 object *self;
499 object *args;
500{
501 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000502
503 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000504 return NULL;
505 return newintobject((long)v);
506}
507
508static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000509builtin_map(self, args)
510 object *self;
511 object *args;
512{
513 typedef struct {
514 object *seq;
515 sequence_methods *sqf;
516 int len;
517 } sequence;
518
519 object *func, *result;
520 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000521 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000522 register int i, j;
523
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000524 n = gettuplesize(args);
525 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000526 err_setstr(TypeError, "map() requires at least two args");
527 return NULL;
528 }
529
530 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000531 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000532
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000533 if ((seqs = NEW(sequence, n)) == NULL) {
534 err_nomem();
535 goto Fail_2;
536 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000537
Guido van Rossum2d951851994-08-29 12:52:16 +0000538 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000539 int curlen;
540
541 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
542 goto Fail_2;
543
544 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
545 static char errmsg[] =
546 "argument %d to map() must be a sequence object";
547 char errbuf[sizeof(errmsg) + 3];
548
549 sprintf(errbuf, errmsg, i+2);
550 err_setstr(TypeError, errbuf);
551 goto Fail_2;
552 }
553
554 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
555 goto Fail_2;
556
557 if (curlen > len)
558 len = curlen;
559 }
560
561 if ((result = (object *) newlistobject(len)) == NULL)
562 goto Fail_2;
563
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000564 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000565 for (i = 0; ; ++i) {
566 object *arglist, *item, *value;
567 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000568
Guido van Rossum2d951851994-08-29 12:52:16 +0000569 if (func == None && n == 1)
570 arglist = NULL;
571 else {
572 if ((arglist = newtupleobject(n)) == NULL)
573 goto Fail_1;
574 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000575
576 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000577 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000578 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000579 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000580 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000581 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000582 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000583 if (item == NULL) {
584 if (i < sqp->len)
585 goto Fail_0;
586 if (err_occurred() == IndexError) {
587 err_clear();
588 INCREF(None);
589 item = None;
590 sqp->len = -1;
591 }
592 else {
593 goto Fail_0;
594 }
595 }
596 else
597 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000598
Guido van Rossum12d12c51993-10-26 17:58:25 +0000599 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000600 if (!arglist)
601 break;
602 if (settupleitem(arglist, j, item) < 0) {
603 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000604 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000605 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000606 continue;
607
608 Fail_0:
Guido van Rossum2d951851994-08-29 12:52:16 +0000609 XDECREF(arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000610 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000611 }
612
Guido van Rossum2d951851994-08-29 12:52:16 +0000613 if (!arglist)
614 arglist = item;
615
616 if (!any) {
617 DECREF(arglist);
618 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000619 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000620
621 if (func == None)
622 value = arglist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000623 else {
Guido van Rossum2d951851994-08-29 12:52:16 +0000624 value = call_object(func, arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000625 DECREF(arglist);
626 if (value == NULL)
627 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000628 }
629 if (i >= len) {
630 if (addlistitem(result, value) < 0)
631 goto Fail_1;
632 }
633 else {
634 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000635 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000636 }
637 }
638
Guido van Rossum2d951851994-08-29 12:52:16 +0000639 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000640 return result;
641
Guido van Rossum12d12c51993-10-26 17:58:25 +0000642Fail_1:
643 DECREF(result);
644Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000645 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000646 return NULL;
647}
648
649static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000650builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000651 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000652 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000653{
Guido van Rossum94390a41992-08-14 15:14:30 +0000654 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000655 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000656 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000657
658 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000659 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000660 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000661 return NULL;
662 INCREF(None);
663 return None;
664}
665
666static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000667builtin_delattr(self, args)
668 object *self;
669 object *args;
670{
671 object *v;
672 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000673
674 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000675 return NULL;
676 if (setattro(v, name, (object *)NULL) != 0)
677 return NULL;
678 INCREF(None);
679 return None;
680}
681
682static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000683builtin_hash(self, args)
684 object *self;
685 object *args;
686{
687 object *v;
688 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000689
690 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000691 return NULL;
692 x = hashobject(v);
693 if (x == -1)
694 return NULL;
695 return newintobject(x);
696}
697
698static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000699builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000700 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000701 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000702{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000703 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000704 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000705
706 if (!newgetargs(args, "O:hex", &v))
707 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000708
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000709 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000710 nb->nb_hex == NULL) {
711 err_setstr(TypeError,
712 "hex() argument can't be converted to hex");
713 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000714 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000715 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000716}
717
Guido van Rossum3165fe61992-09-25 21:59:05 +0000718static object *builtin_raw_input PROTO((object *, object *));
719
Guido van Rossum006bcd41991-10-24 14:54:44 +0000720static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000721builtin_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000722 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000723 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000724{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000725 object *line;
726 char *str;
727 object *res;
728
729 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000730 if (line == NULL)
731 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000732 if (!getargs(line, "s;embedded '\\0' in input line", &str))
733 return NULL;
734 while (*str == ' ' || *str == '\t')
735 str++;
736 res = run_string(str, eval_input, (object *)NULL, (object *)NULL);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000737 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000738 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000739}
740
741static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000742builtin_int(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000743 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000744 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000745{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000746 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000747 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000748
749 if (!newgetargs(args, "O:int", &v))
750 return NULL;
751 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000752 nb->nb_int == NULL) {
753 err_setstr(TypeError,
754 "int() argument can't be converted to int");
755 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000756 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000757 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000758}
759
760static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000761builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000762 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000763 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000764{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000765 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000766 long len;
767 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000768
769 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000770 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000771 tp = v->ob_type;
772 if (tp->tp_as_sequence != NULL) {
773 len = (*tp->tp_as_sequence->sq_length)(v);
774 }
775 else if (tp->tp_as_mapping != NULL) {
776 len = (*tp->tp_as_mapping->mp_length)(v);
777 }
778 else {
779 err_setstr(TypeError, "len() of unsized object");
780 return NULL;
781 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000782 if (len < 0)
783 return NULL;
784 else
785 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000786}
787
788static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000789builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000790 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000791 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000792{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000793 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000794 number_methods *nb;
795
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000796 if (!newgetargs(args, "O:long", &v))
797 return NULL;
798 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000799 nb->nb_long == NULL) {
800 err_setstr(TypeError,
801 "long() argument can't be converted to long");
802 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000803 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000804 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000805}
806
807static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000808min_max(args, sign)
809 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000810 int sign;
811{
Guido van Rossum2d951851994-08-29 12:52:16 +0000812 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000813 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000814 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000815
816 if (gettuplesize(args) > 1)
817 v = args;
818 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000819 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000820 sq = v->ob_type->tp_as_sequence;
821 if (sq == NULL) {
822 err_setstr(TypeError, "min() or max() of non-sequence");
823 return NULL;
824 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000825 w = NULL;
826 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000827 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000828 if (x == NULL) {
829 if (err_occurred() == IndexError) {
830 err_clear();
831 break;
832 }
833 XDECREF(w);
834 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000835 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000836 if (w == NULL)
837 w = x;
838 else {
839 if (cmpobject(x, w) * sign > 0) {
840 DECREF(w);
841 w = x;
842 }
843 else
844 DECREF(x);
845 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000846 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000847 if (w == NULL)
848 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000849 return w;
850}
851
852static object *
853builtin_min(self, v)
854 object *self;
855 object *v;
856{
857 return min_max(v, -1);
858}
859
860static object *
861builtin_max(self, v)
862 object *self;
863 object *v;
864{
865 return min_max(v, 1);
866}
867
868static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000869builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000870 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000871 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000872{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000873 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000874 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000875
876 if (!newgetargs(args, "O:oct", &v))
877 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000878 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
879 nb->nb_oct == NULL) {
880 err_setstr(TypeError,
881 "oct() argument can't be converted to oct");
882 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000883 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000884 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000885}
886
887static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000888builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000889 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000890 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000891{
Guido van Rossum2d951851994-08-29 12:52:16 +0000892 char *name;
893 char *mode = "r";
894 int bufsize = -1;
895 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000896
897 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000898 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000899 f = newfileobject(name, mode);
900 if (f != NULL)
901 setfilebufsize(f, bufsize);
902 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000903}
904
905static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000906builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000907 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000908 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000909{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000910 char c;
911
912 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000913 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000914 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000915}
916
917static object *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000918do_pow(v, w)
919 object *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +0000920{
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000921 object *res;
922 if (is_instanceobject(v) || is_instanceobject(w))
923 return instancebinop(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000924 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000925 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000926 err_setstr(TypeError, "pow() requires numeric arguments");
927 return NULL;
928 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000929 if (coerce(&v, &w) != 0)
930 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000931 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000932 DECREF(v);
933 DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000934 return res;
935}
936
937static object *
938builtin_pow(self, args)
939 object *self;
940 object *args;
941{
942 object *v, *w, *z = None, *res;
943 object *v1, *z1, *w2, *z2;
944
945 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
946 return NULL;
947 if (z == None)
948 return do_pow(v, w);
949 /* XXX The ternary version doesn't do class instance coercions */
950 if (is_instanceobject(v))
951 return v->ob_type->tp_as_number->nb_power(v, w, z);
952 if (v->ob_type->tp_as_number == NULL ||
953 z->ob_type->tp_as_number == NULL ||
954 w->ob_type->tp_as_number == NULL) {
955 err_setstr(TypeError, "pow() requires numeric arguments");
956 return NULL;
957 }
958 if (coerce(&v, &w) != 0)
959 return NULL;
960 res = NULL;
961 v1 = v;
962 z1 = z;
963 if (coerce(&v1, &z1) != 0)
964 goto error2;
965 w2 = w;
966 z2 = z1;
967 if (coerce(&w2, &z2) != 0)
968 goto error1;
969 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
970 DECREF(w2);
971 DECREF(z2);
972 error1:
973 DECREF(v1);
974 DECREF(z1);
975 error2:
976 DECREF(v);
977 DECREF(w);
978 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +0000979}
980
981static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000982builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000983 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000984 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000985{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000986 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000987 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000988 object *v;
989
990 if (gettuplesize(args) <= 1) {
991 if (!newgetargs(args,
992 "i;range() requires 1-3 int arguments",
993 &ihigh))
994 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000995 }
996 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000997 if (!newgetargs(args,
998 "ii|i;range() requires 1-3 int arguments",
999 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001000 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001001 }
1002 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001003 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001004 return NULL;
1005 }
1006 /* XXX ought to check overflow of subtraction */
1007 if (istep > 0)
1008 n = (ihigh - ilow + istep - 1) / istep;
1009 else
1010 n = (ihigh - ilow + istep + 1) / istep;
1011 if (n < 0)
1012 n = 0;
1013 v = newlistobject(n);
1014 if (v == NULL)
1015 return NULL;
1016 for (i = 0; i < n; i++) {
1017 object *w = newintobject(ilow);
1018 if (w == NULL) {
1019 DECREF(v);
1020 return NULL;
1021 }
1022 setlistitem(v, i, w);
1023 ilow += istep;
1024 }
1025 return v;
1026}
1027
1028static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001029builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001030 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001031 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001032{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001033 long ilow = 0, ihigh = 0, istep = 1;
1034 int n;
1035 object *v;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001036
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001037 if (gettuplesize(args) <= 1) {
1038 if (!newgetargs(args,
1039 "i;xrange() requires 1-3 int arguments",
1040 &ihigh))
1041 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001042 }
1043 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001044 if (!newgetargs(args,
1045 "ii|i;xrange() requires 1-3 int arguments",
1046 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001047 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001048 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001049 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001050 err_setstr(ValueError, "zero step for xrange()");
1051 return NULL;
1052 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001053 /* XXX ought to check overflow of subtraction */
1054 if (istep > 0)
1055 n = (ihigh - ilow + istep - 1) / istep;
1056 else
1057 n = (ihigh - ilow + istep + 1) / istep;
1058 if (n < 0)
1059 n = 0;
1060 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001061}
1062
1063static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001064builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001065 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001066 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001067{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001068 object *v = NULL;
1069 object *f;
1070
1071 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001072 return NULL;
Guido van Rossum90933611991-06-07 16:10:43 +00001073 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001074 f = sysget("stdout");
1075 if (f == NULL) {
1076 err_setstr(RuntimeError, "lost sys.stdout");
1077 return NULL;
1078 }
1079 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001080 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001081 return NULL;
1082 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001083 f = sysget("stdin");
1084 if (f == NULL) {
1085 err_setstr(RuntimeError, "lost sys.stdin");
1086 return NULL;
1087 }
1088 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001089}
1090
1091static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001092builtin_reduce(self, args)
1093 object *self;
1094 object *args;
1095{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001096 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001097 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001098 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001099
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001100 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1101 return NULL;
1102 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001103 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001104
1105 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1106 err_setstr(TypeError,
1107 "2nd argument to reduce() must be a sequence object");
1108 return NULL;
1109 }
1110
Guido van Rossum12d12c51993-10-26 17:58:25 +00001111 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001112 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001113
Guido van Rossum2d951851994-08-29 12:52:16 +00001114 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001115 object *op2;
1116
1117 if (args->ob_refcnt > 1) {
1118 DECREF(args);
1119 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001120 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001121 }
1122
Guido van Rossum2d951851994-08-29 12:52:16 +00001123 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1124 if (err_occurred() == IndexError) {
1125 err_clear();
1126 break;
1127 }
1128 goto Fail;
1129 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001130
Guido van Rossum2d951851994-08-29 12:52:16 +00001131 if (result == NULL)
1132 result = op2;
1133 else {
1134 settupleitem(args, 0, result);
1135 settupleitem(args, 1, op2);
1136 if ((result = call_object(func, args)) == NULL)
1137 goto Fail;
1138 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001139 }
1140
1141 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001142
Guido van Rossum2d951851994-08-29 12:52:16 +00001143 if (result == NULL)
1144 err_setstr(TypeError,
1145 "reduce of empty sequence with no initial value");
1146
Guido van Rossum12d12c51993-10-26 17:58:25 +00001147 return result;
1148
Guido van Rossum2d951851994-08-29 12:52:16 +00001149Fail:
1150 XDECREF(args);
1151 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001152 return NULL;
1153}
1154
1155static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001156builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001157 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001158 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001159{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001160 object *v;
1161
1162 if (!newgetargs(args, "O:reload", &v))
1163 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001164 return reload_module(v);
1165}
1166
1167static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001168builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001169 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001170 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001171{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001172 object *v;
1173
1174 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001175 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001176 return reprobject(v);
1177}
1178
1179static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001180builtin_round(self, args)
1181 object *self;
1182 object *args;
1183{
1184 extern double floor PROTO((double));
1185 extern double ceil PROTO((double));
1186 double x;
1187 double f;
1188 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001189 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001190
1191 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001192 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001193 f = 1.0;
1194 for (i = ndigits; --i >= 0; )
1195 f = f*10.0;
1196 for (i = ndigits; ++i <= 0; )
1197 f = f*0.1;
1198 if (x >= 0.0)
1199 return newfloatobject(floor(x*f + 0.5) / f);
1200 else
1201 return newfloatobject(ceil(x*f - 0.5) / f);
1202}
1203
1204static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001205builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001206 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001207 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001208{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001209 object *v;
1210
1211 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001212 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001213 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001214}
1215
1216static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001217builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001218 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001219 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001220{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001221 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001222 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001223
1224 if (!newgetargs(args, "O:tuple", &v))
1225 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001226 if (is_tupleobject(v)) {
1227 INCREF(v);
1228 return v;
1229 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001230 if (is_listobject(v))
1231 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001232 if (is_stringobject(v)) {
1233 int n = getstringsize(v);
1234 object *t = newtupleobject(n);
1235 if (t != NULL) {
1236 int i;
1237 char *p = getstringvalue(v);
1238 for (i = 0; i < n; i++) {
1239 object *item = newsizedstringobject(p+i, 1);
1240 if (item == NULL) {
1241 DECREF(t);
1242 t = NULL;
1243 break;
1244 }
1245 settupleitem(t, i, item);
1246 }
1247 }
1248 return t;
1249 }
1250 /* Generic sequence object */
1251 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1252 int n = (*sqf->sq_length)(v);
1253 int i;
1254 object *t;
1255 if (n < 0)
1256 return NULL;
1257 t = newtupleobject(n);
1258 if (t == NULL)
1259 return NULL;
1260 for (i = 0; i < n; i++) {
1261 object *item = (*sqf->sq_item)(v, i);
1262 if (item == NULL) {
1263 DECREF(t);
1264 t = NULL;
1265 break;
1266 }
1267 settupleitem(t, i, item);
1268 }
1269 /* XXX Should support indefinite-length sequences */
1270 return t;
1271 }
1272 /* None of the above */
1273 err_setstr(TypeError, "tuple() argument must be a sequence");
1274 return NULL;
1275}
1276
1277static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001278builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001279 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001280 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001281{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001282 object *v;
1283
1284 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001285 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001286 v = (object *)v->ob_type;
1287 INCREF(v);
1288 return v;
1289}
1290
Guido van Rossum2d951851994-08-29 12:52:16 +00001291static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001292builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001293 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001294 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001295{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001296 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001297 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001298
1299 if (!newgetargs(args, "|O:vars", &v))
1300 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001301 if (v == NULL) {
1302 d = getlocals();
1303 INCREF(d);
1304 }
1305 else {
1306 d = getattr(v, "__dict__");
1307 if (d == NULL) {
1308 err_setstr(TypeError,
1309 "vars() argument must have __dict__ attribute");
1310 return NULL;
1311 }
1312 }
1313 return d;
1314}
1315
Guido van Rossum3f5da241990-12-20 15:06:42 +00001316static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001317 {"__import__", builtin___import__, 1},
1318 {"abs", builtin_abs, 1},
1319 {"apply", builtin_apply, 1},
1320 {"callable", builtin_callable, 1},
1321 {"chr", builtin_chr, 1},
1322 {"cmp", builtin_cmp, 1},
1323 {"coerce", builtin_coerce, 1},
1324 {"compile", builtin_compile, 1},
1325 {"delattr", builtin_delattr, 1},
1326 {"dir", builtin_dir, 1},
1327 {"divmod", builtin_divmod, 1},
1328 {"eval", builtin_eval, 1},
1329 {"execfile", builtin_execfile, 1},
1330 {"filter", builtin_filter, 1},
1331 {"float", builtin_float, 1},
1332 {"getattr", builtin_getattr, 1},
1333 {"hasattr", builtin_hasattr, 1},
1334 {"hash", builtin_hash, 1},
1335 {"hex", builtin_hex, 1},
1336 {"id", builtin_id, 1},
1337 {"input", builtin_input, 1},
1338 {"int", builtin_int, 1},
1339 {"len", builtin_len, 1},
1340 {"long", builtin_long, 1},
1341 {"map", builtin_map, 1},
1342 {"max", builtin_max, 1},
1343 {"min", builtin_min, 1},
1344 {"oct", builtin_oct, 1},
1345 {"open", builtin_open, 1},
1346 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001347 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001348 {"range", builtin_range, 1},
1349 {"raw_input", builtin_raw_input, 1},
1350 {"reduce", builtin_reduce, 1},
1351 {"reload", builtin_reload, 1},
1352 {"repr", builtin_repr, 1},
1353 {"round", builtin_round, 1},
1354 {"setattr", builtin_setattr, 1},
1355 {"str", builtin_str, 1},
1356 {"tuple", builtin_tuple, 1},
1357 {"type", builtin_type, 1},
1358 {"vars", builtin_vars, 1},
1359 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001360 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001361};
1362
1363static object *builtin_dict;
1364
1365object *
1366getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +00001367 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001368{
Guido van Rossum2d951851994-08-29 12:52:16 +00001369 return mappinglookup(builtin_dict, name);
1370}
1371
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001372object *
1373getbuiltins(name)
1374 char *name;
1375{
1376 return dictlookup(builtin_dict, name);
1377}
1378
Guido van Rossum2d951851994-08-29 12:52:16 +00001379int
1380setbuiltin(cname, value)
1381 char *cname;
1382 object *value;
1383{
1384 return dictinsert(builtin_dict, cname, value);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001385}
1386
1387/* Predefined exceptions */
1388
Guido van Rossum25831651993-05-19 14:50:45 +00001389object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001390object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001391object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001392object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001393object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001394object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001395object *IndexError;
1396object *KeyError;
1397object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001398object *MemoryError;
1399object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001400object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001401object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001402object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001403object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001404object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001405object *TypeError;
1406object *ValueError;
1407object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001408
Guido van Rossum3f5da241990-12-20 15:06:42 +00001409static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001410newstdexception(name)
1411 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001412{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001413 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001414 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1415 fatal("no mem for new standard exception");
1416 return v;
1417}
1418
1419static void
1420initerrors()
1421{
Guido van Rossum25831651993-05-19 14:50:45 +00001422 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001423 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001424 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001425 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001426 IOError = newstdexception("IOError");
1427 ImportError = newstdexception("ImportError");
1428 IndexError = newstdexception("IndexError");
1429 KeyError = newstdexception("KeyError");
1430 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001431 MemoryError = newstdexception("MemoryError");
1432 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001433 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001434 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001435 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001436 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001437 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001438 TypeError = newstdexception("TypeError");
1439 ValueError = newstdexception("ValueError");
1440 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001441}
1442
1443void
1444initbuiltin()
1445{
1446 object *m;
Guido van Rossum89b33251993-10-22 14:26:06 +00001447 m = initmodule("__builtin__", builtin_methods);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001448 builtin_dict = getmoduledict(m);
1449 INCREF(builtin_dict);
1450 initerrors();
1451 (void) dictinsert(builtin_dict, "None", None);
1452}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001453
1454/* Coerce two numeric types to the "larger" one.
1455 Increment the reference count on each argument.
1456 Return -1 and raise an exception if no coercion is possible
1457 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +00001458*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001459
1460int
1461coerce(pv, pw)
1462 object **pv, **pw;
1463{
1464 register object *v = *pv;
1465 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001466 int res;
1467
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001468 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001469 INCREF(v);
1470 INCREF(w);
1471 return 0;
1472 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001473 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
1474 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
1475 if (res <= 0)
1476 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001477 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001478 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
1479 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
1480 if (res <= 0)
1481 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001482 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001483 err_setstr(TypeError, "number coercion failed");
1484 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001485}
Guido van Rossum12d12c51993-10-26 17:58:25 +00001486
1487
Guido van Rossume77a7571993-11-03 15:01:26 +00001488/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001489
1490static object *
1491filtertuple(func, tuple)
1492 object *func;
1493 object *tuple;
1494{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001495 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001496 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001497 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001498
Guido van Rossum2586bf01993-11-01 16:21:44 +00001499 if ((result = newtupleobject(len)) == NULL)
1500 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001501
Guido van Rossum12d12c51993-10-26 17:58:25 +00001502 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001503 object *item, *good;
1504 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001505
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001506 if ((item = gettupleitem(tuple, i)) == NULL)
1507 goto Fail_1;
1508 if (func == None) {
1509 INCREF(item);
1510 good = item;
1511 }
1512 else {
1513 object *arg = mkvalue("(O)", item);
1514 if (arg == NULL)
1515 goto Fail_1;
1516 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001517 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001518 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001519 goto Fail_1;
1520 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001521 ok = testbool(good);
1522 DECREF(good);
1523 if (ok) {
1524 INCREF(item);
1525 if (settupleitem(result, j++, item) < 0)
1526 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001527 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001528 }
1529
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001530 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001531 return NULL;
1532
Guido van Rossum12d12c51993-10-26 17:58:25 +00001533 return result;
1534
Guido van Rossum12d12c51993-10-26 17:58:25 +00001535Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001536 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001537 return NULL;
1538}
1539
1540
Guido van Rossume77a7571993-11-03 15:01:26 +00001541/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001542
1543static object *
1544filterstring(func, strobj)
1545 object *func;
1546 object *strobj;
1547{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001548 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001549 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001550 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001551
Guido van Rossum2586bf01993-11-01 16:21:44 +00001552 if (func == None) {
1553 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001554 INCREF(strobj);
1555 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001556 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001557 if ((result = newsizedstringobject(NULL, len)) == NULL)
1558 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001559
Guido van Rossum12d12c51993-10-26 17:58:25 +00001560 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001561 object *item, *arg, *good;
1562 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001563
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001564 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1565 if (item == NULL)
1566 goto Fail_1;
1567 arg = mkvalue("(O)", item);
1568 DECREF(item);
1569 if (arg == NULL)
1570 goto Fail_1;
1571 good = call_object(func, arg);
1572 DECREF(arg);
1573 if (good == NULL)
1574 goto Fail_1;
1575 ok = testbool(good);
1576 DECREF(good);
1577 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001578 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001579 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001580 }
1581
Guido van Rossum12d12c51993-10-26 17:58:25 +00001582 if (resizestring(&result, j) < 0)
1583 return NULL;
1584
Guido van Rossum12d12c51993-10-26 17:58:25 +00001585 return result;
1586
Guido van Rossum12d12c51993-10-26 17:58:25 +00001587Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001588 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001589 return NULL;
1590}