blob: b74cdf182334b2a3d2809ab195e67759b70cb685 [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 Rossum94390a41992-08-14 15:14:30 +000053builtin_apply(self, args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000054 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000055 object *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000056{
Guido van Rossum94390a41992-08-14 15:14:30 +000057 object *func, *arglist;
58 if (!getargs(args, "(OO)", &func, &arglist))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000059 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +000060 return call_object(func, arglist);
Guido van Rossumc02e15c1991-12-16 13:03:00 +000061}
62
63static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000064builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000065 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000066 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000067{
68 long x;
69 char s[1];
Guido van Rossum94390a41992-08-14 15:14:30 +000070 if (!getargs(args, "l", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +000071 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000072 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +000073 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +000074 return NULL;
75 }
76 s[0] = x;
77 return newsizedstringobject(s, 1);
78}
79
80static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +000081builtin_coerce(self, args)
82 object *self;
83 object *args;
84{
85 object *v, *w;
86 object *res;
87
88 if (!getargs(args, "(OO)", &v, &w))
89 return NULL;
90 if (coerce(&v, &w) < 0)
91 return NULL;
92 res = mkvalue("(OO)", v, w);
93 DECREF(v);
94 DECREF(w);
95 return res;
96}
97
98static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +000099builtin_dir(self, v)
100 object *self;
101 object *v;
102{
103 object *d;
104 if (v == NULL) {
105 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000106 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000107 }
108 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000109 d = getattr(v, "__dict__");
110 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000111 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000112 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000113 return NULL;
114 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000115 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000116 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000117 v = getdictkeys(d);
118 if (sortlist(v) != 0) {
119 DECREF(v);
120 v = NULL;
121 }
122 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000123 else {
124 v = newlistobject(0);
125 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000126 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000127 return v;
128}
129
130static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000131builtin_divmod(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000132 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000133 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000134{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000135 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000136 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000137 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000138 if (v->ob_type->tp_as_number == NULL ||
139 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000140 err_setstr(TypeError, "divmod() requires numeric arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000141 return NULL;
142 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000143 if (coerce(&v, &w) != 0)
144 return NULL;
145 x = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
146 DECREF(v);
147 DECREF(w);
148 return x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000149}
150
151static object *
152exec_eval(v, start)
153 object *v;
154 int start;
155{
156 object *str = NULL, *globals = NULL, *locals = NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000157 char *s;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000158 int n;
159 if (v != NULL) {
160 if (is_stringobject(v))
161 str = v;
162 else if (is_tupleobject(v) &&
163 ((n = gettuplesize(v)) == 2 || n == 3)) {
164 str = gettupleitem(v, 0);
165 globals = gettupleitem(v, 1);
166 if (n == 3)
167 locals = gettupleitem(v, 2);
168 }
169 }
170 if (str == NULL || !is_stringobject(str) ||
171 globals != NULL && !is_dictobject(globals) ||
172 locals != NULL && !is_dictobject(locals)) {
173 err_setstr(TypeError,
174 "exec/eval arguments must be string[,dict[,dict]]");
175 return NULL;
176 }
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000177 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000178 if (strlen(s) != getstringsize(str)) {
179 err_setstr(ValueError, "embedded '\\0' in string arg");
180 return NULL;
181 }
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000182 if (start == eval_input) {
183 while (*s == ' ' || *s == '\t')
184 s++;
185 }
186 return run_string(s, start, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000187}
188
189static object *
190builtin_eval(self, v)
191 object *self;
192 object *v;
193{
194 return exec_eval(v, eval_input);
195}
196
197static object *
198builtin_exec(self, v)
199 object *self;
200 object *v;
201{
202 return exec_eval(v, file_input);
203}
204
205static object *
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000206builtin_execfile(self, v)
207 object *self;
208 object *v;
209{
210 object *str = NULL, *globals = NULL, *locals = NULL, *w;
211 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000212 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000213 int n;
214 if (v != NULL) {
215 if (is_stringobject(v))
216 str = v;
217 else if (is_tupleobject(v) &&
218 ((n = gettuplesize(v)) == 2 || n == 3)) {
219 str = gettupleitem(v, 0);
220 globals = gettupleitem(v, 1);
221 if (n == 3)
222 locals = gettupleitem(v, 2);
223 }
224 }
225 if (str == NULL || !is_stringobject(str) ||
226 globals != NULL && !is_dictobject(globals) ||
227 locals != NULL && !is_dictobject(locals)) {
228 err_setstr(TypeError,
229 "execfile arguments must be filename[,dict[,dict]]");
230 return NULL;
231 }
Guido van Rossum2b81dc91992-08-19 16:40:53 +0000232 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000233 if (strlen(s) != getstringsize(str)) {
234 err_setstr(ValueError, "embedded '\\0' in string arg");
235 return NULL;
236 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000237 BGN_SAVE
Guido van Rossum94390a41992-08-14 15:14:30 +0000238 fp = fopen(s, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000239 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000240 if (fp == NULL) {
241 err_setstr(IOError, "execfile cannot open the file argument");
242 return NULL;
243 }
244 w = run_file(fp, getstringvalue(str), file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000245 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000246 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000247 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000248 return w;
249}
250
251static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000252builtin_float(self, v)
253 object *self;
254 object *v;
255{
256 if (v == NULL) {
257 /* */
258 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000259 else if (is_intobject(v)) {
260 long x = getintvalue(v);
261 return newfloatobject((double)x);
262 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000263 else if (is_longobject(v)) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000264 return newfloatobject(dgetlongvalue(v));
265 }
266 else if (is_floatobject(v)) {
267 INCREF(v);
268 return v;
269 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000270 else if (is_instanceobject(v)) {
271 return instance_convert(v, "__float__");
272 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000273 err_setstr(TypeError, "float() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000274 return NULL;
275}
276
277static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000278builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000279 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000280 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000281{
Guido van Rossum94390a41992-08-14 15:14:30 +0000282 object *v;
283 char *name;
284 if (!getargs(args, "(Os)", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000285 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000286 return getattr(v, name);
Guido van Rossum33894be1992-01-27 16:53:09 +0000287}
288
289static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000290builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000291 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000292 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000293{
Guido van Rossum94390a41992-08-14 15:14:30 +0000294 object *v;
295 char *name;
296 object *value;
297 if (!getargs(args, "(OsO)", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000298 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000299 if (setattr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000300 return NULL;
301 INCREF(None);
302 return None;
303}
304
305static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000306builtin_hex(self, v)
307 object *self;
308 object *v;
309{
310 if (v != NULL) {
311 if (is_intobject(v)) {
312 char buf[20];
313 long x = getintvalue(v);
314 if (x >= 0)
315 sprintf(buf, "0x%lx", x);
316 else
317 sprintf(buf, "-0x%lx", -x);
318 return newstringobject(buf);
319 }
320 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000321 return long_format(v, 16);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000322 }
323 }
324 err_setstr(TypeError, "hex() requires int/long argument");
325 return NULL;
326}
327
328static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000329builtin_input(self, v)
330 object *self;
331 object *v;
332{
333 FILE *in = sysgetfile("stdin", stdin);
334 FILE *out = sysgetfile("stdout", stdout);
Guido van Rossum22ebe2f1992-03-12 17:33:52 +0000335 int c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000336 object *m, *d;
337 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000338 if (v != NULL) {
339 if (printobject(v, out, PRINT_RAW) != 0)
340 return NULL;
341 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000342 m = add_module("__main__");
343 d = getmoduledict(m);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000344 BGN_SAVE
Guido van Rossum22ebe2f1992-03-12 17:33:52 +0000345 while ((c = getc(in)) != EOF && (c == ' ' || c == '\t'))
346 ;
347 ungetc(c, in);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000348 END_SAVE
Guido van Rossum3f5da241990-12-20 15:06:42 +0000349 return run_file(in, "<stdin>", expr_input, d, d);
350}
351
352static object *
353builtin_int(self, v)
354 object *self;
355 object *v;
356{
357 if (v == NULL) {
358 /* */
359 }
360 else if (is_intobject(v)) {
361 INCREF(v);
362 return v;
363 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000364 else if (is_longobject(v)) {
365 long x;
366 x = getlongvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000367 if (err_occurred())
Guido van Rossumd4905451991-05-05 20:00:36 +0000368 return NULL;
369 return newintobject(x);
370 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000371 else if (is_floatobject(v)) {
372 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000373 /* XXX should check for overflow */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000374 return newintobject((long)x);
375 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000376 else if (is_instanceobject(v)) {
377 return instance_convert(v, "__int__");
378 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000379 err_setstr(TypeError, "int() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000380 return NULL;
381}
382
383static object *
384builtin_len(self, v)
385 object *self;
386 object *v;
387{
388 long len;
389 typeobject *tp;
390 if (v == NULL) {
391 err_setstr(TypeError, "len() without argument");
392 return NULL;
393 }
394 tp = v->ob_type;
395 if (tp->tp_as_sequence != NULL) {
396 len = (*tp->tp_as_sequence->sq_length)(v);
397 }
398 else if (tp->tp_as_mapping != NULL) {
399 len = (*tp->tp_as_mapping->mp_length)(v);
400 }
401 else {
402 err_setstr(TypeError, "len() of unsized object");
403 return NULL;
404 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000405 if (len < 0)
406 return NULL;
407 else
408 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000409}
410
411static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000412builtin_long(self, v)
413 object *self;
414 object *v;
415{
416 if (v == NULL) {
417 /* */
418 }
419 else if (is_intobject(v)) {
420 return newlongobject(getintvalue(v));
421 }
422 else if (is_longobject(v)) {
423 INCREF(v);
424 return v;
425 }
426 else if (is_floatobject(v)) {
427 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000428 return dnewlongobject(x);
Guido van Rossumd4905451991-05-05 20:00:36 +0000429 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000430 else if (is_instanceobject(v)) {
431 return instance_convert(v, "__long__");
432 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000433 err_setstr(TypeError, "long() argument must be int, long or float");
434 return NULL;
435}
436
437static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000438min_max(v, sign)
439 object *v;
440 int sign;
441{
442 int i, n, cmp;
443 object *w, *x;
444 sequence_methods *sq;
445 if (v == NULL) {
446 err_setstr(TypeError, "min() or max() without argument");
447 return NULL;
448 }
449 sq = v->ob_type->tp_as_sequence;
450 if (sq == NULL) {
451 err_setstr(TypeError, "min() or max() of non-sequence");
452 return NULL;
453 }
454 n = (*sq->sq_length)(v);
455 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000456 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000457 return NULL;
458 }
459 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
460 for (i = 1; i < n; i++) {
461 x = (*sq->sq_item)(v, i); /* Implies INCREF */
462 cmp = cmpobject(x, w);
463 if (cmp * sign > 0) {
464 DECREF(w);
465 w = x;
466 }
467 else
468 DECREF(x);
469 }
470 return w;
471}
472
473static object *
474builtin_min(self, v)
475 object *self;
476 object *v;
477{
478 return min_max(v, -1);
479}
480
481static object *
482builtin_max(self, v)
483 object *self;
484 object *v;
485{
486 return min_max(v, 1);
487}
488
489static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000490builtin_oct(self, v)
491 object *self;
492 object *v;
493{
494 if (v != NULL) {
495 if (is_intobject(v)) {
496 char buf[20];
497 long x = getintvalue(v);
Guido van Rossum94390a41992-08-14 15:14:30 +0000498 if (x == 0)
499 strcpy(buf, "0");
500 else if (x > 0)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000501 sprintf(buf, "0%lo", x);
502 else
503 sprintf(buf, "-0%lo", -x);
504 return newstringobject(buf);
505 }
506 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000507 return long_format(v, 8);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000508 }
509 }
510 err_setstr(TypeError, "oct() requires int/long argument");
511 return NULL;
512}
513
514static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000515builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000516 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000517 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000518{
Guido van Rossum94390a41992-08-14 15:14:30 +0000519 char *name, *mode;
520 if (!getargs(args, "(ss)", &name, &mode))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000521 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000522 return newfileobject(name, mode);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000523}
524
525static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000526builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000527 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000528 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000529{
Guido van Rossum94390a41992-08-14 15:14:30 +0000530 char *s;
531 int len;
532 if (!getargs(args, "s#", &s, &len))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000533 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000534 if (len != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000535 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000536 return NULL;
537 }
Guido van Rossum94390a41992-08-14 15:14:30 +0000538 return newintobject((long)(s[0] & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000539}
540
541static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000542builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000543 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000544 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000545{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000546 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000547 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossumd4905451991-05-05 20:00:36 +0000548 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000549 if (v->ob_type->tp_as_number == NULL ||
550 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000551 err_setstr(TypeError, "pow() requires numeric arguments");
552 return NULL;
553 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000554 if (coerce(&v, &w) != 0)
555 return NULL;
556 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
557 DECREF(v);
558 DECREF(w);
559 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000560}
561
562static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000563builtin_range(self, v)
564 object *self;
565 object *v;
566{
567 static char *errmsg = "range() requires 1-3 int arguments";
568 int i, n;
569 long ilow, ihigh, istep;
570 if (v != NULL && is_intobject(v)) {
571 ilow = 0; ihigh = getintvalue(v); istep = 1;
572 }
573 else if (v == NULL || !is_tupleobject(v)) {
574 err_setstr(TypeError, errmsg);
575 return NULL;
576 }
577 else {
578 n = gettuplesize(v);
579 if (n < 1 || n > 3) {
580 err_setstr(TypeError, errmsg);
581 return NULL;
582 }
583 for (i = 0; i < n; i++) {
584 if (!is_intobject(gettupleitem(v, i))) {
585 err_setstr(TypeError, errmsg);
586 return NULL;
587 }
588 }
589 if (n == 3) {
590 istep = getintvalue(gettupleitem(v, 2));
591 --n;
592 }
593 else
594 istep = 1;
595 ihigh = getintvalue(gettupleitem(v, --n));
596 if (n > 0)
597 ilow = getintvalue(gettupleitem(v, 0));
598 else
599 ilow = 0;
600 }
601 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000602 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000603 return NULL;
604 }
605 /* XXX ought to check overflow of subtraction */
606 if (istep > 0)
607 n = (ihigh - ilow + istep - 1) / istep;
608 else
609 n = (ihigh - ilow + istep + 1) / istep;
610 if (n < 0)
611 n = 0;
612 v = newlistobject(n);
613 if (v == NULL)
614 return NULL;
615 for (i = 0; i < n; i++) {
616 object *w = newintobject(ilow);
617 if (w == NULL) {
618 DECREF(v);
619 return NULL;
620 }
621 setlistitem(v, i, w);
622 ilow += istep;
623 }
624 return v;
625}
626
627static object *
628builtin_raw_input(self, v)
629 object *self;
630 object *v;
631{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000632 FILE *out = sysgetfile("stdout", stdout);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000633 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000634 if (v != NULL) {
635 if (printobject(v, out, PRINT_RAW) != 0)
636 return NULL;
637 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000638 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000639}
640
641static object *
642builtin_reload(self, v)
643 object *self;
644 object *v;
645{
646 return reload_module(v);
647}
648
649static object *
650builtin_type(self, v)
651 object *self;
652 object *v;
653{
654 if (v == NULL) {
655 err_setstr(TypeError, "type() requres an argument");
656 return NULL;
657 }
658 v = (object *)v->ob_type;
659 INCREF(v);
660 return v;
661}
662
663static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000664 {"abs", builtin_abs},
665 {"apply", builtin_apply},
666 {"chr", builtin_chr},
Guido van Rossum04691fc1992-08-12 15:35:34 +0000667 {"coerce", builtin_coerce},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000668 {"dir", builtin_dir},
669 {"divmod", builtin_divmod},
670 {"eval", builtin_eval},
671 {"exec", builtin_exec},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000672 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000673 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000674 {"getattr", builtin_getattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000675 {"hex", builtin_hex},
676 {"input", builtin_input},
677 {"int", builtin_int},
678 {"len", builtin_len},
679 {"long", builtin_long},
680 {"max", builtin_max},
681 {"min", builtin_min},
682 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000683 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000684 {"ord", builtin_ord},
685 {"pow", builtin_pow},
686 {"range", builtin_range},
687 {"raw_input", builtin_raw_input},
688 {"reload", builtin_reload},
Guido van Rossum33894be1992-01-27 16:53:09 +0000689 {"setattr", builtin_setattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000690 {"type", builtin_type},
691 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000692};
693
694static object *builtin_dict;
695
696object *
697getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000698 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000699{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000700 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000701}
702
703/* Predefined exceptions */
704
Guido van Rossumfb905c31991-12-16 15:42:38 +0000705object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000706object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000707object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000708object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000709object *IndexError;
710object *KeyError;
711object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000712object *MemoryError;
713object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000714object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000715object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000716object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000717object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000718object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000719object *TypeError;
720object *ValueError;
721object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000722
Guido van Rossum3f5da241990-12-20 15:06:42 +0000723static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000724newstdexception(name)
725 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000726{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000727 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000728 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
729 fatal("no mem for new standard exception");
730 return v;
731}
732
733static void
734initerrors()
735{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000736 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000737 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000738 IOError = newstdexception("IOError");
739 ImportError = newstdexception("ImportError");
740 IndexError = newstdexception("IndexError");
741 KeyError = newstdexception("KeyError");
742 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000743 MemoryError = newstdexception("MemoryError");
744 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000745 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000746 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000747 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000748 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000749 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000750 TypeError = newstdexception("TypeError");
751 ValueError = newstdexception("ValueError");
752 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000753}
754
755void
756initbuiltin()
757{
758 object *m;
759 m = initmodule("builtin", builtin_methods);
760 builtin_dict = getmoduledict(m);
761 INCREF(builtin_dict);
762 initerrors();
763 (void) dictinsert(builtin_dict, "None", None);
764}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000765
766/* Coerce two numeric types to the "larger" one.
767 Increment the reference count on each argument.
768 Return -1 and raise an exception if no coercion is possible
769 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +0000770*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000771
772int
773coerce(pv, pw)
774 object **pv, **pw;
775{
776 register object *v = *pv;
777 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000778 int res;
779
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000780 if (v->ob_type == w->ob_type) {
781 INCREF(v);
782 INCREF(w);
783 return 0;
784 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000785 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
786 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
787 if (res <= 0)
788 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000789 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000790 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
791 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
792 if (res <= 0)
793 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000794 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000795 err_setstr(TypeError, "number coercion failed");
796 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000797}