blob: c2a7cb21daba823af9821ebd12dd0ea5170bf1dd [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 *
190builtin_float(self, v)
191 object *self;
192 object *v;
193{
194 if (v == NULL) {
195 /* */
196 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000197 else if (is_intobject(v)) {
198 long x = getintvalue(v);
199 return newfloatobject((double)x);
200 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000201 else if (is_longobject(v)) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000202 return newfloatobject(dgetlongvalue(v));
203 }
204 else if (is_floatobject(v)) {
205 INCREF(v);
206 return v;
207 }
208 err_setstr(TypeError, "float() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000209 return NULL;
210}
211
212static object *
Guido van Rossum33894be1992-01-27 16:53:09 +0000213builtin_getattr(self, v)
214 object *self;
215 object *v;
216{
217 object *name;
218 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 ||
219 (name = gettupleitem(v, 1), !is_stringobject(name))) {
220 err_setstr(TypeError,
221 "getattr() arguments must be (object, string)");
222 return NULL;
223 }
224 return getattr(gettupleitem(v, 0), getstringvalue(name));
225}
226
227static object *
228builtin_setattr(self, v)
229 object *self;
230 object *v;
231{
232 object *name;
233 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3 ||
234 (name = gettupleitem(v, 1), !is_stringobject(name))) {
235 err_setstr(TypeError,
236 "setattr() arguments must be (object, string, object)");
237 return NULL;
238 }
239 if (setattr(gettupleitem(v, 0),
240 getstringvalue(name), gettupleitem(v, 2)) != 0)
241 return NULL;
242 INCREF(None);
243 return None;
244}
245
246static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000247builtin_hex(self, v)
248 object *self;
249 object *v;
250{
251 if (v != NULL) {
252 if (is_intobject(v)) {
253 char buf[20];
254 long x = getintvalue(v);
255 if (x >= 0)
256 sprintf(buf, "0x%lx", x);
257 else
258 sprintf(buf, "-0x%lx", -x);
259 return newstringobject(buf);
260 }
261 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000262 return long_format(v, 16);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000263 }
264 }
265 err_setstr(TypeError, "hex() requires int/long argument");
266 return NULL;
267}
268
269static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000270builtin_input(self, v)
271 object *self;
272 object *v;
273{
274 FILE *in = sysgetfile("stdin", stdin);
275 FILE *out = sysgetfile("stdout", stdout);
276 node *n;
277 int err;
278 object *m, *d;
279 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000280 if (v != NULL) {
281 if (printobject(v, out, PRINT_RAW) != 0)
282 return NULL;
283 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000284 m = add_module("__main__");
285 d = getmoduledict(m);
286 return run_file(in, "<stdin>", expr_input, d, d);
287}
288
289static object *
290builtin_int(self, v)
291 object *self;
292 object *v;
293{
294 if (v == NULL) {
295 /* */
296 }
297 else if (is_intobject(v)) {
298 INCREF(v);
299 return v;
300 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000301 else if (is_longobject(v)) {
302 long x;
303 x = getlongvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000304 if (err_occurred())
Guido van Rossumd4905451991-05-05 20:00:36 +0000305 return NULL;
306 return newintobject(x);
307 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000308 else if (is_floatobject(v)) {
309 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000310 /* XXX should check for overflow */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000311 return newintobject((long)x);
312 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000313 err_setstr(TypeError, "int() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000314 return NULL;
315}
316
317static object *
318builtin_len(self, v)
319 object *self;
320 object *v;
321{
322 long len;
323 typeobject *tp;
324 if (v == NULL) {
325 err_setstr(TypeError, "len() without argument");
326 return NULL;
327 }
328 tp = v->ob_type;
329 if (tp->tp_as_sequence != NULL) {
330 len = (*tp->tp_as_sequence->sq_length)(v);
331 }
332 else if (tp->tp_as_mapping != NULL) {
333 len = (*tp->tp_as_mapping->mp_length)(v);
334 }
335 else {
336 err_setstr(TypeError, "len() of unsized object");
337 return NULL;
338 }
339 return newintobject(len);
340}
341
342static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000343builtin_long(self, v)
344 object *self;
345 object *v;
346{
347 if (v == NULL) {
348 /* */
349 }
350 else if (is_intobject(v)) {
351 return newlongobject(getintvalue(v));
352 }
353 else if (is_longobject(v)) {
354 INCREF(v);
355 return v;
356 }
357 else if (is_floatobject(v)) {
358 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000359 return dnewlongobject(x);
Guido van Rossumd4905451991-05-05 20:00:36 +0000360 }
361 err_setstr(TypeError, "long() argument must be int, long or float");
362 return NULL;
363}
364
365static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000366min_max(v, sign)
367 object *v;
368 int sign;
369{
370 int i, n, cmp;
371 object *w, *x;
372 sequence_methods *sq;
373 if (v == NULL) {
374 err_setstr(TypeError, "min() or max() without argument");
375 return NULL;
376 }
377 sq = v->ob_type->tp_as_sequence;
378 if (sq == NULL) {
379 err_setstr(TypeError, "min() or max() of non-sequence");
380 return NULL;
381 }
382 n = (*sq->sq_length)(v);
383 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000384 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000385 return NULL;
386 }
387 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
388 for (i = 1; i < n; i++) {
389 x = (*sq->sq_item)(v, i); /* Implies INCREF */
390 cmp = cmpobject(x, w);
391 if (cmp * sign > 0) {
392 DECREF(w);
393 w = x;
394 }
395 else
396 DECREF(x);
397 }
398 return w;
399}
400
401static object *
402builtin_min(self, v)
403 object *self;
404 object *v;
405{
406 return min_max(v, -1);
407}
408
409static object *
410builtin_max(self, v)
411 object *self;
412 object *v;
413{
414 return min_max(v, 1);
415}
416
417static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000418builtin_oct(self, v)
419 object *self;
420 object *v;
421{
422 if (v != NULL) {
423 if (is_intobject(v)) {
424 char buf[20];
425 long x = getintvalue(v);
426 if (x >= 0)
427 sprintf(buf, "0%lo", x);
428 else
429 sprintf(buf, "-0%lo", -x);
430 return newstringobject(buf);
431 }
432 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000433 return long_format(v, 8);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000434 }
435 }
436 err_setstr(TypeError, "oct() requires int/long argument");
437 return NULL;
438}
439
440static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000441builtin_open(self, v)
442 object *self;
443 object *v;
444{
445 object *name, *mode;
446 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 ||
447 !is_stringobject(name = gettupleitem(v, 0)) ||
448 !is_stringobject(mode = gettupleitem(v, 1))) {
449 err_setstr(TypeError, "open() requires 2 string arguments");
450 return NULL;
451 }
452 v = newfileobject(getstringvalue(name), getstringvalue(mode));
453 return v;
454}
455
456static object *
457builtin_ord(self, v)
458 object *self;
459 object *v;
460{
461 if (v == NULL || !is_stringobject(v)) {
462 err_setstr(TypeError, "ord() must have string argument");
463 return NULL;
464 }
465 if (getstringsize(v) != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000466 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000467 return NULL;
468 }
469 return newintobject((long)(getstringvalue(v)[0] & 0xff));
470}
471
472static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000473builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000474 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000475 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000476{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000477 object *v, *w, *x;
478 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000479 err_setstr(TypeError, "pow() requires 2 arguments");
480 return NULL;
481 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000482 v = gettupleitem(args, 0);
483 w = gettupleitem(args, 1);
484 if (v->ob_type->tp_as_number == NULL ||
485 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000486 err_setstr(TypeError, "pow() requires numeric arguments");
487 return NULL;
488 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000489 if (coerce(&v, &w) != 0)
490 return NULL;
491 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
492 DECREF(v);
493 DECREF(w);
494 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000495}
496
497static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000498builtin_range(self, v)
499 object *self;
500 object *v;
501{
502 static char *errmsg = "range() requires 1-3 int arguments";
503 int i, n;
504 long ilow, ihigh, istep;
505 if (v != NULL && is_intobject(v)) {
506 ilow = 0; ihigh = getintvalue(v); istep = 1;
507 }
508 else if (v == NULL || !is_tupleobject(v)) {
509 err_setstr(TypeError, errmsg);
510 return NULL;
511 }
512 else {
513 n = gettuplesize(v);
514 if (n < 1 || n > 3) {
515 err_setstr(TypeError, errmsg);
516 return NULL;
517 }
518 for (i = 0; i < n; i++) {
519 if (!is_intobject(gettupleitem(v, i))) {
520 err_setstr(TypeError, errmsg);
521 return NULL;
522 }
523 }
524 if (n == 3) {
525 istep = getintvalue(gettupleitem(v, 2));
526 --n;
527 }
528 else
529 istep = 1;
530 ihigh = getintvalue(gettupleitem(v, --n));
531 if (n > 0)
532 ilow = getintvalue(gettupleitem(v, 0));
533 else
534 ilow = 0;
535 }
536 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000537 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000538 return NULL;
539 }
540 /* XXX ought to check overflow of subtraction */
541 if (istep > 0)
542 n = (ihigh - ilow + istep - 1) / istep;
543 else
544 n = (ihigh - ilow + istep + 1) / istep;
545 if (n < 0)
546 n = 0;
547 v = newlistobject(n);
548 if (v == NULL)
549 return NULL;
550 for (i = 0; i < n; i++) {
551 object *w = newintobject(ilow);
552 if (w == NULL) {
553 DECREF(v);
554 return NULL;
555 }
556 setlistitem(v, i, w);
557 ilow += istep;
558 }
559 return v;
560}
561
562static object *
563builtin_raw_input(self, v)
564 object *self;
565 object *v;
566{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000567 FILE *out = sysgetfile("stdout", stdout);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000568 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000569 if (v != NULL) {
570 if (printobject(v, out, PRINT_RAW) != 0)
571 return NULL;
572 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000573 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000574}
575
576static object *
577builtin_reload(self, v)
578 object *self;
579 object *v;
580{
581 return reload_module(v);
582}
583
584static object *
585builtin_type(self, v)
586 object *self;
587 object *v;
588{
589 if (v == NULL) {
590 err_setstr(TypeError, "type() requres an argument");
591 return NULL;
592 }
593 v = (object *)v->ob_type;
594 INCREF(v);
595 return v;
596}
597
598static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000599 {"abs", builtin_abs},
600 {"apply", builtin_apply},
601 {"chr", builtin_chr},
602 {"dir", builtin_dir},
603 {"divmod", builtin_divmod},
604 {"eval", builtin_eval},
605 {"exec", builtin_exec},
606 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000607 {"getattr", builtin_getattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000608 {"hex", builtin_hex},
609 {"input", builtin_input},
610 {"int", builtin_int},
611 {"len", builtin_len},
612 {"long", builtin_long},
613 {"max", builtin_max},
614 {"min", builtin_min},
615 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000616 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000617 {"ord", builtin_ord},
618 {"pow", builtin_pow},
619 {"range", builtin_range},
620 {"raw_input", builtin_raw_input},
621 {"reload", builtin_reload},
Guido van Rossum33894be1992-01-27 16:53:09 +0000622 {"setattr", builtin_setattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000623 {"type", builtin_type},
624 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000625};
626
627static object *builtin_dict;
628
629object *
630getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000631 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000632{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000633 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000634}
635
636/* Predefined exceptions */
637
Guido van Rossumfb905c31991-12-16 15:42:38 +0000638object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000639object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000640object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000641object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000642object *IndexError;
643object *KeyError;
644object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000645object *MemoryError;
646object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000647object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000648object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000649object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000650object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000651object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000652object *TypeError;
653object *ValueError;
654object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000655
Guido van Rossum3f5da241990-12-20 15:06:42 +0000656static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000657newstdexception(name)
658 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000659{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000660 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000661 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
662 fatal("no mem for new standard exception");
663 return v;
664}
665
666static void
667initerrors()
668{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000669 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000670 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000671 IOError = newstdexception("IOError");
672 ImportError = newstdexception("ImportError");
673 IndexError = newstdexception("IndexError");
674 KeyError = newstdexception("KeyError");
675 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000676 MemoryError = newstdexception("MemoryError");
677 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000678 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000679 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000680 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000681 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000682 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000683 TypeError = newstdexception("TypeError");
684 ValueError = newstdexception("ValueError");
685 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000686}
687
688void
689initbuiltin()
690{
691 object *m;
692 m = initmodule("builtin", builtin_methods);
693 builtin_dict = getmoduledict(m);
694 INCREF(builtin_dict);
695 initerrors();
696 (void) dictinsert(builtin_dict, "None", None);
697}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000698
699/* Coerce two numeric types to the "larger" one.
700 Increment the reference count on each argument.
701 Return -1 and raise an exception if no coercion is possible
702 (and then no reference count is incremented).
703 XXX This should be distributed over the various numeric types,
704 XXX but for now I don't see how to implement that.
705 XXX So, for now, if you add a new numeric type,
706 XXX you must add to this function as well. */
707
708int
709coerce(pv, pw)
710 object **pv, **pw;
711{
712 register object *v = *pv;
713 register object *w = *pw;
714 if (v->ob_type == w->ob_type) {
715 INCREF(v);
716 INCREF(w);
717 return 0;
718 }
719 if (v->ob_type->tp_as_number == NULL ||
720 w->ob_type->tp_as_number == NULL) {
721 err_setstr(TypeError, "mixing number and non-number");
722 return -1;
723 }
724 if (is_floatobject(v) || is_floatobject(w)) {
725 v = builtin_float((object *)0, v);
726 w = builtin_float((object *)0, w);
727 }
728 else if (is_longobject(v) || is_longobject(w)) {
729 v = builtin_long((object *)0, v);
730 w = builtin_long((object *)0, w);
731 }
732 else {
733 err_setstr(TypeError, "can't coerce numeric types?!?!?");
734 return -1;
735 }
736 if (v == NULL || w == NULL) {
737 XDECREF(v);
738 XDECREF(w);
739 return -1;
740 }
741 *pv = v;
742 *pw = w;
743 return 0;
744}