blob: 8fd12e41927f5a8d4eb78ce0cd8ac81ce965c4b0 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossume5372401993-03-16 12:15:04 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
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 Rossuma9e7dc11992-10-18 18:53:57 +000081builtin_cmp(self, args)
82 object *self;
83 object *args;
84{
85 object *a, *b;
86 if (!getargs(args, "(OO)", &a, &b))
87 return NULL;
88 return newintobject((long)cmpobject(a, b));
89}
90
91static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +000092builtin_coerce(self, args)
93 object *self;
94 object *args;
95{
96 object *v, *w;
97 object *res;
98
99 if (!getargs(args, "(OO)", &v, &w))
100 return NULL;
101 if (coerce(&v, &w) < 0)
102 return NULL;
103 res = mkvalue("(OO)", v, w);
104 DECREF(v);
105 DECREF(w);
106 return res;
107}
108
109static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000110builtin_dir(self, v)
111 object *self;
112 object *v;
113{
114 object *d;
115 if (v == NULL) {
116 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000117 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000118 }
119 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000120 d = getattr(v, "__dict__");
121 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000122 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000123 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000124 return NULL;
125 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000126 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000127 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000128 v = getdictkeys(d);
129 if (sortlist(v) != 0) {
130 DECREF(v);
131 v = NULL;
132 }
133 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000134 else {
135 v = newlistobject(0);
136 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000137 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000138 return v;
139}
140
141static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000142builtin_divmod(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000143 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000144 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000145{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000146 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000147 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000148 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000149 if (v->ob_type->tp_as_number == NULL ||
150 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000151 err_setstr(TypeError, "divmod() requires numeric arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000152 return NULL;
153 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000154 if (coerce(&v, &w) != 0)
155 return NULL;
156 x = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
157 DECREF(v);
158 DECREF(w);
159 return x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000160}
161
162static object *
163exec_eval(v, start)
164 object *v;
165 int start;
166{
167 object *str = NULL, *globals = NULL, *locals = NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000168 char *s;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000169 int n;
170 if (v != NULL) {
171 if (is_stringobject(v))
172 str = v;
173 else if (is_tupleobject(v) &&
174 ((n = gettuplesize(v)) == 2 || n == 3)) {
175 str = gettupleitem(v, 0);
176 globals = gettupleitem(v, 1);
177 if (n == 3)
178 locals = gettupleitem(v, 2);
179 }
180 }
181 if (str == NULL || !is_stringobject(str) ||
182 globals != NULL && !is_dictobject(globals) ||
183 locals != NULL && !is_dictobject(locals)) {
184 err_setstr(TypeError,
185 "exec/eval arguments must be string[,dict[,dict]]");
186 return NULL;
187 }
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000188 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000189 if (strlen(s) != getstringsize(str)) {
190 err_setstr(ValueError, "embedded '\\0' in string arg");
191 return NULL;
192 }
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000193 if (start == eval_input) {
194 while (*s == ' ' || *s == '\t')
195 s++;
196 }
197 return run_string(s, start, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000198}
199
200static object *
201builtin_eval(self, v)
202 object *self;
203 object *v;
204{
205 return exec_eval(v, eval_input);
206}
207
208static object *
209builtin_exec(self, v)
210 object *self;
211 object *v;
212{
213 return exec_eval(v, file_input);
214}
215
216static object *
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000217builtin_execfile(self, v)
218 object *self;
219 object *v;
220{
221 object *str = NULL, *globals = NULL, *locals = NULL, *w;
222 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000223 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000224 int n;
225 if (v != NULL) {
226 if (is_stringobject(v))
227 str = v;
228 else if (is_tupleobject(v) &&
229 ((n = gettuplesize(v)) == 2 || n == 3)) {
230 str = gettupleitem(v, 0);
231 globals = gettupleitem(v, 1);
232 if (n == 3)
233 locals = gettupleitem(v, 2);
234 }
235 }
236 if (str == NULL || !is_stringobject(str) ||
237 globals != NULL && !is_dictobject(globals) ||
238 locals != NULL && !is_dictobject(locals)) {
239 err_setstr(TypeError,
240 "execfile arguments must be filename[,dict[,dict]]");
241 return NULL;
242 }
Guido van Rossum2b81dc91992-08-19 16:40:53 +0000243 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000244 if (strlen(s) != getstringsize(str)) {
245 err_setstr(ValueError, "embedded '\\0' in string arg");
246 return NULL;
247 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000248 BGN_SAVE
Guido van Rossum94390a41992-08-14 15:14:30 +0000249 fp = fopen(s, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000250 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000251 if (fp == NULL) {
252 err_setstr(IOError, "execfile cannot open the file argument");
253 return NULL;
254 }
255 w = run_file(fp, getstringvalue(str), file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000256 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000257 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000258 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000259 return w;
260}
261
262static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000263builtin_float(self, v)
264 object *self;
265 object *v;
266{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000267 number_methods *nb;
268
269 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
270 nb->nb_float == NULL) {
271 err_setstr(TypeError,
272 "float() argument can't be converted to float");
273 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000274 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000275 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000276}
277
278static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000279builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000280 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000281 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000282{
Guido van Rossum94390a41992-08-14 15:14:30 +0000283 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000284 object *name;
285 if (!getargs(args, "(OS)", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000286 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000287 return getattro(v, name);
288}
289
290static object *
291builtin_hasattr(self, args)
292 object *self;
293 object *args;
294{
295 object *v;
296 object *name;
297 if (!getargs(args, "(OS)", &v, &name))
298 return NULL;
299 v = getattro(v, name);
300 if (v == NULL) {
301 err_clear();
302 return newintobject(0L);
303 }
304 DECREF(v);
305 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000306}
307
308static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000309builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000310 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000311 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000312{
Guido van Rossum94390a41992-08-14 15:14:30 +0000313 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000314 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000315 object *value;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000316 if (!getargs(args, "(OSO)", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000317 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000318 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000319 return NULL;
320 INCREF(None);
321 return None;
322}
323
324static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000325builtin_hash(self, args)
326 object *self;
327 object *args;
328{
329 object *v;
330 long x;
331 if (!getargs(args, "O", &v))
332 return NULL;
333 x = hashobject(v);
334 if (x == -1)
335 return NULL;
336 return newintobject(x);
337}
338
339static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000340builtin_hex(self, v)
341 object *self;
342 object *v;
343{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000344 number_methods *nb;
345
346 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
347 nb->nb_hex == NULL) {
348 err_setstr(TypeError,
349 "hex() argument can't be converted to hex");
350 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000351 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000352 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000353}
354
Guido van Rossum3165fe61992-09-25 21:59:05 +0000355static object *builtin_raw_input PROTO((object *, object *));
356
Guido van Rossum006bcd41991-10-24 14:54:44 +0000357static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000358builtin_input(self, v)
359 object *self;
360 object *v;
361{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000362 object *line = builtin_raw_input(self, v);
363 if (line == NULL)
364 return line;
365 v = exec_eval(line, eval_input);
366 DECREF(line);
367 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000368}
369
370static object *
371builtin_int(self, v)
372 object *self;
373 object *v;
374{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000375 number_methods *nb;
376
377 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
378 nb->nb_int == NULL) {
379 err_setstr(TypeError,
380 "int() argument can't be converted to int");
381 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000382 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000383 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000384}
385
386static object *
387builtin_len(self, v)
388 object *self;
389 object *v;
390{
391 long len;
392 typeobject *tp;
393 if (v == NULL) {
394 err_setstr(TypeError, "len() without argument");
395 return NULL;
396 }
397 tp = v->ob_type;
398 if (tp->tp_as_sequence != NULL) {
399 len = (*tp->tp_as_sequence->sq_length)(v);
400 }
401 else if (tp->tp_as_mapping != NULL) {
402 len = (*tp->tp_as_mapping->mp_length)(v);
403 }
404 else {
405 err_setstr(TypeError, "len() of unsized object");
406 return NULL;
407 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000408 if (len < 0)
409 return NULL;
410 else
411 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000412}
413
414static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000415builtin_long(self, v)
416 object *self;
417 object *v;
418{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000419 number_methods *nb;
420
421 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
422 nb->nb_long == NULL) {
423 err_setstr(TypeError,
424 "long() argument can't be converted to long");
425 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000426 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000427 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000428}
429
430static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000431min_max(v, sign)
432 object *v;
433 int sign;
434{
435 int i, n, cmp;
436 object *w, *x;
437 sequence_methods *sq;
438 if (v == NULL) {
439 err_setstr(TypeError, "min() or max() without argument");
440 return NULL;
441 }
442 sq = v->ob_type->tp_as_sequence;
443 if (sq == NULL) {
444 err_setstr(TypeError, "min() or max() of non-sequence");
445 return NULL;
446 }
447 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000448 if (n < 0)
449 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000450 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000451 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000452 return NULL;
453 }
454 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
455 for (i = 1; i < n; i++) {
456 x = (*sq->sq_item)(v, i); /* Implies INCREF */
457 cmp = cmpobject(x, w);
458 if (cmp * sign > 0) {
459 DECREF(w);
460 w = x;
461 }
462 else
463 DECREF(x);
464 }
465 return w;
466}
467
468static object *
469builtin_min(self, v)
470 object *self;
471 object *v;
472{
473 return min_max(v, -1);
474}
475
476static object *
477builtin_max(self, v)
478 object *self;
479 object *v;
480{
481 return min_max(v, 1);
482}
483
484static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000485builtin_oct(self, v)
486 object *self;
487 object *v;
488{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000489 number_methods *nb;
490
491 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
492 nb->nb_oct == NULL) {
493 err_setstr(TypeError,
494 "oct() argument can't be converted to oct");
495 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000496 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000497 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000498}
499
500static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000501builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000502 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000503 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000504{
Guido van Rossum94390a41992-08-14 15:14:30 +0000505 char *name, *mode;
506 if (!getargs(args, "(ss)", &name, &mode))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000507 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000508 return newfileobject(name, mode);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000509}
510
511static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000512builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000513 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000514 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000515{
Guido van Rossum94390a41992-08-14 15:14:30 +0000516 char *s;
517 int len;
518 if (!getargs(args, "s#", &s, &len))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000519 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000520 if (len != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000521 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000522 return NULL;
523 }
Guido van Rossum94390a41992-08-14 15:14:30 +0000524 return newintobject((long)(s[0] & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000525}
526
527static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000528builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000529 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000530 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000531{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000532 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000533 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossumd4905451991-05-05 20:00:36 +0000534 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000535 if (v->ob_type->tp_as_number == NULL ||
536 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000537 err_setstr(TypeError, "pow() requires numeric arguments");
538 return NULL;
539 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000540 if (coerce(&v, &w) != 0)
541 return NULL;
542 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
543 DECREF(v);
544 DECREF(w);
545 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000546}
547
548static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000549builtin_range(self, v)
550 object *self;
551 object *v;
552{
553 static char *errmsg = "range() requires 1-3 int arguments";
554 int i, n;
555 long ilow, ihigh, istep;
556 if (v != NULL && is_intobject(v)) {
557 ilow = 0; ihigh = getintvalue(v); istep = 1;
558 }
559 else if (v == NULL || !is_tupleobject(v)) {
560 err_setstr(TypeError, errmsg);
561 return NULL;
562 }
563 else {
564 n = gettuplesize(v);
565 if (n < 1 || n > 3) {
566 err_setstr(TypeError, errmsg);
567 return NULL;
568 }
569 for (i = 0; i < n; i++) {
570 if (!is_intobject(gettupleitem(v, i))) {
571 err_setstr(TypeError, errmsg);
572 return NULL;
573 }
574 }
575 if (n == 3) {
576 istep = getintvalue(gettupleitem(v, 2));
577 --n;
578 }
579 else
580 istep = 1;
581 ihigh = getintvalue(gettupleitem(v, --n));
582 if (n > 0)
583 ilow = getintvalue(gettupleitem(v, 0));
584 else
585 ilow = 0;
586 }
587 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000588 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000589 return NULL;
590 }
591 /* XXX ought to check overflow of subtraction */
592 if (istep > 0)
593 n = (ihigh - ilow + istep - 1) / istep;
594 else
595 n = (ihigh - ilow + istep + 1) / istep;
596 if (n < 0)
597 n = 0;
598 v = newlistobject(n);
599 if (v == NULL)
600 return NULL;
601 for (i = 0; i < n; i++) {
602 object *w = newintobject(ilow);
603 if (w == NULL) {
604 DECREF(v);
605 return NULL;
606 }
607 setlistitem(v, i, w);
608 ilow += istep;
609 }
610 return v;
611}
612
613static object *
614builtin_raw_input(self, v)
615 object *self;
616 object *v;
617{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000618 object *f = sysget("stdout");
619 if (f == NULL) {
620 err_setstr(RuntimeError, "lost sys.stdout");
621 return NULL;
622 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000623 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000624 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000625 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +0000626 return NULL;
627 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000628 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000629}
630
631static object *
632builtin_reload(self, v)
633 object *self;
634 object *v;
635{
636 return reload_module(v);
637}
638
639static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +0000640builtin_repr(self, v)
641 object *self;
642 object *v;
643{
644 if (v == NULL) {
645 err_badarg();
646 return NULL;
647 }
648 return reprobject(v);
649}
650
651static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000652builtin_round(self, args)
653 object *self;
654 object *args;
655{
656 extern double floor PROTO((double));
657 extern double ceil PROTO((double));
658 double x;
659 double f;
660 int ndigits = 0;
661 int sign = 1;
662 int i;
663 if (!getargs(args, "d", &x)) {
664 err_clear();
665 if (!getargs(args, "(di)", &x, &ndigits))
666 return NULL;
667 }
668 f = 1.0;
669 for (i = ndigits; --i >= 0; )
670 f = f*10.0;
671 for (i = ndigits; ++i <= 0; )
672 f = f*0.1;
673 if (x >= 0.0)
674 return newfloatobject(floor(x*f + 0.5) / f);
675 else
676 return newfloatobject(ceil(x*f - 0.5) / f);
677}
678
679static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +0000680builtin_str(self, v)
681 object *self;
682 object *v;
683{
684 if (v == NULL) {
685 err_badarg();
686 return NULL;
687 }
688 if (is_stringobject(v)) {
689 INCREF(v);
690 return v;
691 }
692 else
693 return reprobject(v);
694}
695
696static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000697builtin_type(self, v)
698 object *self;
699 object *v;
700{
701 if (v == NULL) {
Guido van Rossumc89705d1992-11-26 08:54:07 +0000702 err_setstr(TypeError, "type() requires an argument");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000703 return NULL;
704 }
705 v = (object *)v->ob_type;
706 INCREF(v);
707 return v;
708}
709
710static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000711 {"abs", builtin_abs},
712 {"apply", builtin_apply},
713 {"chr", builtin_chr},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000714 {"cmp", builtin_cmp},
Guido van Rossum04691fc1992-08-12 15:35:34 +0000715 {"coerce", builtin_coerce},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000716 {"dir", builtin_dir},
717 {"divmod", builtin_divmod},
718 {"eval", builtin_eval},
719 {"exec", builtin_exec},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000720 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000721 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000722 {"getattr", builtin_getattr},
Guido van Rossum9bfef441993-03-29 10:43:31 +0000723 {"hasattr", builtin_hasattr},
724 {"hash", builtin_hash},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000725 {"hex", builtin_hex},
726 {"input", builtin_input},
727 {"int", builtin_int},
728 {"len", builtin_len},
729 {"long", builtin_long},
730 {"max", builtin_max},
731 {"min", builtin_min},
732 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000733 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000734 {"ord", builtin_ord},
735 {"pow", builtin_pow},
736 {"range", builtin_range},
737 {"raw_input", builtin_raw_input},
738 {"reload", builtin_reload},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000739 {"repr", builtin_repr},
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000740 {"round", builtin_round},
Guido van Rossum33894be1992-01-27 16:53:09 +0000741 {"setattr", builtin_setattr},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000742 {"str", builtin_str},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000743 {"type", builtin_type},
744 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000745};
746
747static object *builtin_dict;
748
749object *
750getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000751 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000752{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000753 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000754}
755
756/* Predefined exceptions */
757
Guido van Rossumfb905c31991-12-16 15:42:38 +0000758object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000759object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000760object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000761object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000762object *IndexError;
763object *KeyError;
764object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000765object *MemoryError;
766object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000767object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000768object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000769object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000770object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000771object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000772object *TypeError;
773object *ValueError;
774object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000775
Guido van Rossum3f5da241990-12-20 15:06:42 +0000776static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000777newstdexception(name)
778 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000779{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000780 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000781 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
782 fatal("no mem for new standard exception");
783 return v;
784}
785
786static void
787initerrors()
788{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000789 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000790 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000791 IOError = newstdexception("IOError");
792 ImportError = newstdexception("ImportError");
793 IndexError = newstdexception("IndexError");
794 KeyError = newstdexception("KeyError");
795 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000796 MemoryError = newstdexception("MemoryError");
797 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000798 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000799 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000800 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000801 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000802 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000803 TypeError = newstdexception("TypeError");
804 ValueError = newstdexception("ValueError");
805 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000806}
807
808void
809initbuiltin()
810{
811 object *m;
812 m = initmodule("builtin", builtin_methods);
813 builtin_dict = getmoduledict(m);
814 INCREF(builtin_dict);
815 initerrors();
816 (void) dictinsert(builtin_dict, "None", None);
817}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000818
819/* Coerce two numeric types to the "larger" one.
820 Increment the reference count on each argument.
821 Return -1 and raise an exception if no coercion is possible
822 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +0000823*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000824
825int
826coerce(pv, pw)
827 object **pv, **pw;
828{
829 register object *v = *pv;
830 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000831 int res;
832
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000833 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000834 INCREF(v);
835 INCREF(w);
836 return 0;
837 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000838 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
839 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
840 if (res <= 0)
841 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000842 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000843 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
844 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
845 if (res <= 0)
846 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000847 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000848 err_setstr(TypeError, "number coercion failed");
849 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000850}