blob: c553be60aa003cc60086eff5ae8785bd10587068 [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 Rossum04691fc1992-08-12 15:35:34 +0000259builtin_coerce(self, args)
260 object *self;
261 object *args;
262{
263 object *v, *w;
264 object *res;
265
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000266 if (!newgetargs(args, "OO:coerce", &v, &w))
Guido van Rossum04691fc1992-08-12 15:35:34 +0000267 return NULL;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000268 if (is_instanceobject(v) || is_instanceobject(w))
269 return instancebinop(v, w, "__coerce__", "__rcoerce__");
Guido van Rossum04691fc1992-08-12 15:35:34 +0000270 if (coerce(&v, &w) < 0)
271 return NULL;
272 res = mkvalue("(OO)", v, w);
273 DECREF(v);
274 DECREF(w);
275 return res;
276}
277
278static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000279builtin_compile(self, args)
280 object *self;
281 object *args;
282{
283 char *str;
284 char *filename;
285 char *startstr;
286 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000287
288 if (!newgetargs(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000289 return NULL;
290 if (strcmp(startstr, "exec") == 0)
291 start = file_input;
292 else if (strcmp(startstr, "eval") == 0)
293 start = eval_input;
294 else {
295 err_setstr(ValueError,
296 "compile() mode must be 'exec' or 'eval'");
297 return NULL;
298 }
299 return compile_string(str, filename, start);
300}
301
302static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000303builtin_dir(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000304 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000305 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000306{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000307 object *v = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000308 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000309
310 if (!newgetargs(args, "|O:dir", &v))
311 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000312 if (v == NULL) {
313 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000314 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000315 }
316 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000317 d = getattr(v, "__dict__");
318 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000319 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000320 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000321 return NULL;
322 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000323 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000324 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000325 v = getdictkeys(d);
326 if (sortlist(v) != 0) {
327 DECREF(v);
328 v = NULL;
329 }
330 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000331 else {
332 v = newlistobject(0);
333 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000334 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000335 return v;
336}
337
338static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000339builtin_divmod(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000340 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000341 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000342{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000343 object *v, *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000344
345 if (!newgetargs(args, "OO:divmod", &v, &w))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000346 return NULL;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000347 if (is_instanceobject(v) || is_instanceobject(w))
348 return instancebinop(v, w, "__divmod__", "__rdivmod__");
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000349 if (v->ob_type->tp_as_number == NULL ||
350 w->ob_type->tp_as_number == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000351 err_setstr(TypeError,
352 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000353 return NULL;
354 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000355 if (coerce(&v, &w) != 0)
356 return NULL;
357 x = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
358 DECREF(v);
359 DECREF(w);
360 return x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000361}
362
363static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000364builtin_eval(self, args)
365 object *self;
366 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000367{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000368 object *cmd;
369 object *globals = NULL, *locals = NULL;
370 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000371
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000372 if (!newgetargs(args, "O|O!O!:eval",
373 &cmd,
374 &Mappingtype, &globals,
375 &Mappingtype, &locals))
376 return NULL;
377 if (is_codeobject(cmd))
378 return eval_code((codeobject *) cmd, globals, locals,
Guido van Rossum81daa321993-05-20 14:24:46 +0000379 (object *)NULL, (object *)NULL);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000380 if (!is_stringobject(cmd)) {
381 err_setstr(TypeError,
382 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000383 return NULL;
384 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000385 str = getstringvalue(cmd);
386 if (strlen(str) != getstringsize(cmd)) {
387 err_setstr(ValueError,
388 "embedded '\\0' in string arg");
389 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000390 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000391 while (*str == ' ' || *str == '\t')
392 str++;
393 return run_string(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000394}
395
396static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000397builtin_execfile(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000398 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000399 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000400{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000401 char *filename;
402 object *globals = NULL, *locals = NULL;
403 object *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000404 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000405 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000406 int n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000407
408 if (!newgetargs(args, "s|O!O!:execfile",
409 &filename,
410 &Mappingtype, &globals,
411 &Mappingtype, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000412 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000413 BGN_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000414 fp = fopen(filename, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000415 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000416 if (fp == NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000417 err_errno(IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000418 return NULL;
419 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000420 res = run_file(fp, filename, file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000421 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000422 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000423 END_SAVE
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000424 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000425}
426
427static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000428builtin_float(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000429 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000430 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000431{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000432 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000433 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000434
435 if (!newgetargs(args, "O:float", &v))
436 return NULL;
437 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000438 nb->nb_float == NULL) {
439 err_setstr(TypeError,
440 "float() argument can't be converted to float");
441 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000442 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000443 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000444}
445
446static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000447builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000448 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000449 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000450{
Guido van Rossum94390a41992-08-14 15:14:30 +0000451 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000452 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000453
454 if (!newgetargs(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000455 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000456 return getattro(v, name);
457}
458
459static object *
460builtin_hasattr(self, args)
461 object *self;
462 object *args;
463{
464 object *v;
465 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000466
467 if (!newgetargs(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000468 return NULL;
469 v = getattro(v, name);
470 if (v == NULL) {
471 err_clear();
472 return newintobject(0L);
473 }
474 DECREF(v);
475 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000476}
477
478static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000479builtin_id(self, args)
480 object *self;
481 object *args;
482{
483 object *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000484
485 if (!newgetargs(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000486 return NULL;
487 return newintobject((long)v);
488}
489
490static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000491builtin_map(self, args)
492 object *self;
493 object *args;
494{
495 typedef struct {
496 object *seq;
497 sequence_methods *sqf;
498 int len;
499 } sequence;
500
501 object *func, *result;
502 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000503 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000504 register int i, j;
505
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000506 n = gettuplesize(args);
507 if (n < 2) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000508 err_setstr(TypeError, "map() requires at least two args");
509 return NULL;
510 }
511
512 func = gettupleitem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000513 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000514
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000515 if ((seqs = NEW(sequence, n)) == NULL) {
516 err_nomem();
517 goto Fail_2;
518 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000519
Guido van Rossum2d951851994-08-29 12:52:16 +0000520 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000521 int curlen;
522
523 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL)
524 goto Fail_2;
525
526 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
527 static char errmsg[] =
528 "argument %d to map() must be a sequence object";
529 char errbuf[sizeof(errmsg) + 3];
530
531 sprintf(errbuf, errmsg, i+2);
532 err_setstr(TypeError, errbuf);
533 goto Fail_2;
534 }
535
536 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
537 goto Fail_2;
538
539 if (curlen > len)
540 len = curlen;
541 }
542
543 if ((result = (object *) newlistobject(len)) == NULL)
544 goto Fail_2;
545
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000546 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000547 for (i = 0; ; ++i) {
548 object *arglist, *item, *value;
549 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000550
Guido van Rossum2d951851994-08-29 12:52:16 +0000551 if (func == None && n == 1)
552 arglist = NULL;
553 else {
554 if ((arglist = newtupleobject(n)) == NULL)
555 goto Fail_1;
556 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000557
558 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000559 if (sqp->len < 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000560 INCREF(None);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000561 item = None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000562 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000563 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000564 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000565 if (item == NULL) {
566 if (i < sqp->len)
567 goto Fail_0;
568 if (err_occurred() == IndexError) {
569 err_clear();
570 INCREF(None);
571 item = None;
572 sqp->len = -1;
573 }
574 else {
575 goto Fail_0;
576 }
577 }
578 else
579 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000580
Guido van Rossum12d12c51993-10-26 17:58:25 +0000581 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000582 if (!arglist)
583 break;
584 if (settupleitem(arglist, j, item) < 0) {
585 DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000586 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000587 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000588 continue;
589
590 Fail_0:
Guido van Rossum2d951851994-08-29 12:52:16 +0000591 XDECREF(arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000592 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000593 }
594
Guido van Rossum2d951851994-08-29 12:52:16 +0000595 if (!arglist)
596 arglist = item;
597
598 if (!any) {
599 DECREF(arglist);
600 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000601 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000602
603 if (func == None)
604 value = arglist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000605 else {
Guido van Rossum2d951851994-08-29 12:52:16 +0000606 value = call_object(func, arglist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000607 DECREF(arglist);
608 if (value == NULL)
609 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000610 }
611 if (i >= len) {
612 if (addlistitem(result, value) < 0)
613 goto Fail_1;
614 }
615 else {
616 if (setlistitem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000617 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000618 }
619 }
620
Guido van Rossum2d951851994-08-29 12:52:16 +0000621 DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000622 return result;
623
Guido van Rossum12d12c51993-10-26 17:58:25 +0000624Fail_1:
625 DECREF(result);
626Fail_2:
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000627 if (seqs) DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000628 return NULL;
629}
630
631static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000632builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000633 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000634 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000635{
Guido van Rossum94390a41992-08-14 15:14:30 +0000636 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000637 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000638 object *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000639
640 if (!newgetargs(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000641 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000642 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000643 return NULL;
644 INCREF(None);
645 return None;
646}
647
648static object *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000649builtin_delattr(self, args)
650 object *self;
651 object *args;
652{
653 object *v;
654 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000655
656 if (!newgetargs(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000657 return NULL;
658 if (setattro(v, name, (object *)NULL) != 0)
659 return NULL;
660 INCREF(None);
661 return None;
662}
663
664static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000665builtin_hash(self, args)
666 object *self;
667 object *args;
668{
669 object *v;
670 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000671
672 if (!newgetargs(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000673 return NULL;
674 x = hashobject(v);
675 if (x == -1)
676 return NULL;
677 return newintobject(x);
678}
679
680static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000681builtin_hex(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000682 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000683 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000684{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000685 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000686 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000687
688 if (!newgetargs(args, "O:hex", &v))
689 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000690
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000691 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000692 nb->nb_hex == NULL) {
693 err_setstr(TypeError,
694 "hex() argument can't be converted to hex");
695 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000696 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000697 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000698}
699
Guido van Rossum3165fe61992-09-25 21:59:05 +0000700static object *builtin_raw_input PROTO((object *, object *));
701
Guido van Rossum006bcd41991-10-24 14:54:44 +0000702static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000703builtin_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000704 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000705 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000706{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000707 object *line;
708 char *str;
709 object *res;
710
711 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000712 if (line == NULL)
713 return line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000714 if (!getargs(line, "s;embedded '\\0' in input line", &str))
715 return NULL;
716 while (*str == ' ' || *str == '\t')
717 str++;
718 res = run_string(str, eval_input, (object *)NULL, (object *)NULL);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000719 DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000720 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000721}
722
723static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000724builtin_int(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000725 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000726 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000727{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000728 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000729 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000730
731 if (!newgetargs(args, "O:int", &v))
732 return NULL;
733 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000734 nb->nb_int == NULL) {
735 err_setstr(TypeError,
736 "int() argument can't be converted to int");
737 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000738 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000739 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000740}
741
742static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000743builtin_len(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000744 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000745 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000746{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000747 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000748 long len;
749 typeobject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000750
751 if (!newgetargs(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000752 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000753 tp = v->ob_type;
754 if (tp->tp_as_sequence != NULL) {
755 len = (*tp->tp_as_sequence->sq_length)(v);
756 }
757 else if (tp->tp_as_mapping != NULL) {
758 len = (*tp->tp_as_mapping->mp_length)(v);
759 }
760 else {
761 err_setstr(TypeError, "len() of unsized object");
762 return NULL;
763 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000764 if (len < 0)
765 return NULL;
766 else
767 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000768}
769
770static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000771builtin_long(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000772 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000773 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000774{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000775 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000776 number_methods *nb;
777
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000778 if (!newgetargs(args, "O:long", &v))
779 return NULL;
780 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000781 nb->nb_long == NULL) {
782 err_setstr(TypeError,
783 "long() argument can't be converted to long");
784 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000785 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000786 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000787}
788
789static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000790min_max(args, sign)
791 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000792 int sign;
793{
Guido van Rossum2d951851994-08-29 12:52:16 +0000794 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000795 object *v, *w, *x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000796 sequence_methods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000797
798 if (gettuplesize(args) > 1)
799 v = args;
800 else if (!newgetargs(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000801 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000802 sq = v->ob_type->tp_as_sequence;
803 if (sq == NULL) {
804 err_setstr(TypeError, "min() or max() of non-sequence");
805 return NULL;
806 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000807 w = NULL;
808 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000809 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000810 if (x == NULL) {
811 if (err_occurred() == IndexError) {
812 err_clear();
813 break;
814 }
815 XDECREF(w);
816 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000817 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000818 if (w == NULL)
819 w = x;
820 else {
821 if (cmpobject(x, w) * sign > 0) {
822 DECREF(w);
823 w = x;
824 }
825 else
826 DECREF(x);
827 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000828 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000829 if (w == NULL)
830 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000831 return w;
832}
833
834static object *
835builtin_min(self, v)
836 object *self;
837 object *v;
838{
839 return min_max(v, -1);
840}
841
842static object *
843builtin_max(self, v)
844 object *self;
845 object *v;
846{
847 return min_max(v, 1);
848}
849
850static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000851builtin_oct(self, args)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000852 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000853 object *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000854{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000855 object *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000856 number_methods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000857
858 if (!newgetargs(args, "O:oct", &v))
859 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000860 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
861 nb->nb_oct == NULL) {
862 err_setstr(TypeError,
863 "oct() argument can't be converted to oct");
864 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000865 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000866 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000867}
868
869static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000870builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000871 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000872 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000873{
Guido van Rossum2d951851994-08-29 12:52:16 +0000874 char *name;
875 char *mode = "r";
876 int bufsize = -1;
877 object *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000878
879 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000880 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000881 f = newfileobject(name, mode);
882 if (f != NULL)
883 setfilebufsize(f, bufsize);
884 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000885}
886
887static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000888builtin_ord(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 Rossum1ae940a1995-01-02 19:04:15 +0000892 char c;
893
894 if (!newgetargs(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000895 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000896 return newintobject((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000897}
898
899static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000900builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000901 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000902 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000903{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000904 object *v, *w, *z = None, *x;
905
906 if (!newgetargs(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum180d7b41994-09-29 09:45:57 +0000907 return NULL;
908 if (z == None) {
909 if (is_instanceobject(v) || is_instanceobject(w))
910 return instancebinop(v, w, "__pow__", "__rpow__");
911 }
912 else {
913 /* XXX The ternary version doesn't do coercions */
914 if (is_instanceobject(v))
915 return v->ob_type->tp_as_number->nb_power(v, w, z);
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000916 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000917 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000918 (z!=None && z->ob_type->tp_as_number == NULL) ||
919 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000920 err_setstr(TypeError, "pow() requires numeric arguments");
921 return NULL;
922 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000923 if (coerce(&v, &w) != 0)
924 return NULL;
Guido van Rossum6d023c91995-01-04 19:12:13 +0000925 if (z == None) {
926 x = (*v->ob_type->tp_as_number->nb_power)(v, w, z);
Guido van Rossumdf05ac61994-08-29 12:52:37 +0000927 }
Guido van Rossum6d023c91995-01-04 19:12:13 +0000928 else {
929 object *v1, *z1, *w2, *z2;
930 x = NULL;
931 v1 = v;
932 z1 = z;
933 if (coerce(&v1, &z1) != 0)
934 goto error2;
935 w2 = w;
936 z2 = z1;
937 if (coerce(&w2, &z2) != 0)
938 goto error1;
939 x = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
940 DECREF(w2);
941 DECREF(z2);
942 error1:
943 DECREF(v1);
944 DECREF(z1);
945 error2:
946 ;
947 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000948 DECREF(v);
949 DECREF(w);
950 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000951}
952
953static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000954builtin_range(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000955 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000956 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000957{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000958 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000959 int i, n;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000960 object *v;
961
962 if (gettuplesize(args) <= 1) {
963 if (!newgetargs(args,
964 "i;range() requires 1-3 int arguments",
965 &ihigh))
966 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000967 }
968 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000969 if (!newgetargs(args,
970 "ii|i;range() requires 1-3 int arguments",
971 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000972 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000973 }
974 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000975 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000976 return NULL;
977 }
978 /* XXX ought to check overflow of subtraction */
979 if (istep > 0)
980 n = (ihigh - ilow + istep - 1) / istep;
981 else
982 n = (ihigh - ilow + istep + 1) / istep;
983 if (n < 0)
984 n = 0;
985 v = newlistobject(n);
986 if (v == NULL)
987 return NULL;
988 for (i = 0; i < n; i++) {
989 object *w = newintobject(ilow);
990 if (w == NULL) {
991 DECREF(v);
992 return NULL;
993 }
994 setlistitem(v, i, w);
995 ilow += istep;
996 }
997 return v;
998}
999
1000static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001001builtin_xrange(self, args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001002 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001003 object *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001004{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001005 long ilow = 0, ihigh = 0, istep = 1;
1006 int n;
1007 object *v;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001008
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001009 if (gettuplesize(args) <= 1) {
1010 if (!newgetargs(args,
1011 "i;xrange() requires 1-3 int arguments",
1012 &ihigh))
1013 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001014 }
1015 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001016 if (!newgetargs(args,
1017 "ii|i;xrange() requires 1-3 int arguments",
1018 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001019 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001020 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001021 if (istep == 0) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001022 err_setstr(ValueError, "zero step for xrange()");
1023 return NULL;
1024 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001025 /* XXX ought to check overflow of subtraction */
1026 if (istep > 0)
1027 n = (ihigh - ilow + istep - 1) / istep;
1028 else
1029 n = (ihigh - ilow + istep + 1) / istep;
1030 if (n < 0)
1031 n = 0;
1032 return newrangeobject(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001033}
1034
1035static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001036builtin_raw_input(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001037 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001038 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001039{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001040 object *v = NULL;
1041 object *f;
1042
1043 if (!newgetargs(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001044 return NULL;
Guido van Rossum90933611991-06-07 16:10:43 +00001045 if (v != NULL) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001046 f = sysget("stdout");
1047 if (f == NULL) {
1048 err_setstr(RuntimeError, "lost sys.stdout");
1049 return NULL;
1050 }
1051 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +00001052 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001053 return NULL;
1054 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001055 f = sysget("stdin");
1056 if (f == NULL) {
1057 err_setstr(RuntimeError, "lost sys.stdin");
1058 return NULL;
1059 }
1060 return filegetline(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001061}
1062
1063static object *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001064builtin_reduce(self, args)
1065 object *self;
1066 object *args;
1067{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001068 object *seq, *func, *result = NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001069 sequence_methods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001070 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001071
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001072 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result))
1073 return NULL;
1074 if (result != NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001075 INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001076
1077 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
1078 err_setstr(TypeError,
1079 "2nd argument to reduce() must be a sequence object");
1080 return NULL;
1081 }
1082
Guido van Rossum12d12c51993-10-26 17:58:25 +00001083 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001084 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001085
Guido van Rossum2d951851994-08-29 12:52:16 +00001086 for (i = 0; ; ++i) {
Guido van Rossum12d12c51993-10-26 17:58:25 +00001087 object *op2;
1088
1089 if (args->ob_refcnt > 1) {
1090 DECREF(args);
1091 if ((args = newtupleobject(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001092 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001093 }
1094
Guido van Rossum2d951851994-08-29 12:52:16 +00001095 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
1096 if (err_occurred() == IndexError) {
1097 err_clear();
1098 break;
1099 }
1100 goto Fail;
1101 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001102
Guido van Rossum2d951851994-08-29 12:52:16 +00001103 if (result == NULL)
1104 result = op2;
1105 else {
1106 settupleitem(args, 0, result);
1107 settupleitem(args, 1, op2);
1108 if ((result = call_object(func, args)) == NULL)
1109 goto Fail;
1110 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001111 }
1112
1113 DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001114
Guido van Rossum2d951851994-08-29 12:52:16 +00001115 if (result == NULL)
1116 err_setstr(TypeError,
1117 "reduce of empty sequence with no initial value");
1118
Guido van Rossum12d12c51993-10-26 17:58:25 +00001119 return result;
1120
Guido van Rossum2d951851994-08-29 12:52:16 +00001121Fail:
1122 XDECREF(args);
1123 XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001124 return NULL;
1125}
1126
1127static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001128builtin_reload(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001129 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001130 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001131{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001132 object *v;
1133
1134 if (!newgetargs(args, "O:reload", &v))
1135 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001136 return reload_module(v);
1137}
1138
1139static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001140builtin_repr(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001141 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001142 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001143{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001144 object *v;
1145
1146 if (!newgetargs(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001147 return NULL;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001148 return reprobject(v);
1149}
1150
1151static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001152builtin_round(self, args)
1153 object *self;
1154 object *args;
1155{
1156 extern double floor PROTO((double));
1157 extern double ceil PROTO((double));
1158 double x;
1159 double f;
1160 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001161 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001162
1163 if (!newgetargs(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001164 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001165 f = 1.0;
1166 for (i = ndigits; --i >= 0; )
1167 f = f*10.0;
1168 for (i = ndigits; ++i <= 0; )
1169 f = f*0.1;
1170 if (x >= 0.0)
1171 return newfloatobject(floor(x*f + 0.5) / f);
1172 else
1173 return newfloatobject(ceil(x*f - 0.5) / f);
1174}
1175
1176static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001177builtin_str(self, args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001178 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001179 object *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001180{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001181 object *v;
1182
1183 if (!newgetargs(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001184 return NULL;
Guido van Rossumc6004111993-11-05 10:22:19 +00001185 return strobject(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001186}
1187
1188static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001189builtin_tuple(self, args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001190 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001191 object *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001192{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001193 object *v;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001194 sequence_methods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001195
1196 if (!newgetargs(args, "O:tuple", &v))
1197 return NULL;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001198 if (is_tupleobject(v)) {
1199 INCREF(v);
1200 return v;
1201 }
Guido van Rossume4ab6471994-08-30 12:38:05 +00001202 if (is_listobject(v))
1203 return listtuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001204 if (is_stringobject(v)) {
1205 int n = getstringsize(v);
1206 object *t = newtupleobject(n);
1207 if (t != NULL) {
1208 int i;
1209 char *p = getstringvalue(v);
1210 for (i = 0; i < n; i++) {
1211 object *item = newsizedstringobject(p+i, 1);
1212 if (item == NULL) {
1213 DECREF(t);
1214 t = NULL;
1215 break;
1216 }
1217 settupleitem(t, i, item);
1218 }
1219 }
1220 return t;
1221 }
1222 /* Generic sequence object */
1223 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1224 int n = (*sqf->sq_length)(v);
1225 int i;
1226 object *t;
1227 if (n < 0)
1228 return NULL;
1229 t = newtupleobject(n);
1230 if (t == NULL)
1231 return NULL;
1232 for (i = 0; i < n; i++) {
1233 object *item = (*sqf->sq_item)(v, i);
1234 if (item == NULL) {
1235 DECREF(t);
1236 t = NULL;
1237 break;
1238 }
1239 settupleitem(t, i, item);
1240 }
1241 /* XXX Should support indefinite-length sequences */
1242 return t;
1243 }
1244 /* None of the above */
1245 err_setstr(TypeError, "tuple() argument must be a sequence");
1246 return NULL;
1247}
1248
1249static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001250builtin_type(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001251 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001252 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001253{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001254 object *v;
1255
1256 if (!newgetargs(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001257 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001258 v = (object *)v->ob_type;
1259 INCREF(v);
1260 return v;
1261}
1262
Guido van Rossum2d951851994-08-29 12:52:16 +00001263static object *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001264builtin_vars(self, args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001265 object *self;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001266 object *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001267{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001268 object *v = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001269 object *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001270
1271 if (!newgetargs(args, "|O:vars", &v))
1272 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001273 if (v == NULL) {
1274 d = getlocals();
1275 INCREF(d);
1276 }
1277 else {
1278 d = getattr(v, "__dict__");
1279 if (d == NULL) {
1280 err_setstr(TypeError,
1281 "vars() argument must have __dict__ attribute");
1282 return NULL;
1283 }
1284 }
1285 return d;
1286}
1287
Guido van Rossum3f5da241990-12-20 15:06:42 +00001288static struct methodlist builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001289 {"__import__", builtin___import__, 1},
1290 {"abs", builtin_abs, 1},
1291 {"apply", builtin_apply, 1},
1292 {"callable", builtin_callable, 1},
1293 {"chr", builtin_chr, 1},
1294 {"cmp", builtin_cmp, 1},
1295 {"coerce", builtin_coerce, 1},
1296 {"compile", builtin_compile, 1},
1297 {"delattr", builtin_delattr, 1},
1298 {"dir", builtin_dir, 1},
1299 {"divmod", builtin_divmod, 1},
1300 {"eval", builtin_eval, 1},
1301 {"execfile", builtin_execfile, 1},
1302 {"filter", builtin_filter, 1},
1303 {"float", builtin_float, 1},
1304 {"getattr", builtin_getattr, 1},
1305 {"hasattr", builtin_hasattr, 1},
1306 {"hash", builtin_hash, 1},
1307 {"hex", builtin_hex, 1},
1308 {"id", builtin_id, 1},
1309 {"input", builtin_input, 1},
1310 {"int", builtin_int, 1},
1311 {"len", builtin_len, 1},
1312 {"long", builtin_long, 1},
1313 {"map", builtin_map, 1},
1314 {"max", builtin_max, 1},
1315 {"min", builtin_min, 1},
1316 {"oct", builtin_oct, 1},
1317 {"open", builtin_open, 1},
1318 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001319 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001320 {"range", builtin_range, 1},
1321 {"raw_input", builtin_raw_input, 1},
1322 {"reduce", builtin_reduce, 1},
1323 {"reload", builtin_reload, 1},
1324 {"repr", builtin_repr, 1},
1325 {"round", builtin_round, 1},
1326 {"setattr", builtin_setattr, 1},
1327 {"str", builtin_str, 1},
1328 {"tuple", builtin_tuple, 1},
1329 {"type", builtin_type, 1},
1330 {"vars", builtin_vars, 1},
1331 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001332 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001333};
1334
1335static object *builtin_dict;
1336
1337object *
1338getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +00001339 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001340{
Guido van Rossum2d951851994-08-29 12:52:16 +00001341 return mappinglookup(builtin_dict, name);
1342}
1343
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001344object *
1345getbuiltins(name)
1346 char *name;
1347{
1348 return dictlookup(builtin_dict, name);
1349}
1350
Guido van Rossum2d951851994-08-29 12:52:16 +00001351int
1352setbuiltin(cname, value)
1353 char *cname;
1354 object *value;
1355{
1356 return dictinsert(builtin_dict, cname, value);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001357}
1358
1359/* Predefined exceptions */
1360
Guido van Rossum25831651993-05-19 14:50:45 +00001361object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001362object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +00001363object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001364object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001365object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +00001366object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001367object *IndexError;
1368object *KeyError;
1369object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001370object *MemoryError;
1371object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001372object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001373object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001374object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001375object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +00001376object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001377object *TypeError;
1378object *ValueError;
1379object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001380
Guido van Rossum3f5da241990-12-20 15:06:42 +00001381static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001382newstdexception(name)
1383 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001384{
Guido van Rossumfb905c31991-12-16 15:42:38 +00001385 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001386 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
1387 fatal("no mem for new standard exception");
1388 return v;
1389}
1390
1391static void
1392initerrors()
1393{
Guido van Rossum25831651993-05-19 14:50:45 +00001394 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001395 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +00001396 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001397 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001398 IOError = newstdexception("IOError");
1399 ImportError = newstdexception("ImportError");
1400 IndexError = newstdexception("IndexError");
1401 KeyError = newstdexception("KeyError");
1402 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001403 MemoryError = newstdexception("MemoryError");
1404 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001405 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001406 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +00001407 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001408 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +00001409 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +00001410 TypeError = newstdexception("TypeError");
1411 ValueError = newstdexception("ValueError");
1412 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001413}
1414
1415void
1416initbuiltin()
1417{
1418 object *m;
Guido van Rossum89b33251993-10-22 14:26:06 +00001419 m = initmodule("__builtin__", builtin_methods);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001420 builtin_dict = getmoduledict(m);
1421 INCREF(builtin_dict);
1422 initerrors();
1423 (void) dictinsert(builtin_dict, "None", None);
1424}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001425
1426/* Coerce two numeric types to the "larger" one.
1427 Increment the reference count on each argument.
1428 Return -1 and raise an exception if no coercion is possible
1429 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +00001430*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001431
1432int
1433coerce(pv, pw)
1434 object **pv, **pw;
1435{
1436 register object *v = *pv;
1437 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001438 int res;
1439
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001440 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001441 INCREF(v);
1442 INCREF(w);
1443 return 0;
1444 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001445 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
1446 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
1447 if (res <= 0)
1448 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001449 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001450 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
1451 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
1452 if (res <= 0)
1453 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001454 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00001455 err_setstr(TypeError, "number coercion failed");
1456 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001457}
Guido van Rossum12d12c51993-10-26 17:58:25 +00001458
1459
Guido van Rossume77a7571993-11-03 15:01:26 +00001460/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001461
1462static object *
1463filtertuple(func, tuple)
1464 object *func;
1465 object *tuple;
1466{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001467 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001468 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001469 int len = gettuplesize(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001470
Guido van Rossum2586bf01993-11-01 16:21:44 +00001471 if ((result = newtupleobject(len)) == NULL)
1472 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001473
Guido van Rossum12d12c51993-10-26 17:58:25 +00001474 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001475 object *item, *good;
1476 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001477
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001478 if ((item = gettupleitem(tuple, i)) == NULL)
1479 goto Fail_1;
1480 if (func == None) {
1481 INCREF(item);
1482 good = item;
1483 }
1484 else {
1485 object *arg = mkvalue("(O)", item);
1486 if (arg == NULL)
1487 goto Fail_1;
1488 good = call_object(func, arg);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001489 DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001490 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001491 goto Fail_1;
1492 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001493 ok = testbool(good);
1494 DECREF(good);
1495 if (ok) {
1496 INCREF(item);
1497 if (settupleitem(result, j++, item) < 0)
1498 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001499 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001500 }
1501
Sjoerd Mullender615194a1993-11-01 13:46:50 +00001502 if (resizetuple(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001503 return NULL;
1504
Guido van Rossum12d12c51993-10-26 17:58:25 +00001505 return result;
1506
Guido van Rossum12d12c51993-10-26 17:58:25 +00001507Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001508 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001509 return NULL;
1510}
1511
1512
Guido van Rossume77a7571993-11-03 15:01:26 +00001513/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001514
1515static object *
1516filterstring(func, strobj)
1517 object *func;
1518 object *strobj;
1519{
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001520 object *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001521 register int i, j;
Guido van Rossum2586bf01993-11-01 16:21:44 +00001522 int len = getstringsize(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001523
Guido van Rossum2586bf01993-11-01 16:21:44 +00001524 if (func == None) {
1525 /* No character is ever false -- share input string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001526 INCREF(strobj);
1527 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001528 }
Guido van Rossum2586bf01993-11-01 16:21:44 +00001529 if ((result = newsizedstringobject(NULL, len)) == NULL)
1530 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001531
Guido van Rossum12d12c51993-10-26 17:58:25 +00001532 for (i = j = 0; i < len; ++i) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001533 object *item, *arg, *good;
1534 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001535
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001536 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1537 if (item == NULL)
1538 goto Fail_1;
1539 arg = mkvalue("(O)", item);
1540 DECREF(item);
1541 if (arg == NULL)
1542 goto Fail_1;
1543 good = call_object(func, arg);
1544 DECREF(arg);
1545 if (good == NULL)
1546 goto Fail_1;
1547 ok = testbool(good);
1548 DECREF(good);
1549 if (ok)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001550 GETSTRINGVALUE((stringobject *)result)[j++] =
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001551 GETSTRINGVALUE((stringobject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001552 }
1553
Guido van Rossum12d12c51993-10-26 17:58:25 +00001554 if (resizestring(&result, j) < 0)
1555 return NULL;
1556
Guido van Rossum12d12c51993-10-26 17:58:25 +00001557 return result;
1558
Guido van Rossum12d12c51993-10-26 17:58:25 +00001559Fail_1:
Guido van Rossum2586bf01993-11-01 16:21:44 +00001560 DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001561 return NULL;
1562}