blob: d5870fe9dd785ba04b01840b4de58638e3c4eae1 [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 Rossum006bcd41991-10-24 14:54:44 +0000213builtin_hex(self, v)
214 object *self;
215 object *v;
216{
217 if (v != NULL) {
218 if (is_intobject(v)) {
219 char buf[20];
220 long x = getintvalue(v);
221 if (x >= 0)
222 sprintf(buf, "0x%lx", x);
223 else
224 sprintf(buf, "-0x%lx", -x);
225 return newstringobject(buf);
226 }
227 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000228 return long_format(v, 16);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000229 }
230 }
231 err_setstr(TypeError, "hex() requires int/long argument");
232 return NULL;
233}
234
235static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000236builtin_input(self, v)
237 object *self;
238 object *v;
239{
240 FILE *in = sysgetfile("stdin", stdin);
241 FILE *out = sysgetfile("stdout", stdout);
242 node *n;
243 int err;
244 object *m, *d;
245 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000246 if (v != NULL) {
247 if (printobject(v, out, PRINT_RAW) != 0)
248 return NULL;
249 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000250 m = add_module("__main__");
251 d = getmoduledict(m);
252 return run_file(in, "<stdin>", expr_input, d, d);
253}
254
255static object *
256builtin_int(self, v)
257 object *self;
258 object *v;
259{
260 if (v == NULL) {
261 /* */
262 }
263 else if (is_intobject(v)) {
264 INCREF(v);
265 return v;
266 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000267 else if (is_longobject(v)) {
268 long x;
269 x = getlongvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000270 if (err_occurred())
Guido van Rossumd4905451991-05-05 20:00:36 +0000271 return NULL;
272 return newintobject(x);
273 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000274 else if (is_floatobject(v)) {
275 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000276 /* XXX should check for overflow */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000277 return newintobject((long)x);
278 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000279 err_setstr(TypeError, "int() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000280 return NULL;
281}
282
283static object *
284builtin_len(self, v)
285 object *self;
286 object *v;
287{
288 long len;
289 typeobject *tp;
290 if (v == NULL) {
291 err_setstr(TypeError, "len() without argument");
292 return NULL;
293 }
294 tp = v->ob_type;
295 if (tp->tp_as_sequence != NULL) {
296 len = (*tp->tp_as_sequence->sq_length)(v);
297 }
298 else if (tp->tp_as_mapping != NULL) {
299 len = (*tp->tp_as_mapping->mp_length)(v);
300 }
301 else {
302 err_setstr(TypeError, "len() of unsized object");
303 return NULL;
304 }
305 return newintobject(len);
306}
307
308static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000309builtin_long(self, v)
310 object *self;
311 object *v;
312{
313 if (v == NULL) {
314 /* */
315 }
316 else if (is_intobject(v)) {
317 return newlongobject(getintvalue(v));
318 }
319 else if (is_longobject(v)) {
320 INCREF(v);
321 return v;
322 }
323 else if (is_floatobject(v)) {
324 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000325 return dnewlongobject(x);
Guido van Rossumd4905451991-05-05 20:00:36 +0000326 }
327 err_setstr(TypeError, "long() argument must be int, long or float");
328 return NULL;
329}
330
331static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000332min_max(v, sign)
333 object *v;
334 int sign;
335{
336 int i, n, cmp;
337 object *w, *x;
338 sequence_methods *sq;
339 if (v == NULL) {
340 err_setstr(TypeError, "min() or max() without argument");
341 return NULL;
342 }
343 sq = v->ob_type->tp_as_sequence;
344 if (sq == NULL) {
345 err_setstr(TypeError, "min() or max() of non-sequence");
346 return NULL;
347 }
348 n = (*sq->sq_length)(v);
349 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000350 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000351 return NULL;
352 }
353 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
354 for (i = 1; i < n; i++) {
355 x = (*sq->sq_item)(v, i); /* Implies INCREF */
356 cmp = cmpobject(x, w);
357 if (cmp * sign > 0) {
358 DECREF(w);
359 w = x;
360 }
361 else
362 DECREF(x);
363 }
364 return w;
365}
366
367static object *
368builtin_min(self, v)
369 object *self;
370 object *v;
371{
372 return min_max(v, -1);
373}
374
375static object *
376builtin_max(self, v)
377 object *self;
378 object *v;
379{
380 return min_max(v, 1);
381}
382
383static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000384builtin_oct(self, v)
385 object *self;
386 object *v;
387{
388 if (v != NULL) {
389 if (is_intobject(v)) {
390 char buf[20];
391 long x = getintvalue(v);
392 if (x >= 0)
393 sprintf(buf, "0%lo", x);
394 else
395 sprintf(buf, "-0%lo", -x);
396 return newstringobject(buf);
397 }
398 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000399 return long_format(v, 8);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000400 }
401 }
402 err_setstr(TypeError, "oct() requires int/long argument");
403 return NULL;
404}
405
406static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000407builtin_open(self, v)
408 object *self;
409 object *v;
410{
411 object *name, *mode;
412 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 ||
413 !is_stringobject(name = gettupleitem(v, 0)) ||
414 !is_stringobject(mode = gettupleitem(v, 1))) {
415 err_setstr(TypeError, "open() requires 2 string arguments");
416 return NULL;
417 }
418 v = newfileobject(getstringvalue(name), getstringvalue(mode));
419 return v;
420}
421
422static object *
423builtin_ord(self, v)
424 object *self;
425 object *v;
426{
427 if (v == NULL || !is_stringobject(v)) {
428 err_setstr(TypeError, "ord() must have string argument");
429 return NULL;
430 }
431 if (getstringsize(v) != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000432 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000433 return NULL;
434 }
435 return newintobject((long)(getstringvalue(v)[0] & 0xff));
436}
437
438static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000439builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000440 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000441 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000442{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000443 object *v, *w, *x;
444 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000445 err_setstr(TypeError, "pow() requires 2 arguments");
446 return NULL;
447 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000448 v = gettupleitem(args, 0);
449 w = gettupleitem(args, 1);
450 if (v->ob_type->tp_as_number == NULL ||
451 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000452 err_setstr(TypeError, "pow() requires numeric arguments");
453 return NULL;
454 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000455 if (coerce(&v, &w) != 0)
456 return NULL;
457 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
458 DECREF(v);
459 DECREF(w);
460 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000461}
462
463static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000464builtin_range(self, v)
465 object *self;
466 object *v;
467{
468 static char *errmsg = "range() requires 1-3 int arguments";
469 int i, n;
470 long ilow, ihigh, istep;
471 if (v != NULL && is_intobject(v)) {
472 ilow = 0; ihigh = getintvalue(v); istep = 1;
473 }
474 else if (v == NULL || !is_tupleobject(v)) {
475 err_setstr(TypeError, errmsg);
476 return NULL;
477 }
478 else {
479 n = gettuplesize(v);
480 if (n < 1 || n > 3) {
481 err_setstr(TypeError, errmsg);
482 return NULL;
483 }
484 for (i = 0; i < n; i++) {
485 if (!is_intobject(gettupleitem(v, i))) {
486 err_setstr(TypeError, errmsg);
487 return NULL;
488 }
489 }
490 if (n == 3) {
491 istep = getintvalue(gettupleitem(v, 2));
492 --n;
493 }
494 else
495 istep = 1;
496 ihigh = getintvalue(gettupleitem(v, --n));
497 if (n > 0)
498 ilow = getintvalue(gettupleitem(v, 0));
499 else
500 ilow = 0;
501 }
502 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000503 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000504 return NULL;
505 }
506 /* XXX ought to check overflow of subtraction */
507 if (istep > 0)
508 n = (ihigh - ilow + istep - 1) / istep;
509 else
510 n = (ihigh - ilow + istep + 1) / istep;
511 if (n < 0)
512 n = 0;
513 v = newlistobject(n);
514 if (v == NULL)
515 return NULL;
516 for (i = 0; i < n; i++) {
517 object *w = newintobject(ilow);
518 if (w == NULL) {
519 DECREF(v);
520 return NULL;
521 }
522 setlistitem(v, i, w);
523 ilow += istep;
524 }
525 return v;
526}
527
528static object *
529builtin_raw_input(self, v)
530 object *self;
531 object *v;
532{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000533 FILE *out = sysgetfile("stdout", stdout);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000534 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000535 if (v != NULL) {
536 if (printobject(v, out, PRINT_RAW) != 0)
537 return NULL;
538 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000539 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000540}
541
542static object *
543builtin_reload(self, v)
544 object *self;
545 object *v;
546{
547 return reload_module(v);
548}
549
550static object *
551builtin_type(self, v)
552 object *self;
553 object *v;
554{
555 if (v == NULL) {
556 err_setstr(TypeError, "type() requres an argument");
557 return NULL;
558 }
559 v = (object *)v->ob_type;
560 INCREF(v);
561 return v;
562}
563
564static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000565 {"abs", builtin_abs},
566 {"apply", builtin_apply},
567 {"chr", builtin_chr},
568 {"dir", builtin_dir},
569 {"divmod", builtin_divmod},
570 {"eval", builtin_eval},
571 {"exec", builtin_exec},
572 {"float", builtin_float},
573 {"hex", builtin_hex},
574 {"input", builtin_input},
575 {"int", builtin_int},
576 {"len", builtin_len},
577 {"long", builtin_long},
578 {"max", builtin_max},
579 {"min", builtin_min},
580 {"oct", builtin_oct},
581 {"open", builtin_open}, /* XXX move to OS module */
582 {"ord", builtin_ord},
583 {"pow", builtin_pow},
584 {"range", builtin_range},
585 {"raw_input", builtin_raw_input},
586 {"reload", builtin_reload},
587 {"type", builtin_type},
588 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000589};
590
591static object *builtin_dict;
592
593object *
594getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000595 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000596{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000597 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000598}
599
600/* Predefined exceptions */
601
Guido van Rossumfb905c31991-12-16 15:42:38 +0000602object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000603object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000604object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000605object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000606object *IndexError;
607object *KeyError;
608object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000609object *MemoryError;
610object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000611object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000612object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000613object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000614object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000615object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000616object *TypeError;
617object *ValueError;
618object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000619
Guido van Rossum3f5da241990-12-20 15:06:42 +0000620static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000621newstdexception(name)
622 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000623{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000624 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000625 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
626 fatal("no mem for new standard exception");
627 return v;
628}
629
630static void
631initerrors()
632{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000633 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000634 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000635 IOError = newstdexception("IOError");
636 ImportError = newstdexception("ImportError");
637 IndexError = newstdexception("IndexError");
638 KeyError = newstdexception("KeyError");
639 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000640 MemoryError = newstdexception("MemoryError");
641 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000642 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000643 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000644 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000645 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000646 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000647 TypeError = newstdexception("TypeError");
648 ValueError = newstdexception("ValueError");
649 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000650}
651
652void
653initbuiltin()
654{
655 object *m;
656 m = initmodule("builtin", builtin_methods);
657 builtin_dict = getmoduledict(m);
658 INCREF(builtin_dict);
659 initerrors();
660 (void) dictinsert(builtin_dict, "None", None);
661}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000662
663/* Coerce two numeric types to the "larger" one.
664 Increment the reference count on each argument.
665 Return -1 and raise an exception if no coercion is possible
666 (and then no reference count is incremented).
667 XXX This should be distributed over the various numeric types,
668 XXX but for now I don't see how to implement that.
669 XXX So, for now, if you add a new numeric type,
670 XXX you must add to this function as well. */
671
672int
673coerce(pv, pw)
674 object **pv, **pw;
675{
676 register object *v = *pv;
677 register object *w = *pw;
678 if (v->ob_type == w->ob_type) {
679 INCREF(v);
680 INCREF(w);
681 return 0;
682 }
683 if (v->ob_type->tp_as_number == NULL ||
684 w->ob_type->tp_as_number == NULL) {
685 err_setstr(TypeError, "mixing number and non-number");
686 return -1;
687 }
688 if (is_floatobject(v) || is_floatobject(w)) {
689 v = builtin_float((object *)0, v);
690 w = builtin_float((object *)0, w);
691 }
692 else if (is_longobject(v) || is_longobject(w)) {
693 v = builtin_long((object *)0, v);
694 w = builtin_long((object *)0, w);
695 }
696 else {
697 err_setstr(TypeError, "can't coerce numeric types?!?!?");
698 return -1;
699 }
700 if (v == NULL || w == NULL) {
701 XDECREF(v);
702 XDECREF(w);
703 return -1;
704 }
705 *pv = v;
706 *pw = w;
707 return 0;
708}