blob: 97c130353bb7680ee78309ef613eb197960ff509 [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 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;
284 char *name;
285 if (!getargs(args, "(Os)", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000286 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000287 return getattr(v, name);
Guido van Rossum33894be1992-01-27 16:53:09 +0000288}
289
290static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000291builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000292 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000293 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000294{
Guido van Rossum94390a41992-08-14 15:14:30 +0000295 object *v;
296 char *name;
297 object *value;
298 if (!getargs(args, "(OsO)", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000299 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000300 if (setattr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000301 return NULL;
302 INCREF(None);
303 return None;
304}
305
306static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000307builtin_hex(self, v)
308 object *self;
309 object *v;
310{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000311 number_methods *nb;
312
313 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
314 nb->nb_hex == NULL) {
315 err_setstr(TypeError,
316 "hex() argument can't be converted to hex");
317 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000318 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000319 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000320}
321
Guido van Rossum3165fe61992-09-25 21:59:05 +0000322static object *builtin_raw_input PROTO((object *, object *));
323
Guido van Rossum006bcd41991-10-24 14:54:44 +0000324static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000325builtin_input(self, v)
326 object *self;
327 object *v;
328{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000329 object *line = builtin_raw_input(self, v);
330 if (line == NULL)
331 return line;
332 v = exec_eval(line, eval_input);
333 DECREF(line);
334 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000335}
336
337static object *
338builtin_int(self, v)
339 object *self;
340 object *v;
341{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000342 number_methods *nb;
343
344 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
345 nb->nb_int == NULL) {
346 err_setstr(TypeError,
347 "int() argument can't be converted to int");
348 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000349 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000350 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000351}
352
353static object *
354builtin_len(self, v)
355 object *self;
356 object *v;
357{
358 long len;
359 typeobject *tp;
360 if (v == NULL) {
361 err_setstr(TypeError, "len() without argument");
362 return NULL;
363 }
364 tp = v->ob_type;
365 if (tp->tp_as_sequence != NULL) {
366 len = (*tp->tp_as_sequence->sq_length)(v);
367 }
368 else if (tp->tp_as_mapping != NULL) {
369 len = (*tp->tp_as_mapping->mp_length)(v);
370 }
371 else {
372 err_setstr(TypeError, "len() of unsized object");
373 return NULL;
374 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000375 if (len < 0)
376 return NULL;
377 else
378 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000379}
380
381static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000382builtin_long(self, v)
383 object *self;
384 object *v;
385{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000386 number_methods *nb;
387
388 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
389 nb->nb_long == NULL) {
390 err_setstr(TypeError,
391 "long() argument can't be converted to long");
392 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000393 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000394 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000395}
396
397static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000398min_max(v, sign)
399 object *v;
400 int sign;
401{
402 int i, n, cmp;
403 object *w, *x;
404 sequence_methods *sq;
405 if (v == NULL) {
406 err_setstr(TypeError, "min() or max() without argument");
407 return NULL;
408 }
409 sq = v->ob_type->tp_as_sequence;
410 if (sq == NULL) {
411 err_setstr(TypeError, "min() or max() of non-sequence");
412 return NULL;
413 }
414 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000415 if (n < 0)
416 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000417 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000418 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000419 return NULL;
420 }
421 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
422 for (i = 1; i < n; i++) {
423 x = (*sq->sq_item)(v, i); /* Implies INCREF */
424 cmp = cmpobject(x, w);
425 if (cmp * sign > 0) {
426 DECREF(w);
427 w = x;
428 }
429 else
430 DECREF(x);
431 }
432 return w;
433}
434
435static object *
436builtin_min(self, v)
437 object *self;
438 object *v;
439{
440 return min_max(v, -1);
441}
442
443static object *
444builtin_max(self, v)
445 object *self;
446 object *v;
447{
448 return min_max(v, 1);
449}
450
451static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000452builtin_oct(self, v)
453 object *self;
454 object *v;
455{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000456 number_methods *nb;
457
458 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
459 nb->nb_oct == NULL) {
460 err_setstr(TypeError,
461 "oct() argument can't be converted to oct");
462 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000463 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000464 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000465}
466
467static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000468builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000469 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000470 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000471{
Guido van Rossum94390a41992-08-14 15:14:30 +0000472 char *name, *mode;
473 if (!getargs(args, "(ss)", &name, &mode))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000474 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000475 return newfileobject(name, mode);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000476}
477
478static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000479builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000480 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000481 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000482{
Guido van Rossum94390a41992-08-14 15:14:30 +0000483 char *s;
484 int len;
485 if (!getargs(args, "s#", &s, &len))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000486 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000487 if (len != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000488 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000489 return NULL;
490 }
Guido van Rossum94390a41992-08-14 15:14:30 +0000491 return newintobject((long)(s[0] & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000492}
493
494static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000495builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000496 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000497 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000498{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000499 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000500 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossumd4905451991-05-05 20:00:36 +0000501 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000502 if (v->ob_type->tp_as_number == NULL ||
503 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000504 err_setstr(TypeError, "pow() requires numeric arguments");
505 return NULL;
506 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000507 if (coerce(&v, &w) != 0)
508 return NULL;
509 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
510 DECREF(v);
511 DECREF(w);
512 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000513}
514
515static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000516builtin_range(self, v)
517 object *self;
518 object *v;
519{
520 static char *errmsg = "range() requires 1-3 int arguments";
521 int i, n;
522 long ilow, ihigh, istep;
523 if (v != NULL && is_intobject(v)) {
524 ilow = 0; ihigh = getintvalue(v); istep = 1;
525 }
526 else if (v == NULL || !is_tupleobject(v)) {
527 err_setstr(TypeError, errmsg);
528 return NULL;
529 }
530 else {
531 n = gettuplesize(v);
532 if (n < 1 || n > 3) {
533 err_setstr(TypeError, errmsg);
534 return NULL;
535 }
536 for (i = 0; i < n; i++) {
537 if (!is_intobject(gettupleitem(v, i))) {
538 err_setstr(TypeError, errmsg);
539 return NULL;
540 }
541 }
542 if (n == 3) {
543 istep = getintvalue(gettupleitem(v, 2));
544 --n;
545 }
546 else
547 istep = 1;
548 ihigh = getintvalue(gettupleitem(v, --n));
549 if (n > 0)
550 ilow = getintvalue(gettupleitem(v, 0));
551 else
552 ilow = 0;
553 }
554 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000555 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000556 return NULL;
557 }
558 /* XXX ought to check overflow of subtraction */
559 if (istep > 0)
560 n = (ihigh - ilow + istep - 1) / istep;
561 else
562 n = (ihigh - ilow + istep + 1) / istep;
563 if (n < 0)
564 n = 0;
565 v = newlistobject(n);
566 if (v == NULL)
567 return NULL;
568 for (i = 0; i < n; i++) {
569 object *w = newintobject(ilow);
570 if (w == NULL) {
571 DECREF(v);
572 return NULL;
573 }
574 setlistitem(v, i, w);
575 ilow += istep;
576 }
577 return v;
578}
579
580static object *
581builtin_raw_input(self, v)
582 object *self;
583 object *v;
584{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000585 object *f = sysget("stdout");
586 if (f == NULL) {
587 err_setstr(RuntimeError, "lost sys.stdout");
588 return NULL;
589 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000590 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000591 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000592 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +0000593 return NULL;
594 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000595 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000596}
597
598static object *
599builtin_reload(self, v)
600 object *self;
601 object *v;
602{
603 return reload_module(v);
604}
605
606static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +0000607builtin_repr(self, v)
608 object *self;
609 object *v;
610{
611 if (v == NULL) {
612 err_badarg();
613 return NULL;
614 }
615 return reprobject(v);
616}
617
618static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000619builtin_round(self, args)
620 object *self;
621 object *args;
622{
623 extern double floor PROTO((double));
624 extern double ceil PROTO((double));
625 double x;
626 double f;
627 int ndigits = 0;
628 int sign = 1;
629 int i;
630 if (!getargs(args, "d", &x)) {
631 err_clear();
632 if (!getargs(args, "(di)", &x, &ndigits))
633 return NULL;
634 }
635 f = 1.0;
636 for (i = ndigits; --i >= 0; )
637 f = f*10.0;
638 for (i = ndigits; ++i <= 0; )
639 f = f*0.1;
640 if (x >= 0.0)
641 return newfloatobject(floor(x*f + 0.5) / f);
642 else
643 return newfloatobject(ceil(x*f - 0.5) / f);
644}
645
646static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +0000647builtin_str(self, v)
648 object *self;
649 object *v;
650{
651 if (v == NULL) {
652 err_badarg();
653 return NULL;
654 }
655 if (is_stringobject(v)) {
656 INCREF(v);
657 return v;
658 }
659 else
660 return reprobject(v);
661}
662
663static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000664builtin_type(self, v)
665 object *self;
666 object *v;
667{
668 if (v == NULL) {
Guido van Rossumc89705d1992-11-26 08:54:07 +0000669 err_setstr(TypeError, "type() requires an argument");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000670 return NULL;
671 }
672 v = (object *)v->ob_type;
673 INCREF(v);
674 return v;
675}
676
677static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000678 {"abs", builtin_abs},
679 {"apply", builtin_apply},
680 {"chr", builtin_chr},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000681 {"cmp", builtin_cmp},
Guido van Rossum04691fc1992-08-12 15:35:34 +0000682 {"coerce", builtin_coerce},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000683 {"dir", builtin_dir},
684 {"divmod", builtin_divmod},
685 {"eval", builtin_eval},
686 {"exec", builtin_exec},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000687 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000688 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000689 {"getattr", builtin_getattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000690 {"hex", builtin_hex},
691 {"input", builtin_input},
692 {"int", builtin_int},
693 {"len", builtin_len},
694 {"long", builtin_long},
695 {"max", builtin_max},
696 {"min", builtin_min},
697 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000698 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000699 {"ord", builtin_ord},
700 {"pow", builtin_pow},
701 {"range", builtin_range},
702 {"raw_input", builtin_raw_input},
703 {"reload", builtin_reload},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000704 {"repr", builtin_repr},
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000705 {"round", builtin_round},
Guido van Rossum33894be1992-01-27 16:53:09 +0000706 {"setattr", builtin_setattr},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000707 {"str", builtin_str},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000708 {"type", builtin_type},
709 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000710};
711
712static object *builtin_dict;
713
714object *
715getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000716 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000717{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000718 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000719}
720
721/* Predefined exceptions */
722
Guido van Rossumfb905c31991-12-16 15:42:38 +0000723object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000724object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000725object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000726object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000727object *IndexError;
728object *KeyError;
729object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000730object *MemoryError;
731object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000732object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000733object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000734object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000735object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000736object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000737object *TypeError;
738object *ValueError;
739object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000740
Guido van Rossum3f5da241990-12-20 15:06:42 +0000741static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000742newstdexception(name)
743 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000744{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000745 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000746 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
747 fatal("no mem for new standard exception");
748 return v;
749}
750
751static void
752initerrors()
753{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000754 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000755 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000756 IOError = newstdexception("IOError");
757 ImportError = newstdexception("ImportError");
758 IndexError = newstdexception("IndexError");
759 KeyError = newstdexception("KeyError");
760 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000761 MemoryError = newstdexception("MemoryError");
762 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000763 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000764 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000765 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000766 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000767 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000768 TypeError = newstdexception("TypeError");
769 ValueError = newstdexception("ValueError");
770 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000771}
772
773void
774initbuiltin()
775{
776 object *m;
777 m = initmodule("builtin", builtin_methods);
778 builtin_dict = getmoduledict(m);
779 INCREF(builtin_dict);
780 initerrors();
781 (void) dictinsert(builtin_dict, "None", None);
782}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000783
784/* Coerce two numeric types to the "larger" one.
785 Increment the reference count on each argument.
786 Return -1 and raise an exception if no coercion is possible
787 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +0000788*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000789
790int
791coerce(pv, pw)
792 object **pv, **pw;
793{
794 register object *v = *pv;
795 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000796 int res;
797
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000798 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000799 INCREF(v);
800 INCREF(w);
801 return 0;
802 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000803 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
804 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
805 if (res <= 0)
806 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000807 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000808 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
809 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
810 if (res <= 0)
811 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000812 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000813 err_setstr(TypeError, "number coercion failed");
814 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000815}