blob: 57d9a07cc3950e9a4fc98b9e67b3081f32ec7eb7 [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 Rossum94390a41992-08-14 15:14:30 +0000232 if (strlen(s) != getstringsize(str)) {
233 err_setstr(ValueError, "embedded '\\0' in string arg");
234 return NULL;
235 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000236 BGN_SAVE
Guido van Rossum94390a41992-08-14 15:14:30 +0000237 fp = fopen(s, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000238 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000239 if (fp == NULL) {
240 err_setstr(IOError, "execfile cannot open the file argument");
241 return NULL;
242 }
243 w = run_file(fp, getstringvalue(str), file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000244 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000245 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000246 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000247 return w;
248}
249
250static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000251builtin_float(self, v)
252 object *self;
253 object *v;
254{
255 if (v == NULL) {
256 /* */
257 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000258 else if (is_intobject(v)) {
259 long x = getintvalue(v);
260 return newfloatobject((double)x);
261 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000262 else if (is_longobject(v)) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000263 return newfloatobject(dgetlongvalue(v));
264 }
265 else if (is_floatobject(v)) {
266 INCREF(v);
267 return v;
268 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000269 else if (is_instanceobject(v)) {
270 return instance_convert(v, "__float__");
271 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000272 err_setstr(TypeError, "float() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000273 return NULL;
274}
275
276static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000277builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000278 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000279 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000280{
Guido van Rossum94390a41992-08-14 15:14:30 +0000281 object *v;
282 char *name;
283 if (!getargs(args, "(Os)", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000284 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000285 return getattr(v, name);
Guido van Rossum33894be1992-01-27 16:53:09 +0000286}
287
288static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000289builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000290 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000291 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000292{
Guido van Rossum94390a41992-08-14 15:14:30 +0000293 object *v;
294 char *name;
295 object *value;
296 if (!getargs(args, "(OsO)", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000297 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000298 if (setattr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000299 return NULL;
300 INCREF(None);
301 return None;
302}
303
304static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000305builtin_hex(self, v)
306 object *self;
307 object *v;
308{
309 if (v != NULL) {
310 if (is_intobject(v)) {
311 char buf[20];
312 long x = getintvalue(v);
313 if (x >= 0)
314 sprintf(buf, "0x%lx", x);
315 else
316 sprintf(buf, "-0x%lx", -x);
317 return newstringobject(buf);
318 }
319 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000320 return long_format(v, 16);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000321 }
322 }
323 err_setstr(TypeError, "hex() requires int/long argument");
324 return NULL;
325}
326
327static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000328builtin_input(self, v)
329 object *self;
330 object *v;
331{
332 FILE *in = sysgetfile("stdin", stdin);
333 FILE *out = sysgetfile("stdout", stdout);
Guido van Rossum22ebe2f1992-03-12 17:33:52 +0000334 int c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000335 object *m, *d;
336 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000337 if (v != NULL) {
338 if (printobject(v, out, PRINT_RAW) != 0)
339 return NULL;
340 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000341 m = add_module("__main__");
342 d = getmoduledict(m);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000343 BGN_SAVE
Guido van Rossum22ebe2f1992-03-12 17:33:52 +0000344 while ((c = getc(in)) != EOF && (c == ' ' || c == '\t'))
345 ;
346 ungetc(c, in);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000347 END_SAVE
Guido van Rossum3f5da241990-12-20 15:06:42 +0000348 return run_file(in, "<stdin>", expr_input, d, d);
349}
350
351static object *
352builtin_int(self, v)
353 object *self;
354 object *v;
355{
356 if (v == NULL) {
357 /* */
358 }
359 else if (is_intobject(v)) {
360 INCREF(v);
361 return v;
362 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000363 else if (is_longobject(v)) {
364 long x;
365 x = getlongvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000366 if (err_occurred())
Guido van Rossumd4905451991-05-05 20:00:36 +0000367 return NULL;
368 return newintobject(x);
369 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000370 else if (is_floatobject(v)) {
371 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000372 /* XXX should check for overflow */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000373 return newintobject((long)x);
374 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000375 else if (is_instanceobject(v)) {
376 return instance_convert(v, "__int__");
377 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000378 err_setstr(TypeError, "int() argument must be int, long or float");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000379 return NULL;
380}
381
382static object *
383builtin_len(self, v)
384 object *self;
385 object *v;
386{
387 long len;
388 typeobject *tp;
389 if (v == NULL) {
390 err_setstr(TypeError, "len() without argument");
391 return NULL;
392 }
393 tp = v->ob_type;
394 if (tp->tp_as_sequence != NULL) {
395 len = (*tp->tp_as_sequence->sq_length)(v);
396 }
397 else if (tp->tp_as_mapping != NULL) {
398 len = (*tp->tp_as_mapping->mp_length)(v);
399 }
400 else {
401 err_setstr(TypeError, "len() of unsized object");
402 return NULL;
403 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000404 if (len < 0)
405 return NULL;
406 else
407 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000408}
409
410static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000411builtin_long(self, v)
412 object *self;
413 object *v;
414{
415 if (v == NULL) {
416 /* */
417 }
418 else if (is_intobject(v)) {
419 return newlongobject(getintvalue(v));
420 }
421 else if (is_longobject(v)) {
422 INCREF(v);
423 return v;
424 }
425 else if (is_floatobject(v)) {
426 double x = getfloatvalue(v);
Guido van Rossumad405311991-06-03 10:58:01 +0000427 return dnewlongobject(x);
Guido van Rossumd4905451991-05-05 20:00:36 +0000428 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000429 else if (is_instanceobject(v)) {
430 return instance_convert(v, "__long__");
431 }
Guido van Rossumd4905451991-05-05 20:00:36 +0000432 err_setstr(TypeError, "long() argument must be int, long or float");
433 return NULL;
434}
435
436static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000437min_max(v, sign)
438 object *v;
439 int sign;
440{
441 int i, n, cmp;
442 object *w, *x;
443 sequence_methods *sq;
444 if (v == NULL) {
445 err_setstr(TypeError, "min() or max() without argument");
446 return NULL;
447 }
448 sq = v->ob_type->tp_as_sequence;
449 if (sq == NULL) {
450 err_setstr(TypeError, "min() or max() of non-sequence");
451 return NULL;
452 }
453 n = (*sq->sq_length)(v);
454 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000455 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000456 return NULL;
457 }
458 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
459 for (i = 1; i < n; i++) {
460 x = (*sq->sq_item)(v, i); /* Implies INCREF */
461 cmp = cmpobject(x, w);
462 if (cmp * sign > 0) {
463 DECREF(w);
464 w = x;
465 }
466 else
467 DECREF(x);
468 }
469 return w;
470}
471
472static object *
473builtin_min(self, v)
474 object *self;
475 object *v;
476{
477 return min_max(v, -1);
478}
479
480static object *
481builtin_max(self, v)
482 object *self;
483 object *v;
484{
485 return min_max(v, 1);
486}
487
488static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000489builtin_oct(self, v)
490 object *self;
491 object *v;
492{
493 if (v != NULL) {
494 if (is_intobject(v)) {
495 char buf[20];
496 long x = getintvalue(v);
Guido van Rossum94390a41992-08-14 15:14:30 +0000497 if (x == 0)
498 strcpy(buf, "0");
499 else if (x > 0)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000500 sprintf(buf, "0%lo", x);
501 else
502 sprintf(buf, "-0%lo", -x);
503 return newstringobject(buf);
504 }
505 if (is_longobject(v)) {
Guido van Rossum6d806471992-01-19 16:25:49 +0000506 return long_format(v, 8);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000507 }
508 }
509 err_setstr(TypeError, "oct() requires int/long argument");
510 return NULL;
511}
512
513static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000514builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000515 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000516 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000517{
Guido van Rossum94390a41992-08-14 15:14:30 +0000518 char *name, *mode;
519 if (!getargs(args, "(ss)", &name, &mode))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000520 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000521 return newfileobject(name, mode);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000522}
523
524static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000525builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000526 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000527 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000528{
Guido van Rossum94390a41992-08-14 15:14:30 +0000529 char *s;
530 int len;
531 if (!getargs(args, "s#", &s, &len))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000532 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000533 if (len != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000534 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000535 return NULL;
536 }
Guido van Rossum94390a41992-08-14 15:14:30 +0000537 return newintobject((long)(s[0] & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000538}
539
540static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000541builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000542 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000543 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000544{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000545 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000546 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossumd4905451991-05-05 20:00:36 +0000547 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000548 if (v->ob_type->tp_as_number == NULL ||
549 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000550 err_setstr(TypeError, "pow() requires numeric arguments");
551 return NULL;
552 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000553 if (coerce(&v, &w) != 0)
554 return NULL;
555 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
556 DECREF(v);
557 DECREF(w);
558 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000559}
560
561static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000562builtin_range(self, v)
563 object *self;
564 object *v;
565{
566 static char *errmsg = "range() requires 1-3 int arguments";
567 int i, n;
568 long ilow, ihigh, istep;
569 if (v != NULL && is_intobject(v)) {
570 ilow = 0; ihigh = getintvalue(v); istep = 1;
571 }
572 else if (v == NULL || !is_tupleobject(v)) {
573 err_setstr(TypeError, errmsg);
574 return NULL;
575 }
576 else {
577 n = gettuplesize(v);
578 if (n < 1 || n > 3) {
579 err_setstr(TypeError, errmsg);
580 return NULL;
581 }
582 for (i = 0; i < n; i++) {
583 if (!is_intobject(gettupleitem(v, i))) {
584 err_setstr(TypeError, errmsg);
585 return NULL;
586 }
587 }
588 if (n == 3) {
589 istep = getintvalue(gettupleitem(v, 2));
590 --n;
591 }
592 else
593 istep = 1;
594 ihigh = getintvalue(gettupleitem(v, --n));
595 if (n > 0)
596 ilow = getintvalue(gettupleitem(v, 0));
597 else
598 ilow = 0;
599 }
600 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000601 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000602 return NULL;
603 }
604 /* XXX ought to check overflow of subtraction */
605 if (istep > 0)
606 n = (ihigh - ilow + istep - 1) / istep;
607 else
608 n = (ihigh - ilow + istep + 1) / istep;
609 if (n < 0)
610 n = 0;
611 v = newlistobject(n);
612 if (v == NULL)
613 return NULL;
614 for (i = 0; i < n; i++) {
615 object *w = newintobject(ilow);
616 if (w == NULL) {
617 DECREF(v);
618 return NULL;
619 }
620 setlistitem(v, i, w);
621 ilow += istep;
622 }
623 return v;
624}
625
626static object *
627builtin_raw_input(self, v)
628 object *self;
629 object *v;
630{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000631 FILE *out = sysgetfile("stdout", stdout);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000632 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000633 if (v != NULL) {
634 if (printobject(v, out, PRINT_RAW) != 0)
635 return NULL;
636 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000637 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000638}
639
640static object *
641builtin_reload(self, v)
642 object *self;
643 object *v;
644{
645 return reload_module(v);
646}
647
648static object *
649builtin_type(self, v)
650 object *self;
651 object *v;
652{
653 if (v == NULL) {
654 err_setstr(TypeError, "type() requres an argument");
655 return NULL;
656 }
657 v = (object *)v->ob_type;
658 INCREF(v);
659 return v;
660}
661
662static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000663 {"abs", builtin_abs},
664 {"apply", builtin_apply},
665 {"chr", builtin_chr},
Guido van Rossum04691fc1992-08-12 15:35:34 +0000666 {"coerce", builtin_coerce},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000667 {"dir", builtin_dir},
668 {"divmod", builtin_divmod},
669 {"eval", builtin_eval},
670 {"exec", builtin_exec},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000671 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000672 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000673 {"getattr", builtin_getattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000674 {"hex", builtin_hex},
675 {"input", builtin_input},
676 {"int", builtin_int},
677 {"len", builtin_len},
678 {"long", builtin_long},
679 {"max", builtin_max},
680 {"min", builtin_min},
681 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000682 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000683 {"ord", builtin_ord},
684 {"pow", builtin_pow},
685 {"range", builtin_range},
686 {"raw_input", builtin_raw_input},
687 {"reload", builtin_reload},
Guido van Rossum33894be1992-01-27 16:53:09 +0000688 {"setattr", builtin_setattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000689 {"type", builtin_type},
690 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000691};
692
693static object *builtin_dict;
694
695object *
696getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000697 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000698{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000699 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000700}
701
702/* Predefined exceptions */
703
Guido van Rossumfb905c31991-12-16 15:42:38 +0000704object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000705object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000706object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000707object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000708object *IndexError;
709object *KeyError;
710object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000711object *MemoryError;
712object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000713object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000714object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000715object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000716object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000717object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000718object *TypeError;
719object *ValueError;
720object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000721
Guido van Rossum3f5da241990-12-20 15:06:42 +0000722static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000723newstdexception(name)
724 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000725{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000726 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000727 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
728 fatal("no mem for new standard exception");
729 return v;
730}
731
732static void
733initerrors()
734{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000735 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000736 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000737 IOError = newstdexception("IOError");
738 ImportError = newstdexception("ImportError");
739 IndexError = newstdexception("IndexError");
740 KeyError = newstdexception("KeyError");
741 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000742 MemoryError = newstdexception("MemoryError");
743 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000744 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000745 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000746 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000747 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000748 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000749 TypeError = newstdexception("TypeError");
750 ValueError = newstdexception("ValueError");
751 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000752}
753
754void
755initbuiltin()
756{
757 object *m;
758 m = initmodule("builtin", builtin_methods);
759 builtin_dict = getmoduledict(m);
760 INCREF(builtin_dict);
761 initerrors();
762 (void) dictinsert(builtin_dict, "None", None);
763}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000764
765/* Coerce two numeric types to the "larger" one.
766 Increment the reference count on each argument.
767 Return -1 and raise an exception if no coercion is possible
768 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +0000769*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000770
771int
772coerce(pv, pw)
773 object **pv, **pw;
774{
775 register object *v = *pv;
776 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000777 int res;
778
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000779 if (v->ob_type == w->ob_type) {
780 INCREF(v);
781 INCREF(w);
782 return 0;
783 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000784 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
785 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
786 if (res <= 0)
787 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000788 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000789 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
790 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
791 if (res <= 0)
792 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000793 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000794 err_setstr(TypeError, "number coercion failed");
795 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000796}