blob: 8c8d60c642d84cb0c29b4c50028308a66bafbc40 [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;
320 object *m, *d;
321 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000322 if (v != NULL) {
323 if (printobject(v, out, PRINT_RAW) != 0)
324 return NULL;
325 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000326 m = add_module("__main__");
327 d = getmoduledict(m);
328 return run_file(in, "<stdin>", expr_input, d, d);
329}
330
331static object *
332builtin_int(self, v)
333 object *self;
334 object *v;
335{
336 if (v == NULL) {
337 /* */
338 }
339 else if (is_intobject(v)) {
340 INCREF(v);
341 return v;
342 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000343 else if (is_longobject(v)) {
344 long x;
345 x = getlongvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000346 if (err_occurred())
Guido van Rossumd4905451991-05-05 20:00:36 +0000347 return NULL;
348 return newintobject(x);
349 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000350 else if (is_floatobject(v)) {
351 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000352 /* XXX should check for overflow */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000353 return newintobject((long)x);
354 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000355 err_setstr(TypeError, "int() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000356 return NULL;
357}
358
359static object *
360builtin_len(self, v)
361 object *self;
362 object *v;
363{
364 long len;
365 typeobject *tp;
366 if (v == NULL) {
367 err_setstr(TypeError, "len() without argument");
368 return NULL;
369 }
370 tp = v->ob_type;
371 if (tp->tp_as_sequence != NULL) {
372 len = (*tp->tp_as_sequence->sq_length)(v);
373 }
374 else if (tp->tp_as_mapping != NULL) {
375 len = (*tp->tp_as_mapping->mp_length)(v);
376 }
377 else {
378 err_setstr(TypeError, "len() of unsized object");
379 return NULL;
380 }
381 return newintobject(len);
382}
383
384static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000385builtin_long(self, v)
386 object *self;
387 object *v;
388{
389 if (v == NULL) {
390 /* */
391 }
392 else if (is_intobject(v)) {
393 return newlongobject(getintvalue(v));
394 }
395 else if (is_longobject(v)) {
396 INCREF(v);
397 return v;
398 }
399 else if (is_floatobject(v)) {
400 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000401 return dnewlongobject(x);
Guido van Rossumd4905451991-05-05 20:00:36 +0000402 }
403 err_setstr(TypeError, "long() argument must be int, long or float");
404 return NULL;
405}
406
407static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000408min_max(v, sign)
409 object *v;
410 int sign;
411{
412 int i, n, cmp;
413 object *w, *x;
414 sequence_methods *sq;
415 if (v == NULL) {
416 err_setstr(TypeError, "min() or max() without argument");
417 return NULL;
418 }
419 sq = v->ob_type->tp_as_sequence;
420 if (sq == NULL) {
421 err_setstr(TypeError, "min() or max() of non-sequence");
422 return NULL;
423 }
424 n = (*sq->sq_length)(v);
425 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000426 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000427 return NULL;
428 }
429 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
430 for (i = 1; i < n; i++) {
431 x = (*sq->sq_item)(v, i); /* Implies INCREF */
432 cmp = cmpobject(x, w);
433 if (cmp * sign > 0) {
434 DECREF(w);
435 w = x;
436 }
437 else
438 DECREF(x);
439 }
440 return w;
441}
442
443static object *
444builtin_min(self, v)
445 object *self;
446 object *v;
447{
448 return min_max(v, -1);
449}
450
451static object *
452builtin_max(self, v)
453 object *self;
454 object *v;
455{
456 return min_max(v, 1);
457}
458
459static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000460builtin_oct(self, v)
461 object *self;
462 object *v;
463{
464 if (v != NULL) {
465 if (is_intobject(v)) {
466 char buf[20];
467 long x = getintvalue(v);
468 if (x >= 0)
469 sprintf(buf, "0%lo", x);
470 else
471 sprintf(buf, "-0%lo", -x);
472 return newstringobject(buf);
473 }
474 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000475 return long_format(v, 8);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000476 }
477 }
478 err_setstr(TypeError, "oct() requires int/long argument");
479 return NULL;
480}
481
482static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000483builtin_open(self, v)
484 object *self;
485 object *v;
486{
487 object *name, *mode;
488 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 ||
489 !is_stringobject(name = gettupleitem(v, 0)) ||
490 !is_stringobject(mode = gettupleitem(v, 1))) {
491 err_setstr(TypeError, "open() requires 2 string arguments");
492 return NULL;
493 }
494 v = newfileobject(getstringvalue(name), getstringvalue(mode));
495 return v;
496}
497
498static object *
499builtin_ord(self, v)
500 object *self;
501 object *v;
502{
503 if (v == NULL || !is_stringobject(v)) {
504 err_setstr(TypeError, "ord() must have string argument");
505 return NULL;
506 }
507 if (getstringsize(v) != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000508 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000509 return NULL;
510 }
511 return newintobject((long)(getstringvalue(v)[0] & 0xff));
512}
513
514static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000515builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000516 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000517 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000518{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000519 object *v, *w, *x;
520 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000521 err_setstr(TypeError, "pow() requires 2 arguments");
522 return NULL;
523 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000524 v = gettupleitem(args, 0);
525 w = gettupleitem(args, 1);
526 if (v->ob_type->tp_as_number == NULL ||
527 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000528 err_setstr(TypeError, "pow() requires numeric arguments");
529 return NULL;
530 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000531 if (coerce(&v, &w) != 0)
532 return NULL;
533 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
534 DECREF(v);
535 DECREF(w);
536 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000537}
538
539static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000540builtin_range(self, v)
541 object *self;
542 object *v;
543{
544 static char *errmsg = "range() requires 1-3 int arguments";
545 int i, n;
546 long ilow, ihigh, istep;
547 if (v != NULL && is_intobject(v)) {
548 ilow = 0; ihigh = getintvalue(v); istep = 1;
549 }
550 else if (v == NULL || !is_tupleobject(v)) {
551 err_setstr(TypeError, errmsg);
552 return NULL;
553 }
554 else {
555 n = gettuplesize(v);
556 if (n < 1 || n > 3) {
557 err_setstr(TypeError, errmsg);
558 return NULL;
559 }
560 for (i = 0; i < n; i++) {
561 if (!is_intobject(gettupleitem(v, i))) {
562 err_setstr(TypeError, errmsg);
563 return NULL;
564 }
565 }
566 if (n == 3) {
567 istep = getintvalue(gettupleitem(v, 2));
568 --n;
569 }
570 else
571 istep = 1;
572 ihigh = getintvalue(gettupleitem(v, --n));
573 if (n > 0)
574 ilow = getintvalue(gettupleitem(v, 0));
575 else
576 ilow = 0;
577 }
578 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000579 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000580 return NULL;
581 }
582 /* XXX ought to check overflow of subtraction */
583 if (istep > 0)
584 n = (ihigh - ilow + istep - 1) / istep;
585 else
586 n = (ihigh - ilow + istep + 1) / istep;
587 if (n < 0)
588 n = 0;
589 v = newlistobject(n);
590 if (v == NULL)
591 return NULL;
592 for (i = 0; i < n; i++) {
593 object *w = newintobject(ilow);
594 if (w == NULL) {
595 DECREF(v);
596 return NULL;
597 }
598 setlistitem(v, i, w);
599 ilow += istep;
600 }
601 return v;
602}
603
604static object *
605builtin_raw_input(self, v)
606 object *self;
607 object *v;
608{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000609 FILE *out = sysgetfile("stdout", stdout);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000610 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000611 if (v != NULL) {
612 if (printobject(v, out, PRINT_RAW) != 0)
613 return NULL;
614 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000615 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000616}
617
618static object *
619builtin_reload(self, v)
620 object *self;
621 object *v;
622{
623 return reload_module(v);
624}
625
626static object *
627builtin_type(self, v)
628 object *self;
629 object *v;
630{
631 if (v == NULL) {
632 err_setstr(TypeError, "type() requres an argument");
633 return NULL;
634 }
635 v = (object *)v->ob_type;
636 INCREF(v);
637 return v;
638}
639
640static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000641 {"abs", builtin_abs},
642 {"apply", builtin_apply},
643 {"chr", builtin_chr},
644 {"dir", builtin_dir},
645 {"divmod", builtin_divmod},
646 {"eval", builtin_eval},
647 {"exec", builtin_exec},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000648 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000649 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000650 {"getattr", builtin_getattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000651 {"hex", builtin_hex},
652 {"input", builtin_input},
653 {"int", builtin_int},
654 {"len", builtin_len},
655 {"long", builtin_long},
656 {"max", builtin_max},
657 {"min", builtin_min},
658 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000659 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000660 {"ord", builtin_ord},
661 {"pow", builtin_pow},
662 {"range", builtin_range},
663 {"raw_input", builtin_raw_input},
664 {"reload", builtin_reload},
Guido van Rossum33894be1992-01-27 16:53:09 +0000665 {"setattr", builtin_setattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000666 {"type", builtin_type},
667 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000668};
669
670static object *builtin_dict;
671
672object *
673getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000674 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000675{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000676 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000677}
678
679/* Predefined exceptions */
680
Guido van Rossumfb905c31991-12-16 15:42:38 +0000681object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000682object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000683object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000684object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000685object *IndexError;
686object *KeyError;
687object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000688object *MemoryError;
689object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000690object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000691object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000692object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000693object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000694object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000695object *TypeError;
696object *ValueError;
697object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000698
Guido van Rossum3f5da241990-12-20 15:06:42 +0000699static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000700newstdexception(name)
701 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000702{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000703 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000704 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
705 fatal("no mem for new standard exception");
706 return v;
707}
708
709static void
710initerrors()
711{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000712 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000713 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000714 IOError = newstdexception("IOError");
715 ImportError = newstdexception("ImportError");
716 IndexError = newstdexception("IndexError");
717 KeyError = newstdexception("KeyError");
718 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000719 MemoryError = newstdexception("MemoryError");
720 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000721 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000722 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000723 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000724 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000725 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000726 TypeError = newstdexception("TypeError");
727 ValueError = newstdexception("ValueError");
728 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000729}
730
731void
732initbuiltin()
733{
734 object *m;
735 m = initmodule("builtin", builtin_methods);
736 builtin_dict = getmoduledict(m);
737 INCREF(builtin_dict);
738 initerrors();
739 (void) dictinsert(builtin_dict, "None", None);
740}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000741
742/* Coerce two numeric types to the "larger" one.
743 Increment the reference count on each argument.
744 Return -1 and raise an exception if no coercion is possible
745 (and then no reference count is incremented).
746 XXX This should be distributed over the various numeric types,
747 XXX but for now I don't see how to implement that.
748 XXX So, for now, if you add a new numeric type,
749 XXX you must add to this function as well. */
750
751int
752coerce(pv, pw)
753 object **pv, **pw;
754{
755 register object *v = *pv;
756 register object *w = *pw;
757 if (v->ob_type == w->ob_type) {
758 INCREF(v);
759 INCREF(w);
760 return 0;
761 }
762 if (v->ob_type->tp_as_number == NULL ||
763 w->ob_type->tp_as_number == NULL) {
764 err_setstr(TypeError, "mixing number and non-number");
765 return -1;
766 }
767 if (is_floatobject(v) || is_floatobject(w)) {
768 v = builtin_float((object *)0, v);
769 w = builtin_float((object *)0, w);
770 }
771 else if (is_longobject(v) || is_longobject(w)) {
772 v = builtin_long((object *)0, v);
773 w = builtin_long((object *)0, w);
774 }
775 else {
776 err_setstr(TypeError, "can't coerce numeric types?!?!?");
777 return -1;
778 }
779 if (v == NULL || w == NULL) {
780 XDECREF(v);
781 XDECREF(w);
782 return -1;
783 }
784 *pv = v;
785 *pw = w;
786 return 0;
787}