blob: 324ecb071a99df6fa30600b3fbc0b769b8b283e6 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
2Copyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
3Netherlands.
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);
318 node *n;
319 int err;
Guido van Rossum22ebe2f1992-03-12 17:33:52 +0000320 int c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000321 object *m, *d;
322 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000323 if (v != NULL) {
324 if (printobject(v, out, PRINT_RAW) != 0)
325 return NULL;
326 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000327 m = add_module("__main__");
328 d = getmoduledict(m);
Guido van Rossum22ebe2f1992-03-12 17:33:52 +0000329 while ((c = getc(in)) != EOF && (c == ' ' || c == '\t'))
330 ;
331 ungetc(c, in);
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{
340 if (v == NULL) {
341 /* */
342 }
343 else if (is_intobject(v)) {
344 INCREF(v);
345 return v;
346 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000347 else if (is_longobject(v)) {
348 long x;
349 x = getlongvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000350 if (err_occurred())
Guido van Rossumd4905451991-05-05 20:00:36 +0000351 return NULL;
352 return newintobject(x);
353 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000354 else if (is_floatobject(v)) {
355 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000356 /* XXX should check for overflow */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000357 return newintobject((long)x);
358 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000359 err_setstr(TypeError, "int() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000360 return NULL;
361}
362
363static object *
364builtin_len(self, v)
365 object *self;
366 object *v;
367{
368 long len;
369 typeobject *tp;
370 if (v == NULL) {
371 err_setstr(TypeError, "len() without argument");
372 return NULL;
373 }
374 tp = v->ob_type;
375 if (tp->tp_as_sequence != NULL) {
376 len = (*tp->tp_as_sequence->sq_length)(v);
377 }
378 else if (tp->tp_as_mapping != NULL) {
379 len = (*tp->tp_as_mapping->mp_length)(v);
380 }
381 else {
382 err_setstr(TypeError, "len() of unsized object");
383 return NULL;
384 }
385 return newintobject(len);
386}
387
388static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000389builtin_long(self, v)
390 object *self;
391 object *v;
392{
393 if (v == NULL) {
394 /* */
395 }
396 else if (is_intobject(v)) {
397 return newlongobject(getintvalue(v));
398 }
399 else if (is_longobject(v)) {
400 INCREF(v);
401 return v;
402 }
403 else if (is_floatobject(v)) {
404 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000405 return dnewlongobject(x);
Guido van Rossumd4905451991-05-05 20:00:36 +0000406 }
407 err_setstr(TypeError, "long() argument must be int, long or float");
408 return NULL;
409}
410
411static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000412min_max(v, sign)
413 object *v;
414 int sign;
415{
416 int i, n, cmp;
417 object *w, *x;
418 sequence_methods *sq;
419 if (v == NULL) {
420 err_setstr(TypeError, "min() or max() without argument");
421 return NULL;
422 }
423 sq = v->ob_type->tp_as_sequence;
424 if (sq == NULL) {
425 err_setstr(TypeError, "min() or max() of non-sequence");
426 return NULL;
427 }
428 n = (*sq->sq_length)(v);
429 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000430 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000431 return NULL;
432 }
433 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
434 for (i = 1; i < n; i++) {
435 x = (*sq->sq_item)(v, i); /* Implies INCREF */
436 cmp = cmpobject(x, w);
437 if (cmp * sign > 0) {
438 DECREF(w);
439 w = x;
440 }
441 else
442 DECREF(x);
443 }
444 return w;
445}
446
447static object *
448builtin_min(self, v)
449 object *self;
450 object *v;
451{
452 return min_max(v, -1);
453}
454
455static object *
456builtin_max(self, v)
457 object *self;
458 object *v;
459{
460 return min_max(v, 1);
461}
462
463static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000464builtin_oct(self, v)
465 object *self;
466 object *v;
467{
468 if (v != NULL) {
469 if (is_intobject(v)) {
470 char buf[20];
471 long x = getintvalue(v);
472 if (x >= 0)
473 sprintf(buf, "0%lo", x);
474 else
475 sprintf(buf, "-0%lo", -x);
476 return newstringobject(buf);
477 }
478 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000479 return long_format(v, 8);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000480 }
481 }
482 err_setstr(TypeError, "oct() requires int/long argument");
483 return NULL;
484}
485
486static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000487builtin_open(self, v)
488 object *self;
489 object *v;
490{
491 object *name, *mode;
492 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 ||
493 !is_stringobject(name = gettupleitem(v, 0)) ||
494 !is_stringobject(mode = gettupleitem(v, 1))) {
495 err_setstr(TypeError, "open() requires 2 string arguments");
496 return NULL;
497 }
498 v = newfileobject(getstringvalue(name), getstringvalue(mode));
499 return v;
500}
501
502static object *
503builtin_ord(self, v)
504 object *self;
505 object *v;
506{
507 if (v == NULL || !is_stringobject(v)) {
508 err_setstr(TypeError, "ord() must have string argument");
509 return NULL;
510 }
511 if (getstringsize(v) != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000512 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000513 return NULL;
514 }
515 return newintobject((long)(getstringvalue(v)[0] & 0xff));
516}
517
518static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000519builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000520 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000521 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000522{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000523 object *v, *w, *x;
524 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000525 err_setstr(TypeError, "pow() requires 2 arguments");
526 return NULL;
527 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000528 v = gettupleitem(args, 0);
529 w = gettupleitem(args, 1);
530 if (v->ob_type->tp_as_number == NULL ||
531 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000532 err_setstr(TypeError, "pow() requires numeric arguments");
533 return NULL;
534 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000535 if (coerce(&v, &w) != 0)
536 return NULL;
537 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
538 DECREF(v);
539 DECREF(w);
540 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000541}
542
543static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000544builtin_range(self, v)
545 object *self;
546 object *v;
547{
548 static char *errmsg = "range() requires 1-3 int arguments";
549 int i, n;
550 long ilow, ihigh, istep;
551 if (v != NULL && is_intobject(v)) {
552 ilow = 0; ihigh = getintvalue(v); istep = 1;
553 }
554 else if (v == NULL || !is_tupleobject(v)) {
555 err_setstr(TypeError, errmsg);
556 return NULL;
557 }
558 else {
559 n = gettuplesize(v);
560 if (n < 1 || n > 3) {
561 err_setstr(TypeError, errmsg);
562 return NULL;
563 }
564 for (i = 0; i < n; i++) {
565 if (!is_intobject(gettupleitem(v, i))) {
566 err_setstr(TypeError, errmsg);
567 return NULL;
568 }
569 }
570 if (n == 3) {
571 istep = getintvalue(gettupleitem(v, 2));
572 --n;
573 }
574 else
575 istep = 1;
576 ihigh = getintvalue(gettupleitem(v, --n));
577 if (n > 0)
578 ilow = getintvalue(gettupleitem(v, 0));
579 else
580 ilow = 0;
581 }
582 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000583 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000584 return NULL;
585 }
586 /* XXX ought to check overflow of subtraction */
587 if (istep > 0)
588 n = (ihigh - ilow + istep - 1) / istep;
589 else
590 n = (ihigh - ilow + istep + 1) / istep;
591 if (n < 0)
592 n = 0;
593 v = newlistobject(n);
594 if (v == NULL)
595 return NULL;
596 for (i = 0; i < n; i++) {
597 object *w = newintobject(ilow);
598 if (w == NULL) {
599 DECREF(v);
600 return NULL;
601 }
602 setlistitem(v, i, w);
603 ilow += istep;
604 }
605 return v;
606}
607
608static object *
609builtin_raw_input(self, v)
610 object *self;
611 object *v;
612{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000613 FILE *out = sysgetfile("stdout", stdout);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000614 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000615 if (v != NULL) {
616 if (printobject(v, out, PRINT_RAW) != 0)
617 return NULL;
618 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000619 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000620}
621
622static object *
623builtin_reload(self, v)
624 object *self;
625 object *v;
626{
627 return reload_module(v);
628}
629
630static object *
631builtin_type(self, v)
632 object *self;
633 object *v;
634{
635 if (v == NULL) {
636 err_setstr(TypeError, "type() requres an argument");
637 return NULL;
638 }
639 v = (object *)v->ob_type;
640 INCREF(v);
641 return v;
642}
643
644static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000645 {"abs", builtin_abs},
646 {"apply", builtin_apply},
647 {"chr", builtin_chr},
648 {"dir", builtin_dir},
649 {"divmod", builtin_divmod},
650 {"eval", builtin_eval},
651 {"exec", builtin_exec},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000652 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000653 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000654 {"getattr", builtin_getattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000655 {"hex", builtin_hex},
656 {"input", builtin_input},
657 {"int", builtin_int},
658 {"len", builtin_len},
659 {"long", builtin_long},
660 {"max", builtin_max},
661 {"min", builtin_min},
662 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000663 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000664 {"ord", builtin_ord},
665 {"pow", builtin_pow},
666 {"range", builtin_range},
667 {"raw_input", builtin_raw_input},
668 {"reload", builtin_reload},
Guido van Rossum33894be1992-01-27 16:53:09 +0000669 {"setattr", builtin_setattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000670 {"type", builtin_type},
671 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000672};
673
674static object *builtin_dict;
675
676object *
677getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000678 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000679{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000680 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000681}
682
683/* Predefined exceptions */
684
Guido van Rossumfb905c31991-12-16 15:42:38 +0000685object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000686object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000687object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000688object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000689object *IndexError;
690object *KeyError;
691object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000692object *MemoryError;
693object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000694object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000695object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000696object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000697object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000698object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000699object *TypeError;
700object *ValueError;
701object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000702
Guido van Rossum3f5da241990-12-20 15:06:42 +0000703static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000704newstdexception(name)
705 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000706{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000707 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000708 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
709 fatal("no mem for new standard exception");
710 return v;
711}
712
713static void
714initerrors()
715{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000716 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000717 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000718 IOError = newstdexception("IOError");
719 ImportError = newstdexception("ImportError");
720 IndexError = newstdexception("IndexError");
721 KeyError = newstdexception("KeyError");
722 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000723 MemoryError = newstdexception("MemoryError");
724 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000725 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000726 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000727 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000728 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000729 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000730 TypeError = newstdexception("TypeError");
731 ValueError = newstdexception("ValueError");
732 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000733}
734
735void
736initbuiltin()
737{
738 object *m;
739 m = initmodule("builtin", builtin_methods);
740 builtin_dict = getmoduledict(m);
741 INCREF(builtin_dict);
742 initerrors();
743 (void) dictinsert(builtin_dict, "None", None);
744}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000745
746/* Coerce two numeric types to the "larger" one.
747 Increment the reference count on each argument.
748 Return -1 and raise an exception if no coercion is possible
749 (and then no reference count is incremented).
750 XXX This should be distributed over the various numeric types,
751 XXX but for now I don't see how to implement that.
752 XXX So, for now, if you add a new numeric type,
753 XXX you must add to this function as well. */
754
755int
756coerce(pv, pw)
757 object **pv, **pw;
758{
759 register object *v = *pv;
760 register object *w = *pw;
761 if (v->ob_type == w->ob_type) {
762 INCREF(v);
763 INCREF(w);
764 return 0;
765 }
766 if (v->ob_type->tp_as_number == NULL ||
767 w->ob_type->tp_as_number == NULL) {
768 err_setstr(TypeError, "mixing number and non-number");
769 return -1;
770 }
771 if (is_floatobject(v) || is_floatobject(w)) {
772 v = builtin_float((object *)0, v);
773 w = builtin_float((object *)0, w);
774 }
775 else if (is_longobject(v) || is_longobject(w)) {
776 v = builtin_long((object *)0, v);
777 w = builtin_long((object *)0, w);
778 }
779 else {
780 err_setstr(TypeError, "can't coerce numeric types?!?!?");
781 return -1;
782 }
783 if (v == NULL || w == NULL) {
784 XDECREF(v);
785 XDECREF(w);
786 return -1;
787 }
788 *pv = v;
789 *pw = w;
790 return 0;
791}