blob: d6ae46f59adf9c5782fb13f8647a0658a2acfded [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"
36#include "compile.h" /* For ceval.h */
37#include "ceval.h"
38#include "modsupport.h"
39
40static object *
41builtin_abs(self, v)
42 object *self;
43 object *v;
44{
Guido van Rossumd4905451991-05-05 20:00:36 +000045 number_methods *nm;
46 if (v == NULL || (nm = v->ob_type->tp_as_number) == NULL) {
47 err_setstr(TypeError, "abs() requires numeric argument");
48 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000049 }
Guido van Rossumd4905451991-05-05 20:00:36 +000050 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000051}
52
53static object *
Guido van Rossumc02e15c1991-12-16 13:03:00 +000054builtin_apply(self, v)
55 object *self;
56 object *v;
57{
58 object *func, *args;
59 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) {
60 err_setstr(TypeError, "apply() requires (func,args)");
61 return NULL;
62 }
63 func = gettupleitem(v, 0);
64 args = gettupleitem(v, 1);
65 return call_object(func, args);
66}
67
68static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +000069builtin_chr(self, v)
70 object *self;
71 object *v;
72{
73 long x;
74 char s[1];
75 if (v == NULL || !is_intobject(v)) {
Guido van Rossum006bcd41991-10-24 14:54:44 +000076 err_setstr(TypeError, "chr() requires int argument");
Guido van Rossum3f5da241990-12-20 15:06:42 +000077 return NULL;
78 }
79 x = getintvalue(v);
80 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +000081 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +000082 return NULL;
83 }
84 s[0] = x;
85 return newsizedstringobject(s, 1);
86}
87
88static object *
89builtin_dir(self, v)
90 object *self;
91 object *v;
92{
93 object *d;
94 if (v == NULL) {
95 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +000096 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +000097 }
98 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +000099 d = getattr(v, "__dict__");
100 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000101 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000102 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000103 return NULL;
104 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000105 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000106 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000107 v = getdictkeys(d);
108 if (sortlist(v) != 0) {
109 DECREF(v);
110 v = NULL;
111 }
112 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000113 else {
114 v = newlistobject(0);
115 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000116 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000117 return v;
118}
119
120static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000121builtin_divmod(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000122 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000123 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000124{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000125 object *v, *w, *x;
126 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000127 err_setstr(TypeError, "divmod() requires 2 arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000128 return NULL;
129 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000130 v = gettupleitem(args, 0);
131 w = gettupleitem(args, 1);
132 if (v->ob_type->tp_as_number == NULL ||
133 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000134 err_setstr(TypeError, "divmod() requires numeric arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000135 return NULL;
136 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000137 if (coerce(&v, &w) != 0)
138 return NULL;
139 x = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
140 DECREF(v);
141 DECREF(w);
142 return x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000143}
144
145static object *
146exec_eval(v, start)
147 object *v;
148 int start;
149{
150 object *str = NULL, *globals = NULL, *locals = NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000151 char *s;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000152 int n;
153 if (v != NULL) {
154 if (is_stringobject(v))
155 str = v;
156 else if (is_tupleobject(v) &&
157 ((n = gettuplesize(v)) == 2 || n == 3)) {
158 str = gettupleitem(v, 0);
159 globals = gettupleitem(v, 1);
160 if (n == 3)
161 locals = gettupleitem(v, 2);
162 }
163 }
164 if (str == NULL || !is_stringobject(str) ||
165 globals != NULL && !is_dictobject(globals) ||
166 locals != NULL && !is_dictobject(locals)) {
167 err_setstr(TypeError,
168 "exec/eval arguments must be string[,dict[,dict]]");
169 return NULL;
170 }
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000171 s = getstringvalue(str);
172 if (start == eval_input) {
173 while (*s == ' ' || *s == '\t')
174 s++;
175 }
176 return run_string(s, start, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000177}
178
179static object *
180builtin_eval(self, v)
181 object *self;
182 object *v;
183{
184 return exec_eval(v, eval_input);
185}
186
187static object *
188builtin_exec(self, v)
189 object *self;
190 object *v;
191{
192 return exec_eval(v, file_input);
193}
194
195static object *
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000196builtin_execfile(self, v)
197 object *self;
198 object *v;
199{
200 object *str = NULL, *globals = NULL, *locals = NULL, *w;
201 FILE* fp;
202 int n;
203 if (v != NULL) {
204 if (is_stringobject(v))
205 str = v;
206 else if (is_tupleobject(v) &&
207 ((n = gettuplesize(v)) == 2 || n == 3)) {
208 str = gettupleitem(v, 0);
209 globals = gettupleitem(v, 1);
210 if (n == 3)
211 locals = gettupleitem(v, 2);
212 }
213 }
214 if (str == NULL || !is_stringobject(str) ||
215 globals != NULL && !is_dictobject(globals) ||
216 locals != NULL && !is_dictobject(locals)) {
217 err_setstr(TypeError,
218 "execfile arguments must be filename[,dict[,dict]]");
219 return NULL;
220 }
221 fp = fopen(getstringvalue(str), "r");
222 if (fp == NULL) {
223 err_setstr(IOError, "execfile cannot open the file argument");
224 return NULL;
225 }
226 w = run_file(fp, getstringvalue(str), file_input, globals, locals);
227 fclose(fp);
228 return w;
229}
230
231static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000232builtin_float(self, v)
233 object *self;
234 object *v;
235{
236 if (v == NULL) {
237 /* */
238 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000239 else if (is_intobject(v)) {
240 long x = getintvalue(v);
241 return newfloatobject((double)x);
242 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000243 else if (is_longobject(v)) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000244 return newfloatobject(dgetlongvalue(v));
245 }
246 else if (is_floatobject(v)) {
247 INCREF(v);
248 return v;
249 }
250 err_setstr(TypeError, "float() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000251 return NULL;
252}
253
254static object *
Guido van Rossum33894be1992-01-27 16:53:09 +0000255builtin_getattr(self, v)
256 object *self;
257 object *v;
258{
259 object *name;
260 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 ||
261 (name = gettupleitem(v, 1), !is_stringobject(name))) {
262 err_setstr(TypeError,
263 "getattr() arguments must be (object, string)");
264 return NULL;
265 }
266 return getattr(gettupleitem(v, 0), getstringvalue(name));
267}
268
269static object *
270builtin_setattr(self, v)
271 object *self;
272 object *v;
273{
274 object *name;
275 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3 ||
276 (name = gettupleitem(v, 1), !is_stringobject(name))) {
277 err_setstr(TypeError,
278 "setattr() arguments must be (object, string, object)");
279 return NULL;
280 }
281 if (setattr(gettupleitem(v, 0),
282 getstringvalue(name), gettupleitem(v, 2)) != 0)
283 return NULL;
284 INCREF(None);
285 return None;
286}
287
288static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000289builtin_hex(self, v)
290 object *self;
291 object *v;
292{
293 if (v != NULL) {
294 if (is_intobject(v)) {
295 char buf[20];
296 long x = getintvalue(v);
297 if (x >= 0)
298 sprintf(buf, "0x%lx", x);
299 else
300 sprintf(buf, "-0x%lx", -x);
301 return newstringobject(buf);
302 }
303 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000304 return long_format(v, 16);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000305 }
306 }
307 err_setstr(TypeError, "hex() requires int/long argument");
308 return NULL;
309}
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 Rossum22ebe2f1992-03-12 17:33:52 +0000327 while ((c = getc(in)) != EOF && (c == ' ' || c == '\t'))
328 ;
329 ungetc(c, in);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000330 return run_file(in, "<stdin>", expr_input, d, d);
331}
332
333static object *
334builtin_int(self, v)
335 object *self;
336 object *v;
337{
338 if (v == NULL) {
339 /* */
340 }
341 else if (is_intobject(v)) {
342 INCREF(v);
343 return v;
344 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000345 else if (is_longobject(v)) {
346 long x;
347 x = getlongvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000348 if (err_occurred())
Guido van Rossumd4905451991-05-05 20:00:36 +0000349 return NULL;
350 return newintobject(x);
351 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000352 else if (is_floatobject(v)) {
353 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000354 /* XXX should check for overflow */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000355 return newintobject((long)x);
356 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000357 err_setstr(TypeError, "int() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000358 return NULL;
359}
360
361static object *
362builtin_len(self, v)
363 object *self;
364 object *v;
365{
366 long len;
367 typeobject *tp;
368 if (v == NULL) {
369 err_setstr(TypeError, "len() without argument");
370 return NULL;
371 }
372 tp = v->ob_type;
373 if (tp->tp_as_sequence != NULL) {
374 len = (*tp->tp_as_sequence->sq_length)(v);
375 }
376 else if (tp->tp_as_mapping != NULL) {
377 len = (*tp->tp_as_mapping->mp_length)(v);
378 }
379 else {
380 err_setstr(TypeError, "len() of unsized object");
381 return NULL;
382 }
383 return newintobject(len);
384}
385
386static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000387builtin_long(self, v)
388 object *self;
389 object *v;
390{
391 if (v == NULL) {
392 /* */
393 }
394 else if (is_intobject(v)) {
395 return newlongobject(getintvalue(v));
396 }
397 else if (is_longobject(v)) {
398 INCREF(v);
399 return v;
400 }
401 else if (is_floatobject(v)) {
402 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000403 return dnewlongobject(x);
Guido van Rossumd4905451991-05-05 20:00:36 +0000404 }
405 err_setstr(TypeError, "long() argument must be int, long or float");
406 return NULL;
407}
408
409static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000410min_max(v, sign)
411 object *v;
412 int sign;
413{
414 int i, n, cmp;
415 object *w, *x;
416 sequence_methods *sq;
417 if (v == NULL) {
418 err_setstr(TypeError, "min() or max() without argument");
419 return NULL;
420 }
421 sq = v->ob_type->tp_as_sequence;
422 if (sq == NULL) {
423 err_setstr(TypeError, "min() or max() of non-sequence");
424 return NULL;
425 }
426 n = (*sq->sq_length)(v);
427 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000428 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000429 return NULL;
430 }
431 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
432 for (i = 1; i < n; i++) {
433 x = (*sq->sq_item)(v, i); /* Implies INCREF */
434 cmp = cmpobject(x, w);
435 if (cmp * sign > 0) {
436 DECREF(w);
437 w = x;
438 }
439 else
440 DECREF(x);
441 }
442 return w;
443}
444
445static object *
446builtin_min(self, v)
447 object *self;
448 object *v;
449{
450 return min_max(v, -1);
451}
452
453static object *
454builtin_max(self, v)
455 object *self;
456 object *v;
457{
458 return min_max(v, 1);
459}
460
461static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000462builtin_oct(self, v)
463 object *self;
464 object *v;
465{
466 if (v != NULL) {
467 if (is_intobject(v)) {
468 char buf[20];
469 long x = getintvalue(v);
470 if (x >= 0)
471 sprintf(buf, "0%lo", x);
472 else
473 sprintf(buf, "-0%lo", -x);
474 return newstringobject(buf);
475 }
476 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000477 return long_format(v, 8);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000478 }
479 }
480 err_setstr(TypeError, "oct() requires int/long argument");
481 return NULL;
482}
483
484static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000485builtin_open(self, v)
486 object *self;
487 object *v;
488{
489 object *name, *mode;
490 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 ||
491 !is_stringobject(name = gettupleitem(v, 0)) ||
492 !is_stringobject(mode = gettupleitem(v, 1))) {
493 err_setstr(TypeError, "open() requires 2 string arguments");
494 return NULL;
495 }
496 v = newfileobject(getstringvalue(name), getstringvalue(mode));
497 return v;
498}
499
500static object *
501builtin_ord(self, v)
502 object *self;
503 object *v;
504{
505 if (v == NULL || !is_stringobject(v)) {
506 err_setstr(TypeError, "ord() must have string argument");
507 return NULL;
508 }
509 if (getstringsize(v) != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000510 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000511 return NULL;
512 }
513 return newintobject((long)(getstringvalue(v)[0] & 0xff));
514}
515
516static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000517builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000518 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000519 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000520{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000521 object *v, *w, *x;
522 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000523 err_setstr(TypeError, "pow() requires 2 arguments");
524 return NULL;
525 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000526 v = gettupleitem(args, 0);
527 w = gettupleitem(args, 1);
528 if (v->ob_type->tp_as_number == NULL ||
529 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000530 err_setstr(TypeError, "pow() requires numeric arguments");
531 return NULL;
532 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000533 if (coerce(&v, &w) != 0)
534 return NULL;
535 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
536 DECREF(v);
537 DECREF(w);
538 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000539}
540
541static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000542builtin_range(self, v)
543 object *self;
544 object *v;
545{
546 static char *errmsg = "range() requires 1-3 int arguments";
547 int i, n;
548 long ilow, ihigh, istep;
549 if (v != NULL && is_intobject(v)) {
550 ilow = 0; ihigh = getintvalue(v); istep = 1;
551 }
552 else if (v == NULL || !is_tupleobject(v)) {
553 err_setstr(TypeError, errmsg);
554 return NULL;
555 }
556 else {
557 n = gettuplesize(v);
558 if (n < 1 || n > 3) {
559 err_setstr(TypeError, errmsg);
560 return NULL;
561 }
562 for (i = 0; i < n; i++) {
563 if (!is_intobject(gettupleitem(v, i))) {
564 err_setstr(TypeError, errmsg);
565 return NULL;
566 }
567 }
568 if (n == 3) {
569 istep = getintvalue(gettupleitem(v, 2));
570 --n;
571 }
572 else
573 istep = 1;
574 ihigh = getintvalue(gettupleitem(v, --n));
575 if (n > 0)
576 ilow = getintvalue(gettupleitem(v, 0));
577 else
578 ilow = 0;
579 }
580 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000581 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000582 return NULL;
583 }
584 /* XXX ought to check overflow of subtraction */
585 if (istep > 0)
586 n = (ihigh - ilow + istep - 1) / istep;
587 else
588 n = (ihigh - ilow + istep + 1) / istep;
589 if (n < 0)
590 n = 0;
591 v = newlistobject(n);
592 if (v == NULL)
593 return NULL;
594 for (i = 0; i < n; i++) {
595 object *w = newintobject(ilow);
596 if (w == NULL) {
597 DECREF(v);
598 return NULL;
599 }
600 setlistitem(v, i, w);
601 ilow += istep;
602 }
603 return v;
604}
605
606static object *
607builtin_raw_input(self, v)
608 object *self;
609 object *v;
610{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000611 FILE *out = sysgetfile("stdout", stdout);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000612 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000613 if (v != NULL) {
614 if (printobject(v, out, PRINT_RAW) != 0)
615 return NULL;
616 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000617 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000618}
619
620static object *
621builtin_reload(self, v)
622 object *self;
623 object *v;
624{
625 return reload_module(v);
626}
627
628static object *
629builtin_type(self, v)
630 object *self;
631 object *v;
632{
633 if (v == NULL) {
634 err_setstr(TypeError, "type() requres an argument");
635 return NULL;
636 }
637 v = (object *)v->ob_type;
638 INCREF(v);
639 return v;
640}
641
642static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000643 {"abs", builtin_abs},
644 {"apply", builtin_apply},
645 {"chr", builtin_chr},
646 {"dir", builtin_dir},
647 {"divmod", builtin_divmod},
648 {"eval", builtin_eval},
649 {"exec", builtin_exec},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000650 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000651 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000652 {"getattr", builtin_getattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000653 {"hex", builtin_hex},
654 {"input", builtin_input},
655 {"int", builtin_int},
656 {"len", builtin_len},
657 {"long", builtin_long},
658 {"max", builtin_max},
659 {"min", builtin_min},
660 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000661 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000662 {"ord", builtin_ord},
663 {"pow", builtin_pow},
664 {"range", builtin_range},
665 {"raw_input", builtin_raw_input},
666 {"reload", builtin_reload},
Guido van Rossum33894be1992-01-27 16:53:09 +0000667 {"setattr", builtin_setattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000668 {"type", builtin_type},
669 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000670};
671
672static object *builtin_dict;
673
674object *
675getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000676 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000677{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000678 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000679}
680
681/* Predefined exceptions */
682
Guido van Rossumfb905c31991-12-16 15:42:38 +0000683object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000684object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000685object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000686object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000687object *IndexError;
688object *KeyError;
689object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000690object *MemoryError;
691object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000692object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000693object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000694object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000695object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000696object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000697object *TypeError;
698object *ValueError;
699object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000700
Guido van Rossum3f5da241990-12-20 15:06:42 +0000701static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000702newstdexception(name)
703 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000704{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000705 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000706 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
707 fatal("no mem for new standard exception");
708 return v;
709}
710
711static void
712initerrors()
713{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000714 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000715 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000716 IOError = newstdexception("IOError");
717 ImportError = newstdexception("ImportError");
718 IndexError = newstdexception("IndexError");
719 KeyError = newstdexception("KeyError");
720 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000721 MemoryError = newstdexception("MemoryError");
722 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000723 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000724 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000725 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000726 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000727 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000728 TypeError = newstdexception("TypeError");
729 ValueError = newstdexception("ValueError");
730 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000731}
732
733void
734initbuiltin()
735{
736 object *m;
737 m = initmodule("builtin", builtin_methods);
738 builtin_dict = getmoduledict(m);
739 INCREF(builtin_dict);
740 initerrors();
741 (void) dictinsert(builtin_dict, "None", None);
742}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000743
744/* Coerce two numeric types to the "larger" one.
745 Increment the reference count on each argument.
746 Return -1 and raise an exception if no coercion is possible
747 (and then no reference count is incremented).
748 XXX This should be distributed over the various numeric types,
749 XXX but for now I don't see how to implement that.
750 XXX So, for now, if you add a new numeric type,
751 XXX you must add to this function as well. */
752
753int
754coerce(pv, pw)
755 object **pv, **pw;
756{
757 register object *v = *pv;
758 register object *w = *pw;
759 if (v->ob_type == w->ob_type) {
760 INCREF(v);
761 INCREF(w);
762 return 0;
763 }
764 if (v->ob_type->tp_as_number == NULL ||
765 w->ob_type->tp_as_number == NULL) {
766 err_setstr(TypeError, "mixing number and non-number");
767 return -1;
768 }
769 if (is_floatobject(v) || is_floatobject(w)) {
770 v = builtin_float((object *)0, v);
771 w = builtin_float((object *)0, w);
772 }
773 else if (is_longobject(v) || is_longobject(w)) {
774 v = builtin_long((object *)0, v);
775 w = builtin_long((object *)0, w);
776 }
777 else {
778 err_setstr(TypeError, "can't coerce numeric types?!?!?");
779 return -1;
780 }
781 if (v == NULL || w == NULL) {
782 XDECREF(v);
783 XDECREF(w);
784 return -1;
785 }
786 *pv = v;
787 *pw = w;
788 return 0;
789}