blob: 2f46931a6a7fbfe985d414198cf3a83bfb9dc6e5 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumbab9d031992-04-05 14:26:55 +00002Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
Guido van Rossumf70e43a1991-02-19 12:39:46 +00003Netherlands.
4
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"
31#include "errcode.h"
32#include "sysmodule.h"
Guido van Rossum86cd6e61991-01-21 15:12:35 +000033#include "bltinmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000034#include "import.h"
35#include "pythonrun.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000036#include "ceval.h"
37#include "modsupport.h"
38
39static object *
40builtin_abs(self, v)
41 object *self;
42 object *v;
43{
Guido van Rossumd4905451991-05-05 20:00:36 +000044 number_methods *nm;
45 if (v == NULL || (nm = v->ob_type->tp_as_number) == NULL) {
46 err_setstr(TypeError, "abs() requires numeric argument");
47 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000048 }
Guido van Rossumd4905451991-05-05 20:00:36 +000049 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000050}
51
52static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000053builtin_apply(self, args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000054 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000055 object *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000056{
Guido van Rossum94390a41992-08-14 15:14:30 +000057 object *func, *arglist;
58 if (!getargs(args, "(OO)", &func, &arglist))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000059 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +000060 return call_object(func, arglist);
Guido van Rossumc02e15c1991-12-16 13:03:00 +000061}
62
63static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000064builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000065 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000066 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000067{
68 long x;
69 char s[1];
Guido van Rossum94390a41992-08-14 15:14:30 +000070 if (!getargs(args, "l", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +000071 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000072 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +000073 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +000074 return NULL;
75 }
76 s[0] = x;
77 return newsizedstringobject(s, 1);
78}
79
80static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +000081builtin_coerce(self, args)
82 object *self;
83 object *args;
84{
85 object *v, *w;
86 object *res;
87
88 if (!getargs(args, "(OO)", &v, &w))
89 return NULL;
90 if (coerce(&v, &w) < 0)
91 return NULL;
92 res = mkvalue("(OO)", v, w);
93 DECREF(v);
94 DECREF(w);
95 return res;
96}
97
98static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +000099builtin_dir(self, v)
100 object *self;
101 object *v;
102{
103 object *d;
104 if (v == NULL) {
105 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000106 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000107 }
108 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000109 d = getattr(v, "__dict__");
110 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000111 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000112 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000113 return NULL;
114 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000115 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000116 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000117 v = getdictkeys(d);
118 if (sortlist(v) != 0) {
119 DECREF(v);
120 v = NULL;
121 }
122 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000123 else {
124 v = newlistobject(0);
125 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000126 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000127 return v;
128}
129
130static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000131builtin_divmod(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000132 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000133 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000134{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000135 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000136 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000137 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000138 if (v->ob_type->tp_as_number == NULL ||
139 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000140 err_setstr(TypeError, "divmod() requires numeric arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000141 return NULL;
142 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000143 if (coerce(&v, &w) != 0)
144 return NULL;
145 x = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
146 DECREF(v);
147 DECREF(w);
148 return x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000149}
150
151static object *
152exec_eval(v, start)
153 object *v;
154 int start;
155{
156 object *str = NULL, *globals = NULL, *locals = NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000157 char *s;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000158 int n;
159 if (v != NULL) {
160 if (is_stringobject(v))
161 str = v;
162 else if (is_tupleobject(v) &&
163 ((n = gettuplesize(v)) == 2 || n == 3)) {
164 str = gettupleitem(v, 0);
165 globals = gettupleitem(v, 1);
166 if (n == 3)
167 locals = gettupleitem(v, 2);
168 }
169 }
170 if (str == NULL || !is_stringobject(str) ||
171 globals != NULL && !is_dictobject(globals) ||
172 locals != NULL && !is_dictobject(locals)) {
173 err_setstr(TypeError,
174 "exec/eval arguments must be string[,dict[,dict]]");
175 return NULL;
176 }
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000177 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000178 if (strlen(s) != getstringsize(str)) {
179 err_setstr(ValueError, "embedded '\\0' in string arg");
180 return NULL;
181 }
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000182 if (start == eval_input) {
183 while (*s == ' ' || *s == '\t')
184 s++;
185 }
186 return run_string(s, start, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000187}
188
189static object *
190builtin_eval(self, v)
191 object *self;
192 object *v;
193{
194 return exec_eval(v, eval_input);
195}
196
197static object *
198builtin_exec(self, v)
199 object *self;
200 object *v;
201{
202 return exec_eval(v, file_input);
203}
204
205static object *
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000206builtin_execfile(self, v)
207 object *self;
208 object *v;
209{
210 object *str = NULL, *globals = NULL, *locals = NULL, *w;
211 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000212 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000213 int n;
214 if (v != NULL) {
215 if (is_stringobject(v))
216 str = v;
217 else if (is_tupleobject(v) &&
218 ((n = gettuplesize(v)) == 2 || n == 3)) {
219 str = gettupleitem(v, 0);
220 globals = gettupleitem(v, 1);
221 if (n == 3)
222 locals = gettupleitem(v, 2);
223 }
224 }
225 if (str == NULL || !is_stringobject(str) ||
226 globals != NULL && !is_dictobject(globals) ||
227 locals != NULL && !is_dictobject(locals)) {
228 err_setstr(TypeError,
229 "execfile arguments must be filename[,dict[,dict]]");
230 return NULL;
231 }
Guido van Rossum2b81dc91992-08-19 16:40:53 +0000232 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000233 if (strlen(s) != getstringsize(str)) {
234 err_setstr(ValueError, "embedded '\\0' in string arg");
235 return NULL;
236 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000237 BGN_SAVE
Guido van Rossum94390a41992-08-14 15:14:30 +0000238 fp = fopen(s, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000239 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000240 if (fp == NULL) {
241 err_setstr(IOError, "execfile cannot open the file argument");
242 return NULL;
243 }
244 w = run_file(fp, getstringvalue(str), file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000245 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000246 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000247 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000248 return w;
249}
250
251static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000252builtin_float(self, v)
253 object *self;
254 object *v;
255{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000256 number_methods *nb;
257
258 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
259 nb->nb_float == NULL) {
260 err_setstr(TypeError,
261 "float() argument can't be converted to float");
262 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000263 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000264 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000265}
266
267static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000268builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000269 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000270 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000271{
Guido van Rossum94390a41992-08-14 15:14:30 +0000272 object *v;
273 char *name;
274 if (!getargs(args, "(Os)", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000275 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000276 return getattr(v, name);
Guido van Rossum33894be1992-01-27 16:53:09 +0000277}
278
279static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000280builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000281 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000282 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000283{
Guido van Rossum94390a41992-08-14 15:14:30 +0000284 object *v;
285 char *name;
286 object *value;
287 if (!getargs(args, "(OsO)", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000288 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000289 if (setattr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000290 return NULL;
291 INCREF(None);
292 return None;
293}
294
295static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000296builtin_hex(self, v)
297 object *self;
298 object *v;
299{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000300 number_methods *nb;
301
302 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
303 nb->nb_hex == NULL) {
304 err_setstr(TypeError,
305 "hex() argument can't be converted to hex");
306 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000307 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000308 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000309}
310
311static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000312builtin_input(self, v)
313 object *self;
314 object *v;
315{
316 FILE *in = sysgetfile("stdin", stdin);
317 FILE *out = sysgetfile("stdout", stdout);
Guido van Rossum22ebe2f1992-03-12 17:33:52 +0000318 int c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000319 object *m, *d;
320 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000321 if (v != NULL) {
322 if (printobject(v, out, PRINT_RAW) != 0)
323 return NULL;
324 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000325 m = add_module("__main__");
326 d = getmoduledict(m);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000327 BGN_SAVE
Guido van Rossum22ebe2f1992-03-12 17:33:52 +0000328 while ((c = getc(in)) != EOF && (c == ' ' || c == '\t'))
329 ;
330 ungetc(c, in);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000331 END_SAVE
Guido van Rossum3f5da241990-12-20 15:06:42 +0000332 return run_file(in, "<stdin>", expr_input, d, d);
333}
334
335static object *
336builtin_int(self, v)
337 object *self;
338 object *v;
339{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000340 number_methods *nb;
341
342 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
343 nb->nb_int == NULL) {
344 err_setstr(TypeError,
345 "int() argument can't be converted to int");
346 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000347 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000348 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000349}
350
351static object *
352builtin_len(self, v)
353 object *self;
354 object *v;
355{
356 long len;
357 typeobject *tp;
358 if (v == NULL) {
359 err_setstr(TypeError, "len() without argument");
360 return NULL;
361 }
362 tp = v->ob_type;
363 if (tp->tp_as_sequence != NULL) {
364 len = (*tp->tp_as_sequence->sq_length)(v);
365 }
366 else if (tp->tp_as_mapping != NULL) {
367 len = (*tp->tp_as_mapping->mp_length)(v);
368 }
369 else {
370 err_setstr(TypeError, "len() of unsized object");
371 return NULL;
372 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000373 if (len < 0)
374 return NULL;
375 else
376 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000377}
378
379static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000380builtin_long(self, v)
381 object *self;
382 object *v;
383{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000384 number_methods *nb;
385
386 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
387 nb->nb_long == NULL) {
388 err_setstr(TypeError,
389 "long() argument can't be converted to long");
390 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000391 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000392 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000393}
394
395static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000396min_max(v, sign)
397 object *v;
398 int sign;
399{
400 int i, n, cmp;
401 object *w, *x;
402 sequence_methods *sq;
403 if (v == NULL) {
404 err_setstr(TypeError, "min() or max() without argument");
405 return NULL;
406 }
407 sq = v->ob_type->tp_as_sequence;
408 if (sq == NULL) {
409 err_setstr(TypeError, "min() or max() of non-sequence");
410 return NULL;
411 }
412 n = (*sq->sq_length)(v);
413 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000414 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000415 return NULL;
416 }
417 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
418 for (i = 1; i < n; i++) {
419 x = (*sq->sq_item)(v, i); /* Implies INCREF */
420 cmp = cmpobject(x, w);
421 if (cmp * sign > 0) {
422 DECREF(w);
423 w = x;
424 }
425 else
426 DECREF(x);
427 }
428 return w;
429}
430
431static object *
432builtin_min(self, v)
433 object *self;
434 object *v;
435{
436 return min_max(v, -1);
437}
438
439static object *
440builtin_max(self, v)
441 object *self;
442 object *v;
443{
444 return min_max(v, 1);
445}
446
447static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000448builtin_oct(self, v)
449 object *self;
450 object *v;
451{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000452 number_methods *nb;
453
454 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
455 nb->nb_oct == NULL) {
456 err_setstr(TypeError,
457 "oct() argument can't be converted to oct");
458 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000459 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000460 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000461}
462
463static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000464builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000465 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000466 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000467{
Guido van Rossum94390a41992-08-14 15:14:30 +0000468 char *name, *mode;
469 if (!getargs(args, "(ss)", &name, &mode))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000470 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000471 return newfileobject(name, mode);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000472}
473
474static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000475builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000476 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000477 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000478{
Guido van Rossum94390a41992-08-14 15:14:30 +0000479 char *s;
480 int len;
481 if (!getargs(args, "s#", &s, &len))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000482 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000483 if (len != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000484 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000485 return NULL;
486 }
Guido van Rossum94390a41992-08-14 15:14:30 +0000487 return newintobject((long)(s[0] & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000488}
489
490static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000491builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000492 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000493 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000494{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000495 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000496 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossumd4905451991-05-05 20:00:36 +0000497 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000498 if (v->ob_type->tp_as_number == NULL ||
499 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000500 err_setstr(TypeError, "pow() requires numeric arguments");
501 return NULL;
502 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000503 if (coerce(&v, &w) != 0)
504 return NULL;
505 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
506 DECREF(v);
507 DECREF(w);
508 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000509}
510
511static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000512builtin_range(self, v)
513 object *self;
514 object *v;
515{
516 static char *errmsg = "range() requires 1-3 int arguments";
517 int i, n;
518 long ilow, ihigh, istep;
519 if (v != NULL && is_intobject(v)) {
520 ilow = 0; ihigh = getintvalue(v); istep = 1;
521 }
522 else if (v == NULL || !is_tupleobject(v)) {
523 err_setstr(TypeError, errmsg);
524 return NULL;
525 }
526 else {
527 n = gettuplesize(v);
528 if (n < 1 || n > 3) {
529 err_setstr(TypeError, errmsg);
530 return NULL;
531 }
532 for (i = 0; i < n; i++) {
533 if (!is_intobject(gettupleitem(v, i))) {
534 err_setstr(TypeError, errmsg);
535 return NULL;
536 }
537 }
538 if (n == 3) {
539 istep = getintvalue(gettupleitem(v, 2));
540 --n;
541 }
542 else
543 istep = 1;
544 ihigh = getintvalue(gettupleitem(v, --n));
545 if (n > 0)
546 ilow = getintvalue(gettupleitem(v, 0));
547 else
548 ilow = 0;
549 }
550 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000551 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000552 return NULL;
553 }
554 /* XXX ought to check overflow of subtraction */
555 if (istep > 0)
556 n = (ihigh - ilow + istep - 1) / istep;
557 else
558 n = (ihigh - ilow + istep + 1) / istep;
559 if (n < 0)
560 n = 0;
561 v = newlistobject(n);
562 if (v == NULL)
563 return NULL;
564 for (i = 0; i < n; i++) {
565 object *w = newintobject(ilow);
566 if (w == NULL) {
567 DECREF(v);
568 return NULL;
569 }
570 setlistitem(v, i, w);
571 ilow += istep;
572 }
573 return v;
574}
575
576static object *
577builtin_raw_input(self, v)
578 object *self;
579 object *v;
580{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000581 FILE *out = sysgetfile("stdout", stdout);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000582 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000583 if (v != NULL) {
584 if (printobject(v, out, PRINT_RAW) != 0)
585 return NULL;
586 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000587 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000588}
589
590static object *
591builtin_reload(self, v)
592 object *self;
593 object *v;
594{
595 return reload_module(v);
596}
597
598static object *
599builtin_type(self, v)
600 object *self;
601 object *v;
602{
603 if (v == NULL) {
604 err_setstr(TypeError, "type() requres an argument");
605 return NULL;
606 }
607 v = (object *)v->ob_type;
608 INCREF(v);
609 return v;
610}
611
612static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000613 {"abs", builtin_abs},
614 {"apply", builtin_apply},
615 {"chr", builtin_chr},
Guido van Rossum04691fc1992-08-12 15:35:34 +0000616 {"coerce", builtin_coerce},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000617 {"dir", builtin_dir},
618 {"divmod", builtin_divmod},
619 {"eval", builtin_eval},
620 {"exec", builtin_exec},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000621 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000622 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000623 {"getattr", builtin_getattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000624 {"hex", builtin_hex},
625 {"input", builtin_input},
626 {"int", builtin_int},
627 {"len", builtin_len},
628 {"long", builtin_long},
629 {"max", builtin_max},
630 {"min", builtin_min},
631 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000632 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000633 {"ord", builtin_ord},
634 {"pow", builtin_pow},
635 {"range", builtin_range},
636 {"raw_input", builtin_raw_input},
637 {"reload", builtin_reload},
Guido van Rossum33894be1992-01-27 16:53:09 +0000638 {"setattr", builtin_setattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000639 {"type", builtin_type},
640 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000641};
642
643static object *builtin_dict;
644
645object *
646getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000647 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000648{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000649 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000650}
651
652/* Predefined exceptions */
653
Guido van Rossumfb905c31991-12-16 15:42:38 +0000654object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000655object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000656object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000657object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000658object *IndexError;
659object *KeyError;
660object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000661object *MemoryError;
662object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000663object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000664object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000665object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000666object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000667object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000668object *TypeError;
669object *ValueError;
670object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000671
Guido van Rossum3f5da241990-12-20 15:06:42 +0000672static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000673newstdexception(name)
674 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000675{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000676 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000677 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
678 fatal("no mem for new standard exception");
679 return v;
680}
681
682static void
683initerrors()
684{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000685 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000686 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000687 IOError = newstdexception("IOError");
688 ImportError = newstdexception("ImportError");
689 IndexError = newstdexception("IndexError");
690 KeyError = newstdexception("KeyError");
691 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000692 MemoryError = newstdexception("MemoryError");
693 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000694 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000695 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000696 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000697 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000698 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000699 TypeError = newstdexception("TypeError");
700 ValueError = newstdexception("ValueError");
701 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000702}
703
704void
705initbuiltin()
706{
707 object *m;
708 m = initmodule("builtin", builtin_methods);
709 builtin_dict = getmoduledict(m);
710 INCREF(builtin_dict);
711 initerrors();
712 (void) dictinsert(builtin_dict, "None", None);
713}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000714
715/* Coerce two numeric types to the "larger" one.
716 Increment the reference count on each argument.
717 Return -1 and raise an exception if no coercion is possible
718 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +0000719*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000720
721int
722coerce(pv, pw)
723 object **pv, **pw;
724{
725 register object *v = *pv;
726 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000727 int res;
728
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000729 if (v->ob_type == w->ob_type) {
730 INCREF(v);
731 INCREF(w);
732 return 0;
733 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000734 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
735 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
736 if (res <= 0)
737 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000738 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000739 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
740 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
741 if (res <= 0)
742 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000743 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000744 err_setstr(TypeError, "number coercion failed");
745 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000746}