blob: cce19e1ed84926fc2cfb8deb61986b982c774ec4 [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 Rossumc02e15c1991-12-16 13:03:00 +000053builtin_apply(self, v)
54 object *self;
55 object *v;
56{
57 object *func, *args;
58 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) {
59 err_setstr(TypeError, "apply() requires (func,args)");
60 return NULL;
61 }
62 func = gettupleitem(v, 0);
63 args = gettupleitem(v, 1);
64 return call_object(func, args);
65}
66
67static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +000068builtin_chr(self, v)
69 object *self;
70 object *v;
71{
72 long x;
73 char s[1];
74 if (v == NULL || !is_intobject(v)) {
Guido van Rossum006bcd41991-10-24 14:54:44 +000075 err_setstr(TypeError, "chr() requires int argument");
Guido van Rossum3f5da241990-12-20 15:06:42 +000076 return NULL;
77 }
78 x = getintvalue(v);
79 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +000080 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +000081 return NULL;
82 }
83 s[0] = x;
84 return newsizedstringobject(s, 1);
85}
86
87static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +000088builtin_coerce(self, args)
89 object *self;
90 object *args;
91{
92 object *v, *w;
93 object *res;
94
95 if (!getargs(args, "(OO)", &v, &w))
96 return NULL;
97 if (coerce(&v, &w) < 0)
98 return NULL;
99 res = mkvalue("(OO)", v, w);
100 DECREF(v);
101 DECREF(w);
102 return res;
103}
104
105static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000106builtin_dir(self, v)
107 object *self;
108 object *v;
109{
110 object *d;
111 if (v == NULL) {
112 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000113 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000114 }
115 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000116 d = getattr(v, "__dict__");
117 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000118 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000119 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000120 return NULL;
121 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000122 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000123 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000124 v = getdictkeys(d);
125 if (sortlist(v) != 0) {
126 DECREF(v);
127 v = NULL;
128 }
129 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000130 else {
131 v = newlistobject(0);
132 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000133 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000134 return v;
135}
136
137static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000138builtin_divmod(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000139 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000140 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000141{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000142 object *v, *w, *x;
143 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000144 err_setstr(TypeError, "divmod() requires 2 arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000145 return NULL;
146 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000147 v = gettupleitem(args, 0);
148 w = gettupleitem(args, 1);
149 if (v->ob_type->tp_as_number == NULL ||
150 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000151 err_setstr(TypeError, "divmod() requires numeric arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000152 return NULL;
153 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000154 if (coerce(&v, &w) != 0)
155 return NULL;
156 x = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
157 DECREF(v);
158 DECREF(w);
159 return x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000160}
161
162static object *
163exec_eval(v, start)
164 object *v;
165 int start;
166{
167 object *str = NULL, *globals = NULL, *locals = NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000168 char *s;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000169 int n;
170 if (v != NULL) {
171 if (is_stringobject(v))
172 str = v;
173 else if (is_tupleobject(v) &&
174 ((n = gettuplesize(v)) == 2 || n == 3)) {
175 str = gettupleitem(v, 0);
176 globals = gettupleitem(v, 1);
177 if (n == 3)
178 locals = gettupleitem(v, 2);
179 }
180 }
181 if (str == NULL || !is_stringobject(str) ||
182 globals != NULL && !is_dictobject(globals) ||
183 locals != NULL && !is_dictobject(locals)) {
184 err_setstr(TypeError,
185 "exec/eval arguments must be string[,dict[,dict]]");
186 return NULL;
187 }
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000188 s = getstringvalue(str);
189 if (start == eval_input) {
190 while (*s == ' ' || *s == '\t')
191 s++;
192 }
193 return run_string(s, start, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000194}
195
196static object *
197builtin_eval(self, v)
198 object *self;
199 object *v;
200{
201 return exec_eval(v, eval_input);
202}
203
204static object *
205builtin_exec(self, v)
206 object *self;
207 object *v;
208{
209 return exec_eval(v, file_input);
210}
211
212static object *
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000213builtin_execfile(self, v)
214 object *self;
215 object *v;
216{
217 object *str = NULL, *globals = NULL, *locals = NULL, *w;
218 FILE* fp;
219 int n;
220 if (v != NULL) {
221 if (is_stringobject(v))
222 str = v;
223 else if (is_tupleobject(v) &&
224 ((n = gettuplesize(v)) == 2 || n == 3)) {
225 str = gettupleitem(v, 0);
226 globals = gettupleitem(v, 1);
227 if (n == 3)
228 locals = gettupleitem(v, 2);
229 }
230 }
231 if (str == NULL || !is_stringobject(str) ||
232 globals != NULL && !is_dictobject(globals) ||
233 locals != NULL && !is_dictobject(locals)) {
234 err_setstr(TypeError,
235 "execfile arguments must be filename[,dict[,dict]]");
236 return NULL;
237 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000238 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000239 fp = fopen(getstringvalue(str), "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000240 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000241 if (fp == NULL) {
242 err_setstr(IOError, "execfile cannot open the file argument");
243 return NULL;
244 }
245 w = run_file(fp, getstringvalue(str), file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000246 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000247 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000248 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000249 return w;
250}
251
252static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000253builtin_float(self, v)
254 object *self;
255 object *v;
256{
257 if (v == NULL) {
258 /* */
259 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000260 else if (is_intobject(v)) {
261 long x = getintvalue(v);
262 return newfloatobject((double)x);
263 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000264 else if (is_longobject(v)) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000265 return newfloatobject(dgetlongvalue(v));
266 }
267 else if (is_floatobject(v)) {
268 INCREF(v);
269 return v;
270 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000271 else if (is_instanceobject(v)) {
272 return instance_convert(v, "__float__");
273 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000274 err_setstr(TypeError, "float() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000275 return NULL;
276}
277
278static object *
Guido van Rossum33894be1992-01-27 16:53:09 +0000279builtin_getattr(self, v)
280 object *self;
281 object *v;
282{
283 object *name;
284 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 ||
285 (name = gettupleitem(v, 1), !is_stringobject(name))) {
286 err_setstr(TypeError,
287 "getattr() arguments must be (object, string)");
288 return NULL;
289 }
290 return getattr(gettupleitem(v, 0), getstringvalue(name));
291}
292
293static object *
294builtin_setattr(self, v)
295 object *self;
296 object *v;
297{
298 object *name;
299 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3 ||
300 (name = gettupleitem(v, 1), !is_stringobject(name))) {
301 err_setstr(TypeError,
302 "setattr() arguments must be (object, string, object)");
303 return NULL;
304 }
305 if (setattr(gettupleitem(v, 0),
306 getstringvalue(name), gettupleitem(v, 2)) != 0)
307 return NULL;
308 INCREF(None);
309 return None;
310}
311
312static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000313builtin_hex(self, v)
314 object *self;
315 object *v;
316{
317 if (v != NULL) {
318 if (is_intobject(v)) {
319 char buf[20];
320 long x = getintvalue(v);
321 if (x >= 0)
322 sprintf(buf, "0x%lx", x);
323 else
324 sprintf(buf, "-0x%lx", -x);
325 return newstringobject(buf);
326 }
327 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000328 return long_format(v, 16);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000329 }
330 }
331 err_setstr(TypeError, "hex() requires int/long argument");
332 return NULL;
333}
334
335static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000336builtin_input(self, v)
337 object *self;
338 object *v;
339{
340 FILE *in = sysgetfile("stdin", stdin);
341 FILE *out = sysgetfile("stdout", stdout);
Guido van Rossum22ebe2f1992-03-12 17:33:52 +0000342 int c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000343 object *m, *d;
344 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000345 if (v != NULL) {
346 if (printobject(v, out, PRINT_RAW) != 0)
347 return NULL;
348 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000349 m = add_module("__main__");
350 d = getmoduledict(m);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000351 BGN_SAVE
Guido van Rossum22ebe2f1992-03-12 17:33:52 +0000352 while ((c = getc(in)) != EOF && (c == ' ' || c == '\t'))
353 ;
354 ungetc(c, in);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000355 END_SAVE
Guido van Rossum3f5da241990-12-20 15:06:42 +0000356 return run_file(in, "<stdin>", expr_input, d, d);
357}
358
359static object *
360builtin_int(self, v)
361 object *self;
362 object *v;
363{
364 if (v == NULL) {
365 /* */
366 }
367 else if (is_intobject(v)) {
368 INCREF(v);
369 return v;
370 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000371 else if (is_longobject(v)) {
372 long x;
373 x = getlongvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000374 if (err_occurred())
Guido van Rossumd4905451991-05-05 20:00:36 +0000375 return NULL;
376 return newintobject(x);
377 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000378 else if (is_floatobject(v)) {
379 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000380 /* XXX should check for overflow */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000381 return newintobject((long)x);
382 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000383 else if (is_instanceobject(v)) {
384 return instance_convert(v, "__int__");
385 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000386 err_setstr(TypeError, "int() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000387 return NULL;
388}
389
390static object *
391builtin_len(self, v)
392 object *self;
393 object *v;
394{
395 long len;
396 typeobject *tp;
397 if (v == NULL) {
398 err_setstr(TypeError, "len() without argument");
399 return NULL;
400 }
401 tp = v->ob_type;
402 if (tp->tp_as_sequence != NULL) {
403 len = (*tp->tp_as_sequence->sq_length)(v);
404 }
405 else if (tp->tp_as_mapping != NULL) {
406 len = (*tp->tp_as_mapping->mp_length)(v);
407 }
408 else {
409 err_setstr(TypeError, "len() of unsized object");
410 return NULL;
411 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000412 if (len < 0)
413 return NULL;
414 else
415 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000416}
417
418static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000419builtin_long(self, v)
420 object *self;
421 object *v;
422{
423 if (v == NULL) {
424 /* */
425 }
426 else if (is_intobject(v)) {
427 return newlongobject(getintvalue(v));
428 }
429 else if (is_longobject(v)) {
430 INCREF(v);
431 return v;
432 }
433 else if (is_floatobject(v)) {
434 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000435 return dnewlongobject(x);
Guido van Rossumd4905451991-05-05 20:00:36 +0000436 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000437 else if (is_instanceobject(v)) {
438 return instance_convert(v, "__long__");
439 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000440 err_setstr(TypeError, "long() argument must be int, long or float");
441 return NULL;
442}
443
444static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000445min_max(v, sign)
446 object *v;
447 int sign;
448{
449 int i, n, cmp;
450 object *w, *x;
451 sequence_methods *sq;
452 if (v == NULL) {
453 err_setstr(TypeError, "min() or max() without argument");
454 return NULL;
455 }
456 sq = v->ob_type->tp_as_sequence;
457 if (sq == NULL) {
458 err_setstr(TypeError, "min() or max() of non-sequence");
459 return NULL;
460 }
461 n = (*sq->sq_length)(v);
462 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000463 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000464 return NULL;
465 }
466 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
467 for (i = 1; i < n; i++) {
468 x = (*sq->sq_item)(v, i); /* Implies INCREF */
469 cmp = cmpobject(x, w);
470 if (cmp * sign > 0) {
471 DECREF(w);
472 w = x;
473 }
474 else
475 DECREF(x);
476 }
477 return w;
478}
479
480static object *
481builtin_min(self, v)
482 object *self;
483 object *v;
484{
485 return min_max(v, -1);
486}
487
488static object *
489builtin_max(self, v)
490 object *self;
491 object *v;
492{
493 return min_max(v, 1);
494}
495
496static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000497builtin_oct(self, v)
498 object *self;
499 object *v;
500{
501 if (v != NULL) {
502 if (is_intobject(v)) {
503 char buf[20];
504 long x = getintvalue(v);
505 if (x >= 0)
506 sprintf(buf, "0%lo", x);
507 else
508 sprintf(buf, "-0%lo", -x);
509 return newstringobject(buf);
510 }
511 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000512 return long_format(v, 8);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000513 }
514 }
515 err_setstr(TypeError, "oct() requires int/long argument");
516 return NULL;
517}
518
519static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000520builtin_open(self, v)
521 object *self;
522 object *v;
523{
524 object *name, *mode;
525 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 ||
526 !is_stringobject(name = gettupleitem(v, 0)) ||
527 !is_stringobject(mode = gettupleitem(v, 1))) {
528 err_setstr(TypeError, "open() requires 2 string arguments");
529 return NULL;
530 }
531 v = newfileobject(getstringvalue(name), getstringvalue(mode));
532 return v;
533}
534
535static object *
536builtin_ord(self, v)
537 object *self;
538 object *v;
539{
540 if (v == NULL || !is_stringobject(v)) {
541 err_setstr(TypeError, "ord() must have string argument");
542 return NULL;
543 }
544 if (getstringsize(v) != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000545 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000546 return NULL;
547 }
548 return newintobject((long)(getstringvalue(v)[0] & 0xff));
549}
550
551static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000552builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000553 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000554 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000555{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000556 object *v, *w, *x;
557 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000558 err_setstr(TypeError, "pow() requires 2 arguments");
559 return NULL;
560 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000561 v = gettupleitem(args, 0);
562 w = gettupleitem(args, 1);
563 if (v->ob_type->tp_as_number == NULL ||
564 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000565 err_setstr(TypeError, "pow() requires numeric arguments");
566 return NULL;
567 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000568 if (coerce(&v, &w) != 0)
569 return NULL;
570 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
571 DECREF(v);
572 DECREF(w);
573 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000574}
575
576static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000577builtin_range(self, v)
578 object *self;
579 object *v;
580{
581 static char *errmsg = "range() requires 1-3 int arguments";
582 int i, n;
583 long ilow, ihigh, istep;
584 if (v != NULL && is_intobject(v)) {
585 ilow = 0; ihigh = getintvalue(v); istep = 1;
586 }
587 else if (v == NULL || !is_tupleobject(v)) {
588 err_setstr(TypeError, errmsg);
589 return NULL;
590 }
591 else {
592 n = gettuplesize(v);
593 if (n < 1 || n > 3) {
594 err_setstr(TypeError, errmsg);
595 return NULL;
596 }
597 for (i = 0; i < n; i++) {
598 if (!is_intobject(gettupleitem(v, i))) {
599 err_setstr(TypeError, errmsg);
600 return NULL;
601 }
602 }
603 if (n == 3) {
604 istep = getintvalue(gettupleitem(v, 2));
605 --n;
606 }
607 else
608 istep = 1;
609 ihigh = getintvalue(gettupleitem(v, --n));
610 if (n > 0)
611 ilow = getintvalue(gettupleitem(v, 0));
612 else
613 ilow = 0;
614 }
615 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000616 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000617 return NULL;
618 }
619 /* XXX ought to check overflow of subtraction */
620 if (istep > 0)
621 n = (ihigh - ilow + istep - 1) / istep;
622 else
623 n = (ihigh - ilow + istep + 1) / istep;
624 if (n < 0)
625 n = 0;
626 v = newlistobject(n);
627 if (v == NULL)
628 return NULL;
629 for (i = 0; i < n; i++) {
630 object *w = newintobject(ilow);
631 if (w == NULL) {
632 DECREF(v);
633 return NULL;
634 }
635 setlistitem(v, i, w);
636 ilow += istep;
637 }
638 return v;
639}
640
641static object *
642builtin_raw_input(self, v)
643 object *self;
644 object *v;
645{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000646 FILE *out = sysgetfile("stdout", stdout);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000647 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000648 if (v != NULL) {
649 if (printobject(v, out, PRINT_RAW) != 0)
650 return NULL;
651 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000652 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000653}
654
655static object *
656builtin_reload(self, v)
657 object *self;
658 object *v;
659{
660 return reload_module(v);
661}
662
663static object *
664builtin_type(self, v)
665 object *self;
666 object *v;
667{
668 if (v == NULL) {
669 err_setstr(TypeError, "type() requres an argument");
670 return NULL;
671 }
672 v = (object *)v->ob_type;
673 INCREF(v);
674 return v;
675}
676
677static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000678 {"abs", builtin_abs},
679 {"apply", builtin_apply},
680 {"chr", builtin_chr},
Guido van Rossum04691fc1992-08-12 15:35:34 +0000681 {"coerce", builtin_coerce},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000682 {"dir", builtin_dir},
683 {"divmod", builtin_divmod},
684 {"eval", builtin_eval},
685 {"exec", builtin_exec},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000686 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000687 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000688 {"getattr", builtin_getattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000689 {"hex", builtin_hex},
690 {"input", builtin_input},
691 {"int", builtin_int},
692 {"len", builtin_len},
693 {"long", builtin_long},
694 {"max", builtin_max},
695 {"min", builtin_min},
696 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000697 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000698 {"ord", builtin_ord},
699 {"pow", builtin_pow},
700 {"range", builtin_range},
701 {"raw_input", builtin_raw_input},
702 {"reload", builtin_reload},
Guido van Rossum33894be1992-01-27 16:53:09 +0000703 {"setattr", builtin_setattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000704 {"type", builtin_type},
705 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000706};
707
708static object *builtin_dict;
709
710object *
711getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000712 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000713{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000714 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000715}
716
717/* Predefined exceptions */
718
Guido van Rossumfb905c31991-12-16 15:42:38 +0000719object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000720object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000721object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000722object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000723object *IndexError;
724object *KeyError;
725object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000726object *MemoryError;
727object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000728object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000729object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000730object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000731object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000732object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000733object *TypeError;
734object *ValueError;
735object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000736
Guido van Rossum3f5da241990-12-20 15:06:42 +0000737static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000738newstdexception(name)
739 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000740{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000741 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000742 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
743 fatal("no mem for new standard exception");
744 return v;
745}
746
747static void
748initerrors()
749{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000750 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000751 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000752 IOError = newstdexception("IOError");
753 ImportError = newstdexception("ImportError");
754 IndexError = newstdexception("IndexError");
755 KeyError = newstdexception("KeyError");
756 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000757 MemoryError = newstdexception("MemoryError");
758 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000759 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000760 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000761 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000762 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000763 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000764 TypeError = newstdexception("TypeError");
765 ValueError = newstdexception("ValueError");
766 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000767}
768
769void
770initbuiltin()
771{
772 object *m;
773 m = initmodule("builtin", builtin_methods);
774 builtin_dict = getmoduledict(m);
775 INCREF(builtin_dict);
776 initerrors();
777 (void) dictinsert(builtin_dict, "None", None);
778}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000779
780/* Coerce two numeric types to the "larger" one.
781 Increment the reference count on each argument.
782 Return -1 and raise an exception if no coercion is possible
783 (and then no reference count is incremented).
784 XXX This should be distributed over the various numeric types,
785 XXX but for now I don't see how to implement that.
786 XXX So, for now, if you add a new numeric type,
787 XXX you must add to this function as well. */
788
789int
790coerce(pv, pw)
791 object **pv, **pw;
792{
793 register object *v = *pv;
794 register object *w = *pw;
795 if (v->ob_type == w->ob_type) {
796 INCREF(v);
797 INCREF(w);
798 return 0;
799 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000800 if (is_instanceobject(v) || is_instanceobject(w))
801 return instance_coerce(pv, pw);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000802 if (v->ob_type->tp_as_number == NULL ||
803 w->ob_type->tp_as_number == NULL) {
804 err_setstr(TypeError, "mixing number and non-number");
805 return -1;
806 }
807 if (is_floatobject(v) || is_floatobject(w)) {
808 v = builtin_float((object *)0, v);
809 w = builtin_float((object *)0, w);
810 }
811 else if (is_longobject(v) || is_longobject(w)) {
812 v = builtin_long((object *)0, v);
813 w = builtin_long((object *)0, w);
814 }
815 else {
816 err_setstr(TypeError, "can't coerce numeric types?!?!?");
817 return -1;
818 }
819 if (v == NULL || w == NULL) {
820 XDECREF(v);
821 XDECREF(w);
822 return -1;
823 }
824 *pv = v;
825 *pw = w;
826 return 0;
827}