blob: ca5043d764b507df5442acdf8b1123b449fc2c92 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumbab9d031992-04-05 14:26:55 +00002Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
Guido van Rossumf70e43a1991-02-19 12:39:46 +00003Netherlands.
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"
Guido van Rossum3f5da241990-12-20 15:06:42 +000036#include "ceval.h"
37#include "modsupport.h"
38
39static object *
40builtin_abs(self, v)
41 object *self;
42 object *v;
43{
Guido van Rossumd4905451991-05-05 20:00:36 +000044 number_methods *nm;
45 if (v == NULL || (nm = v->ob_type->tp_as_number) == NULL) {
46 err_setstr(TypeError, "abs() requires numeric argument");
47 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000048 }
Guido van Rossumd4905451991-05-05 20:00:36 +000049 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000050}
51
52static object *
Guido van Rossumc02e15c1991-12-16 13:03:00 +000053builtin_apply(self, v)
54 object *self;
55 object *v;
56{
57 object *func, *args;
58 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2) {
59 err_setstr(TypeError, "apply() requires (func,args)");
60 return NULL;
61 }
62 func = gettupleitem(v, 0);
63 args = gettupleitem(v, 1);
64 return call_object(func, args);
65}
66
67static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +000068builtin_chr(self, v)
69 object *self;
70 object *v;
71{
72 long x;
73 char s[1];
74 if (v == NULL || !is_intobject(v)) {
Guido van Rossum006bcd41991-10-24 14:54:44 +000075 err_setstr(TypeError, "chr() requires int argument");
Guido van Rossum3f5da241990-12-20 15:06:42 +000076 return NULL;
77 }
78 x = getintvalue(v);
79 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +000080 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +000081 return NULL;
82 }
83 s[0] = x;
84 return newsizedstringobject(s, 1);
85}
86
87static object *
88builtin_dir(self, v)
89 object *self;
90 object *v;
91{
92 object *d;
93 if (v == NULL) {
94 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +000095 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +000096 }
97 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +000098 d = getattr(v, "__dict__");
99 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000100 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000101 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000102 return NULL;
103 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000104 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000105 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000106 v = getdictkeys(d);
107 if (sortlist(v) != 0) {
108 DECREF(v);
109 v = NULL;
110 }
111 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000112 else {
113 v = newlistobject(0);
114 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000115 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000116 return v;
117}
118
119static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000120builtin_divmod(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000121 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000122 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000123{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000124 object *v, *w, *x;
125 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000126 err_setstr(TypeError, "divmod() requires 2 arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000127 return NULL;
128 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000129 v = gettupleitem(args, 0);
130 w = gettupleitem(args, 1);
131 if (v->ob_type->tp_as_number == NULL ||
132 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000133 err_setstr(TypeError, "divmod() requires numeric arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000134 return NULL;
135 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000136 if (coerce(&v, &w) != 0)
137 return NULL;
138 x = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
139 DECREF(v);
140 DECREF(w);
141 return x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000142}
143
144static object *
145exec_eval(v, start)
146 object *v;
147 int start;
148{
149 object *str = NULL, *globals = NULL, *locals = NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000150 char *s;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000151 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 }
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000170 s = getstringvalue(str);
171 if (start == eval_input) {
172 while (*s == ' ' || *s == '\t')
173 s++;
174 }
175 return run_string(s, start, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000176}
177
178static object *
179builtin_eval(self, v)
180 object *self;
181 object *v;
182{
183 return exec_eval(v, eval_input);
184}
185
186static object *
187builtin_exec(self, v)
188 object *self;
189 object *v;
190{
191 return exec_eval(v, file_input);
192}
193
194static object *
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000195builtin_execfile(self, v)
196 object *self;
197 object *v;
198{
199 object *str = NULL, *globals = NULL, *locals = NULL, *w;
200 FILE* fp;
201 int n;
202 if (v != NULL) {
203 if (is_stringobject(v))
204 str = v;
205 else if (is_tupleobject(v) &&
206 ((n = gettuplesize(v)) == 2 || n == 3)) {
207 str = gettupleitem(v, 0);
208 globals = gettupleitem(v, 1);
209 if (n == 3)
210 locals = gettupleitem(v, 2);
211 }
212 }
213 if (str == NULL || !is_stringobject(str) ||
214 globals != NULL && !is_dictobject(globals) ||
215 locals != NULL && !is_dictobject(locals)) {
216 err_setstr(TypeError,
217 "execfile arguments must be filename[,dict[,dict]]");
218 return NULL;
219 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000220 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000221 fp = fopen(getstringvalue(str), "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000222 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000223 if (fp == NULL) {
224 err_setstr(IOError, "execfile cannot open the file argument");
225 return NULL;
226 }
227 w = run_file(fp, getstringvalue(str), file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000228 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000229 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000230 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000231 return w;
232}
233
234static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000235builtin_float(self, v)
236 object *self;
237 object *v;
238{
239 if (v == NULL) {
240 /* */
241 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000242 else if (is_intobject(v)) {
243 long x = getintvalue(v);
244 return newfloatobject((double)x);
245 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000246 else if (is_longobject(v)) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000247 return newfloatobject(dgetlongvalue(v));
248 }
249 else if (is_floatobject(v)) {
250 INCREF(v);
251 return v;
252 }
253 err_setstr(TypeError, "float() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000254 return NULL;
255}
256
257static object *
Guido van Rossum33894be1992-01-27 16:53:09 +0000258builtin_getattr(self, v)
259 object *self;
260 object *v;
261{
262 object *name;
263 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 ||
264 (name = gettupleitem(v, 1), !is_stringobject(name))) {
265 err_setstr(TypeError,
266 "getattr() arguments must be (object, string)");
267 return NULL;
268 }
269 return getattr(gettupleitem(v, 0), getstringvalue(name));
270}
271
272static object *
273builtin_setattr(self, v)
274 object *self;
275 object *v;
276{
277 object *name;
278 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3 ||
279 (name = gettupleitem(v, 1), !is_stringobject(name))) {
280 err_setstr(TypeError,
281 "setattr() arguments must be (object, string, object)");
282 return NULL;
283 }
284 if (setattr(gettupleitem(v, 0),
285 getstringvalue(name), gettupleitem(v, 2)) != 0)
286 return NULL;
287 INCREF(None);
288 return None;
289}
290
291static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000292builtin_hex(self, v)
293 object *self;
294 object *v;
295{
296 if (v != NULL) {
297 if (is_intobject(v)) {
298 char buf[20];
299 long x = getintvalue(v);
300 if (x >= 0)
301 sprintf(buf, "0x%lx", x);
302 else
303 sprintf(buf, "-0x%lx", -x);
304 return newstringobject(buf);
305 }
306 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000307 return long_format(v, 16);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000308 }
309 }
310 err_setstr(TypeError, "hex() requires int/long argument");
311 return NULL;
312}
313
314static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000315builtin_input(self, v)
316 object *self;
317 object *v;
318{
319 FILE *in = sysgetfile("stdin", stdin);
320 FILE *out = sysgetfile("stdout", stdout);
Guido van Rossum22ebe2f1992-03-12 17:33:52 +0000321 int c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000322 object *m, *d;
323 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000324 if (v != NULL) {
325 if (printobject(v, out, PRINT_RAW) != 0)
326 return NULL;
327 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000328 m = add_module("__main__");
329 d = getmoduledict(m);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000330 BGN_SAVE
Guido van Rossum22ebe2f1992-03-12 17:33:52 +0000331 while ((c = getc(in)) != EOF && (c == ' ' || c == '\t'))
332 ;
333 ungetc(c, in);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000334 END_SAVE
Guido van Rossum3f5da241990-12-20 15:06:42 +0000335 return run_file(in, "<stdin>", expr_input, d, d);
336}
337
338static object *
339builtin_int(self, v)
340 object *self;
341 object *v;
342{
343 if (v == NULL) {
344 /* */
345 }
346 else if (is_intobject(v)) {
347 INCREF(v);
348 return v;
349 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000350 else if (is_longobject(v)) {
351 long x;
352 x = getlongvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000353 if (err_occurred())
Guido van Rossumd4905451991-05-05 20:00:36 +0000354 return NULL;
355 return newintobject(x);
356 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000357 else if (is_floatobject(v)) {
358 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000359 /* XXX should check for overflow */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000360 return newintobject((long)x);
361 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000362 err_setstr(TypeError, "int() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000363 return NULL;
364}
365
366static object *
367builtin_len(self, v)
368 object *self;
369 object *v;
370{
371 long len;
372 typeobject *tp;
373 if (v == NULL) {
374 err_setstr(TypeError, "len() without argument");
375 return NULL;
376 }
377 tp = v->ob_type;
378 if (tp->tp_as_sequence != NULL) {
379 len = (*tp->tp_as_sequence->sq_length)(v);
380 }
381 else if (tp->tp_as_mapping != NULL) {
382 len = (*tp->tp_as_mapping->mp_length)(v);
383 }
384 else {
385 err_setstr(TypeError, "len() of unsized object");
386 return NULL;
387 }
388 return newintobject(len);
389}
390
391static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000392builtin_long(self, v)
393 object *self;
394 object *v;
395{
396 if (v == NULL) {
397 /* */
398 }
399 else if (is_intobject(v)) {
400 return newlongobject(getintvalue(v));
401 }
402 else if (is_longobject(v)) {
403 INCREF(v);
404 return v;
405 }
406 else if (is_floatobject(v)) {
407 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000408 return dnewlongobject(x);
Guido van Rossumd4905451991-05-05 20:00:36 +0000409 }
410 err_setstr(TypeError, "long() argument must be int, long or float");
411 return NULL;
412}
413
414static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000415min_max(v, sign)
416 object *v;
417 int sign;
418{
419 int i, n, cmp;
420 object *w, *x;
421 sequence_methods *sq;
422 if (v == NULL) {
423 err_setstr(TypeError, "min() or max() without argument");
424 return NULL;
425 }
426 sq = v->ob_type->tp_as_sequence;
427 if (sq == NULL) {
428 err_setstr(TypeError, "min() or max() of non-sequence");
429 return NULL;
430 }
431 n = (*sq->sq_length)(v);
432 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000433 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000434 return NULL;
435 }
436 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
437 for (i = 1; i < n; i++) {
438 x = (*sq->sq_item)(v, i); /* Implies INCREF */
439 cmp = cmpobject(x, w);
440 if (cmp * sign > 0) {
441 DECREF(w);
442 w = x;
443 }
444 else
445 DECREF(x);
446 }
447 return w;
448}
449
450static object *
451builtin_min(self, v)
452 object *self;
453 object *v;
454{
455 return min_max(v, -1);
456}
457
458static object *
459builtin_max(self, v)
460 object *self;
461 object *v;
462{
463 return min_max(v, 1);
464}
465
466static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000467builtin_oct(self, v)
468 object *self;
469 object *v;
470{
471 if (v != NULL) {
472 if (is_intobject(v)) {
473 char buf[20];
474 long x = getintvalue(v);
475 if (x >= 0)
476 sprintf(buf, "0%lo", x);
477 else
478 sprintf(buf, "-0%lo", -x);
479 return newstringobject(buf);
480 }
481 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000482 return long_format(v, 8);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000483 }
484 }
485 err_setstr(TypeError, "oct() requires int/long argument");
486 return NULL;
487}
488
489static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000490builtin_open(self, v)
491 object *self;
492 object *v;
493{
494 object *name, *mode;
495 if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2 ||
496 !is_stringobject(name = gettupleitem(v, 0)) ||
497 !is_stringobject(mode = gettupleitem(v, 1))) {
498 err_setstr(TypeError, "open() requires 2 string arguments");
499 return NULL;
500 }
501 v = newfileobject(getstringvalue(name), getstringvalue(mode));
502 return v;
503}
504
505static object *
506builtin_ord(self, v)
507 object *self;
508 object *v;
509{
510 if (v == NULL || !is_stringobject(v)) {
511 err_setstr(TypeError, "ord() must have string argument");
512 return NULL;
513 }
514 if (getstringsize(v) != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000515 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000516 return NULL;
517 }
518 return newintobject((long)(getstringvalue(v)[0] & 0xff));
519}
520
521static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000522builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000523 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000524 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000525{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000526 object *v, *w, *x;
527 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000528 err_setstr(TypeError, "pow() requires 2 arguments");
529 return NULL;
530 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000531 v = gettupleitem(args, 0);
532 w = gettupleitem(args, 1);
533 if (v->ob_type->tp_as_number == NULL ||
534 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000535 err_setstr(TypeError, "pow() requires numeric arguments");
536 return NULL;
537 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000538 if (coerce(&v, &w) != 0)
539 return NULL;
540 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
541 DECREF(v);
542 DECREF(w);
543 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000544}
545
546static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000547builtin_range(self, v)
548 object *self;
549 object *v;
550{
551 static char *errmsg = "range() requires 1-3 int arguments";
552 int i, n;
553 long ilow, ihigh, istep;
554 if (v != NULL && is_intobject(v)) {
555 ilow = 0; ihigh = getintvalue(v); istep = 1;
556 }
557 else if (v == NULL || !is_tupleobject(v)) {
558 err_setstr(TypeError, errmsg);
559 return NULL;
560 }
561 else {
562 n = gettuplesize(v);
563 if (n < 1 || n > 3) {
564 err_setstr(TypeError, errmsg);
565 return NULL;
566 }
567 for (i = 0; i < n; i++) {
568 if (!is_intobject(gettupleitem(v, i))) {
569 err_setstr(TypeError, errmsg);
570 return NULL;
571 }
572 }
573 if (n == 3) {
574 istep = getintvalue(gettupleitem(v, 2));
575 --n;
576 }
577 else
578 istep = 1;
579 ihigh = getintvalue(gettupleitem(v, --n));
580 if (n > 0)
581 ilow = getintvalue(gettupleitem(v, 0));
582 else
583 ilow = 0;
584 }
585 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000586 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000587 return NULL;
588 }
589 /* XXX ought to check overflow of subtraction */
590 if (istep > 0)
591 n = (ihigh - ilow + istep - 1) / istep;
592 else
593 n = (ihigh - ilow + istep + 1) / istep;
594 if (n < 0)
595 n = 0;
596 v = newlistobject(n);
597 if (v == NULL)
598 return NULL;
599 for (i = 0; i < n; i++) {
600 object *w = newintobject(ilow);
601 if (w == NULL) {
602 DECREF(v);
603 return NULL;
604 }
605 setlistitem(v, i, w);
606 ilow += istep;
607 }
608 return v;
609}
610
611static object *
612builtin_raw_input(self, v)
613 object *self;
614 object *v;
615{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000616 FILE *out = sysgetfile("stdout", stdout);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000617 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000618 if (v != NULL) {
619 if (printobject(v, out, PRINT_RAW) != 0)
620 return NULL;
621 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000622 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000623}
624
625static object *
626builtin_reload(self, v)
627 object *self;
628 object *v;
629{
630 return reload_module(v);
631}
632
633static object *
634builtin_type(self, v)
635 object *self;
636 object *v;
637{
638 if (v == NULL) {
639 err_setstr(TypeError, "type() requres an argument");
640 return NULL;
641 }
642 v = (object *)v->ob_type;
643 INCREF(v);
644 return v;
645}
646
647static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000648 {"abs", builtin_abs},
649 {"apply", builtin_apply},
650 {"chr", builtin_chr},
651 {"dir", builtin_dir},
652 {"divmod", builtin_divmod},
653 {"eval", builtin_eval},
654 {"exec", builtin_exec},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000655 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000656 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000657 {"getattr", builtin_getattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000658 {"hex", builtin_hex},
659 {"input", builtin_input},
660 {"int", builtin_int},
661 {"len", builtin_len},
662 {"long", builtin_long},
663 {"max", builtin_max},
664 {"min", builtin_min},
665 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000666 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000667 {"ord", builtin_ord},
668 {"pow", builtin_pow},
669 {"range", builtin_range},
670 {"raw_input", builtin_raw_input},
671 {"reload", builtin_reload},
Guido van Rossum33894be1992-01-27 16:53:09 +0000672 {"setattr", builtin_setattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000673 {"type", builtin_type},
674 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000675};
676
677static object *builtin_dict;
678
679object *
680getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000681 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000682{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000683 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000684}
685
686/* Predefined exceptions */
687
Guido van Rossumfb905c31991-12-16 15:42:38 +0000688object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000689object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000690object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000691object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000692object *IndexError;
693object *KeyError;
694object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000695object *MemoryError;
696object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000697object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000698object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000699object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000700object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000701object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000702object *TypeError;
703object *ValueError;
704object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000705
Guido van Rossum3f5da241990-12-20 15:06:42 +0000706static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000707newstdexception(name)
708 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000709{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000710 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000711 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
712 fatal("no mem for new standard exception");
713 return v;
714}
715
716static void
717initerrors()
718{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000719 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000720 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000721 IOError = newstdexception("IOError");
722 ImportError = newstdexception("ImportError");
723 IndexError = newstdexception("IndexError");
724 KeyError = newstdexception("KeyError");
725 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000726 MemoryError = newstdexception("MemoryError");
727 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000728 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000729 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000730 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000731 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000732 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000733 TypeError = newstdexception("TypeError");
734 ValueError = newstdexception("ValueError");
735 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000736}
737
738void
739initbuiltin()
740{
741 object *m;
742 m = initmodule("builtin", builtin_methods);
743 builtin_dict = getmoduledict(m);
744 INCREF(builtin_dict);
745 initerrors();
746 (void) dictinsert(builtin_dict, "None", None);
747}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000748
749/* Coerce two numeric types to the "larger" one.
750 Increment the reference count on each argument.
751 Return -1 and raise an exception if no coercion is possible
752 (and then no reference count is incremented).
753 XXX This should be distributed over the various numeric types,
754 XXX but for now I don't see how to implement that.
755 XXX So, for now, if you add a new numeric type,
756 XXX you must add to this function as well. */
757
758int
759coerce(pv, pw)
760 object **pv, **pw;
761{
762 register object *v = *pv;
763 register object *w = *pw;
764 if (v->ob_type == w->ob_type) {
765 INCREF(v);
766 INCREF(w);
767 return 0;
768 }
769 if (v->ob_type->tp_as_number == NULL ||
770 w->ob_type->tp_as_number == NULL) {
771 err_setstr(TypeError, "mixing number and non-number");
772 return -1;
773 }
774 if (is_floatobject(v) || is_floatobject(w)) {
775 v = builtin_float((object *)0, v);
776 w = builtin_float((object *)0, w);
777 }
778 else if (is_longobject(v) || is_longobject(w)) {
779 v = builtin_long((object *)0, v);
780 w = builtin_long((object *)0, w);
781 }
782 else {
783 err_setstr(TypeError, "can't coerce numeric types?!?!?");
784 return -1;
785 }
786 if (v == NULL || w == NULL) {
787 XDECREF(v);
788 XDECREF(w);
789 return -1;
790 }
791 *pv = v;
792 *pw = w;
793 return 0;
794}