blob: bf4d3fd9ed6c549d0ba0843498561755c0b8e3e4 [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;
151 int n;
152 if (v != NULL) {
153 if (is_stringobject(v))
154 str = v;
155 else if (is_tupleobject(v) &&
156 ((n = gettuplesize(v)) == 2 || n == 3)) {
157 str = gettupleitem(v, 0);
158 globals = gettupleitem(v, 1);
159 if (n == 3)
160 locals = gettupleitem(v, 2);
161 }
162 }
163 if (str == NULL || !is_stringobject(str) ||
164 globals != NULL && !is_dictobject(globals) ||
165 locals != NULL && !is_dictobject(locals)) {
166 err_setstr(TypeError,
167 "exec/eval arguments must be string[,dict[,dict]]");
168 return NULL;
169 }
170 return run_string(getstringvalue(str), start, globals, locals);
171}
172
173static object *
174builtin_eval(self, v)
175 object *self;
176 object *v;
177{
178 return exec_eval(v, eval_input);
179}
180
181static object *
182builtin_exec(self, v)
183 object *self;
184 object *v;
185{
186 return exec_eval(v, file_input);
187}
188
189static object *
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000190builtin_execfile(self, v)
191 object *self;
192 object *v;
193{
194 object *str = NULL, *globals = NULL, *locals = NULL, *w;
195 FILE* fp;
196 int n;
197 if (v != NULL) {
198 if (is_stringobject(v))
199 str = v;
200 else if (is_tupleobject(v) &&
201 ((n = gettuplesize(v)) == 2 || n == 3)) {
202 str = gettupleitem(v, 0);
203 globals = gettupleitem(v, 1);
204 if (n == 3)
205 locals = gettupleitem(v, 2);
206 }
207 }
208 if (str == NULL || !is_stringobject(str) ||
209 globals != NULL && !is_dictobject(globals) ||
210 locals != NULL && !is_dictobject(locals)) {
211 err_setstr(TypeError,
212 "execfile arguments must be filename[,dict[,dict]]");
213 return NULL;
214 }
215 fp = fopen(getstringvalue(str), "r");
216 if (fp == NULL) {
217 err_setstr(IOError, "execfile cannot open the file argument");
218 return NULL;
219 }
220 w = run_file(fp, getstringvalue(str), file_input, globals, locals);
221 fclose(fp);
222 return w;
223}
224
225static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000226builtin_float(self, v)
227 object *self;
228 object *v;
229{
230 if (v == NULL) {
231 /* */
232 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000233 else if (is_intobject(v)) {
234 long x = getintvalue(v);
235 return newfloatobject((double)x);
236 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000237 else if (is_longobject(v)) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000238 return newfloatobject(dgetlongvalue(v));
239 }
240 else if (is_floatobject(v)) {
241 INCREF(v);
242 return v;
243 }
244 err_setstr(TypeError, "float() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000245 return NULL;
246}
247
248static object *
Guido van Rossum33894be1992-01-27 16:53:09 +0000249builtin_getattr(self, v)
250 object *self;
251 object *v;
252{
253 object *name;
254 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 ||
255 (name = gettupleitem(v, 1), !is_stringobject(name))) {
256 err_setstr(TypeError,
257 "getattr() arguments must be (object, string)");
258 return NULL;
259 }
260 return getattr(gettupleitem(v, 0), getstringvalue(name));
261}
262
263static object *
264builtin_setattr(self, v)
265 object *self;
266 object *v;
267{
268 object *name;
269 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3 ||
270 (name = gettupleitem(v, 1), !is_stringobject(name))) {
271 err_setstr(TypeError,
272 "setattr() arguments must be (object, string, object)");
273 return NULL;
274 }
275 if (setattr(gettupleitem(v, 0),
276 getstringvalue(name), gettupleitem(v, 2)) != 0)
277 return NULL;
278 INCREF(None);
279 return None;
280}
281
282static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000283builtin_hex(self, v)
284 object *self;
285 object *v;
286{
287 if (v != NULL) {
288 if (is_intobject(v)) {
289 char buf[20];
290 long x = getintvalue(v);
291 if (x >= 0)
292 sprintf(buf, "0x%lx", x);
293 else
294 sprintf(buf, "-0x%lx", -x);
295 return newstringobject(buf);
296 }
297 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000298 return long_format(v, 16);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000299 }
300 }
301 err_setstr(TypeError, "hex() requires int/long argument");
302 return NULL;
303}
304
305static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000306builtin_input(self, v)
307 object *self;
308 object *v;
309{
310 FILE *in = sysgetfile("stdin", stdin);
311 FILE *out = sysgetfile("stdout", stdout);
312 node *n;
313 int err;
314 object *m, *d;
315 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000316 if (v != NULL) {
317 if (printobject(v, out, PRINT_RAW) != 0)
318 return NULL;
319 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000320 m = add_module("__main__");
321 d = getmoduledict(m);
322 return run_file(in, "<stdin>", expr_input, d, d);
323}
324
325static object *
326builtin_int(self, v)
327 object *self;
328 object *v;
329{
330 if (v == NULL) {
331 /* */
332 }
333 else if (is_intobject(v)) {
334 INCREF(v);
335 return v;
336 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000337 else if (is_longobject(v)) {
338 long x;
339 x = getlongvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000340 if (err_occurred())
Guido van Rossumd4905451991-05-05 20:00:36 +0000341 return NULL;
342 return newintobject(x);
343 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000344 else if (is_floatobject(v)) {
345 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000346 /* XXX should check for overflow */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000347 return newintobject((long)x);
348 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000349 err_setstr(TypeError, "int() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000350 return NULL;
351}
352
353static object *
354builtin_len(self, v)
355 object *self;
356 object *v;
357{
358 long len;
359 typeobject *tp;
360 if (v == NULL) {
361 err_setstr(TypeError, "len() without argument");
362 return NULL;
363 }
364 tp = v->ob_type;
365 if (tp->tp_as_sequence != NULL) {
366 len = (*tp->tp_as_sequence->sq_length)(v);
367 }
368 else if (tp->tp_as_mapping != NULL) {
369 len = (*tp->tp_as_mapping->mp_length)(v);
370 }
371 else {
372 err_setstr(TypeError, "len() of unsized object");
373 return NULL;
374 }
375 return newintobject(len);
376}
377
378static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000379builtin_long(self, v)
380 object *self;
381 object *v;
382{
383 if (v == NULL) {
384 /* */
385 }
386 else if (is_intobject(v)) {
387 return newlongobject(getintvalue(v));
388 }
389 else if (is_longobject(v)) {
390 INCREF(v);
391 return v;
392 }
393 else if (is_floatobject(v)) {
394 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000395 return dnewlongobject(x);
Guido van Rossumd4905451991-05-05 20:00:36 +0000396 }
397 err_setstr(TypeError, "long() argument must be int, long or float");
398 return NULL;
399}
400
401static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000402min_max(v, sign)
403 object *v;
404 int sign;
405{
406 int i, n, cmp;
407 object *w, *x;
408 sequence_methods *sq;
409 if (v == NULL) {
410 err_setstr(TypeError, "min() or max() without argument");
411 return NULL;
412 }
413 sq = v->ob_type->tp_as_sequence;
414 if (sq == NULL) {
415 err_setstr(TypeError, "min() or max() of non-sequence");
416 return NULL;
417 }
418 n = (*sq->sq_length)(v);
419 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000420 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000421 return NULL;
422 }
423 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
424 for (i = 1; i < n; i++) {
425 x = (*sq->sq_item)(v, i); /* Implies INCREF */
426 cmp = cmpobject(x, w);
427 if (cmp * sign > 0) {
428 DECREF(w);
429 w = x;
430 }
431 else
432 DECREF(x);
433 }
434 return w;
435}
436
437static object *
438builtin_min(self, v)
439 object *self;
440 object *v;
441{
442 return min_max(v, -1);
443}
444
445static object *
446builtin_max(self, v)
447 object *self;
448 object *v;
449{
450 return min_max(v, 1);
451}
452
453static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000454builtin_oct(self, v)
455 object *self;
456 object *v;
457{
458 if (v != NULL) {
459 if (is_intobject(v)) {
460 char buf[20];
461 long x = getintvalue(v);
462 if (x >= 0)
463 sprintf(buf, "0%lo", x);
464 else
465 sprintf(buf, "-0%lo", -x);
466 return newstringobject(buf);
467 }
468 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000469 return long_format(v, 8);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000470 }
471 }
472 err_setstr(TypeError, "oct() requires int/long argument");
473 return NULL;
474}
475
476static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000477builtin_open(self, v)
478 object *self;
479 object *v;
480{
481 object *name, *mode;
482 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 ||
483 !is_stringobject(name = gettupleitem(v, 0)) ||
484 !is_stringobject(mode = gettupleitem(v, 1))) {
485 err_setstr(TypeError, "open() requires 2 string arguments");
486 return NULL;
487 }
488 v = newfileobject(getstringvalue(name), getstringvalue(mode));
489 return v;
490}
491
492static object *
493builtin_ord(self, v)
494 object *self;
495 object *v;
496{
497 if (v == NULL || !is_stringobject(v)) {
498 err_setstr(TypeError, "ord() must have string argument");
499 return NULL;
500 }
501 if (getstringsize(v) != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000502 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000503 return NULL;
504 }
505 return newintobject((long)(getstringvalue(v)[0] & 0xff));
506}
507
508static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000509builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000510 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000511 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000512{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000513 object *v, *w, *x;
514 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000515 err_setstr(TypeError, "pow() requires 2 arguments");
516 return NULL;
517 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000518 v = gettupleitem(args, 0);
519 w = gettupleitem(args, 1);
520 if (v->ob_type->tp_as_number == NULL ||
521 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000522 err_setstr(TypeError, "pow() requires numeric arguments");
523 return NULL;
524 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000525 if (coerce(&v, &w) != 0)
526 return NULL;
527 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
528 DECREF(v);
529 DECREF(w);
530 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000531}
532
533static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000534builtin_range(self, v)
535 object *self;
536 object *v;
537{
538 static char *errmsg = "range() requires 1-3 int arguments";
539 int i, n;
540 long ilow, ihigh, istep;
541 if (v != NULL && is_intobject(v)) {
542 ilow = 0; ihigh = getintvalue(v); istep = 1;
543 }
544 else if (v == NULL || !is_tupleobject(v)) {
545 err_setstr(TypeError, errmsg);
546 return NULL;
547 }
548 else {
549 n = gettuplesize(v);
550 if (n < 1 || n > 3) {
551 err_setstr(TypeError, errmsg);
552 return NULL;
553 }
554 for (i = 0; i < n; i++) {
555 if (!is_intobject(gettupleitem(v, i))) {
556 err_setstr(TypeError, errmsg);
557 return NULL;
558 }
559 }
560 if (n == 3) {
561 istep = getintvalue(gettupleitem(v, 2));
562 --n;
563 }
564 else
565 istep = 1;
566 ihigh = getintvalue(gettupleitem(v, --n));
567 if (n > 0)
568 ilow = getintvalue(gettupleitem(v, 0));
569 else
570 ilow = 0;
571 }
572 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000573 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000574 return NULL;
575 }
576 /* XXX ought to check overflow of subtraction */
577 if (istep > 0)
578 n = (ihigh - ilow + istep - 1) / istep;
579 else
580 n = (ihigh - ilow + istep + 1) / istep;
581 if (n < 0)
582 n = 0;
583 v = newlistobject(n);
584 if (v == NULL)
585 return NULL;
586 for (i = 0; i < n; i++) {
587 object *w = newintobject(ilow);
588 if (w == NULL) {
589 DECREF(v);
590 return NULL;
591 }
592 setlistitem(v, i, w);
593 ilow += istep;
594 }
595 return v;
596}
597
598static object *
599builtin_raw_input(self, v)
600 object *self;
601 object *v;
602{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000603 FILE *out = sysgetfile("stdout", stdout);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000604 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000605 if (v != NULL) {
606 if (printobject(v, out, PRINT_RAW) != 0)
607 return NULL;
608 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000609 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000610}
611
612static object *
613builtin_reload(self, v)
614 object *self;
615 object *v;
616{
617 return reload_module(v);
618}
619
620static object *
621builtin_type(self, v)
622 object *self;
623 object *v;
624{
625 if (v == NULL) {
626 err_setstr(TypeError, "type() requres an argument");
627 return NULL;
628 }
629 v = (object *)v->ob_type;
630 INCREF(v);
631 return v;
632}
633
634static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000635 {"abs", builtin_abs},
636 {"apply", builtin_apply},
637 {"chr", builtin_chr},
638 {"dir", builtin_dir},
639 {"divmod", builtin_divmod},
640 {"eval", builtin_eval},
641 {"exec", builtin_exec},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000642 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000643 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000644 {"getattr", builtin_getattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000645 {"hex", builtin_hex},
646 {"input", builtin_input},
647 {"int", builtin_int},
648 {"len", builtin_len},
649 {"long", builtin_long},
650 {"max", builtin_max},
651 {"min", builtin_min},
652 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000653 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000654 {"ord", builtin_ord},
655 {"pow", builtin_pow},
656 {"range", builtin_range},
657 {"raw_input", builtin_raw_input},
658 {"reload", builtin_reload},
Guido van Rossum33894be1992-01-27 16:53:09 +0000659 {"setattr", builtin_setattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000660 {"type", builtin_type},
661 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000662};
663
664static object *builtin_dict;
665
666object *
667getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000668 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000669{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000670 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000671}
672
673/* Predefined exceptions */
674
Guido van Rossumfb905c31991-12-16 15:42:38 +0000675object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000676object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000677object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000678object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000679object *IndexError;
680object *KeyError;
681object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000682object *MemoryError;
683object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000684object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000685object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000686object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000687object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000688object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000689object *TypeError;
690object *ValueError;
691object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000692
Guido van Rossum3f5da241990-12-20 15:06:42 +0000693static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000694newstdexception(name)
695 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000696{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000697 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000698 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
699 fatal("no mem for new standard exception");
700 return v;
701}
702
703static void
704initerrors()
705{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000706 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000707 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000708 IOError = newstdexception("IOError");
709 ImportError = newstdexception("ImportError");
710 IndexError = newstdexception("IndexError");
711 KeyError = newstdexception("KeyError");
712 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000713 MemoryError = newstdexception("MemoryError");
714 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000715 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000716 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000717 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000718 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000719 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000720 TypeError = newstdexception("TypeError");
721 ValueError = newstdexception("ValueError");
722 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000723}
724
725void
726initbuiltin()
727{
728 object *m;
729 m = initmodule("builtin", builtin_methods);
730 builtin_dict = getmoduledict(m);
731 INCREF(builtin_dict);
732 initerrors();
733 (void) dictinsert(builtin_dict, "None", None);
734}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000735
736/* Coerce two numeric types to the "larger" one.
737 Increment the reference count on each argument.
738 Return -1 and raise an exception if no coercion is possible
739 (and then no reference count is incremented).
740 XXX This should be distributed over the various numeric types,
741 XXX but for now I don't see how to implement that.
742 XXX So, for now, if you add a new numeric type,
743 XXX you must add to this function as well. */
744
745int
746coerce(pv, pw)
747 object **pv, **pw;
748{
749 register object *v = *pv;
750 register object *w = *pw;
751 if (v->ob_type == w->ob_type) {
752 INCREF(v);
753 INCREF(w);
754 return 0;
755 }
756 if (v->ob_type->tp_as_number == NULL ||
757 w->ob_type->tp_as_number == NULL) {
758 err_setstr(TypeError, "mixing number and non-number");
759 return -1;
760 }
761 if (is_floatobject(v) || is_floatobject(w)) {
762 v = builtin_float((object *)0, v);
763 w = builtin_float((object *)0, w);
764 }
765 else if (is_longobject(v) || is_longobject(w)) {
766 v = builtin_long((object *)0, v);
767 w = builtin_long((object *)0, w);
768 }
769 else {
770 err_setstr(TypeError, "can't coerce numeric types?!?!?");
771 return -1;
772 }
773 if (v == NULL || w == NULL) {
774 XDECREF(v);
775 XDECREF(w);
776 return -1;
777 }
778 *pv = v;
779 *pw = w;
780 return 0;
781}