blob: 9ba07af3a42752eaabbc0865edbb11d79338ae43 [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{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000256 number_methods *nb;
257
258 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
259 nb->nb_float == NULL) {
260 err_setstr(TypeError,
261 "float() argument can't be converted to float");
262 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000263 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000264 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000265}
266
267static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000268builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000269 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000270 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000271{
Guido van Rossum94390a41992-08-14 15:14:30 +0000272 object *v;
273 char *name;
274 if (!getargs(args, "(Os)", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000275 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000276 return getattr(v, name);
Guido van Rossum33894be1992-01-27 16:53:09 +0000277}
278
279static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000280builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000281 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000282 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000283{
Guido van Rossum94390a41992-08-14 15:14:30 +0000284 object *v;
285 char *name;
286 object *value;
287 if (!getargs(args, "(OsO)", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000288 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000289 if (setattr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000290 return NULL;
291 INCREF(None);
292 return None;
293}
294
295static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000296builtin_hex(self, v)
297 object *self;
298 object *v;
299{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000300 number_methods *nb;
301
302 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
303 nb->nb_hex == NULL) {
304 err_setstr(TypeError,
305 "hex() argument can't be converted to hex");
306 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000307 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000308 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000309}
310
Guido van Rossum3165fe61992-09-25 21:59:05 +0000311static object *builtin_raw_input PROTO((object *, object *));
312
Guido van Rossum006bcd41991-10-24 14:54:44 +0000313static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000314builtin_input(self, v)
315 object *self;
316 object *v;
317{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000318 object *line = builtin_raw_input(self, v);
319 if (line == NULL)
320 return line;
321 v = exec_eval(line, eval_input);
322 DECREF(line);
323 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000324}
325
326static object *
327builtin_int(self, v)
328 object *self;
329 object *v;
330{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000331 number_methods *nb;
332
333 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
334 nb->nb_int == NULL) {
335 err_setstr(TypeError,
336 "int() argument can't be converted to int");
337 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000338 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000339 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000340}
341
342static object *
343builtin_len(self, v)
344 object *self;
345 object *v;
346{
347 long len;
348 typeobject *tp;
349 if (v == NULL) {
350 err_setstr(TypeError, "len() without argument");
351 return NULL;
352 }
353 tp = v->ob_type;
354 if (tp->tp_as_sequence != NULL) {
355 len = (*tp->tp_as_sequence->sq_length)(v);
356 }
357 else if (tp->tp_as_mapping != NULL) {
358 len = (*tp->tp_as_mapping->mp_length)(v);
359 }
360 else {
361 err_setstr(TypeError, "len() of unsized object");
362 return NULL;
363 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000364 if (len < 0)
365 return NULL;
366 else
367 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000368}
369
370static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000371builtin_long(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_long == NULL) {
379 err_setstr(TypeError,
380 "long() argument can't be converted to long");
381 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000382 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000383 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000384}
385
386static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000387min_max(v, sign)
388 object *v;
389 int sign;
390{
391 int i, n, cmp;
392 object *w, *x;
393 sequence_methods *sq;
394 if (v == NULL) {
395 err_setstr(TypeError, "min() or max() without argument");
396 return NULL;
397 }
398 sq = v->ob_type->tp_as_sequence;
399 if (sq == NULL) {
400 err_setstr(TypeError, "min() or max() of non-sequence");
401 return NULL;
402 }
403 n = (*sq->sq_length)(v);
404 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000405 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000406 return NULL;
407 }
408 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
409 for (i = 1; i < n; i++) {
410 x = (*sq->sq_item)(v, i); /* Implies INCREF */
411 cmp = cmpobject(x, w);
412 if (cmp * sign > 0) {
413 DECREF(w);
414 w = x;
415 }
416 else
417 DECREF(x);
418 }
419 return w;
420}
421
422static object *
423builtin_min(self, v)
424 object *self;
425 object *v;
426{
427 return min_max(v, -1);
428}
429
430static object *
431builtin_max(self, v)
432 object *self;
433 object *v;
434{
435 return min_max(v, 1);
436}
437
438static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000439builtin_oct(self, v)
440 object *self;
441 object *v;
442{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000443 number_methods *nb;
444
445 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
446 nb->nb_oct == NULL) {
447 err_setstr(TypeError,
448 "oct() argument can't be converted to oct");
449 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000450 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000451 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000452}
453
454static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000455builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000456 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000457 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000458{
Guido van Rossum94390a41992-08-14 15:14:30 +0000459 char *name, *mode;
460 if (!getargs(args, "(ss)", &name, &mode))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000461 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000462 return newfileobject(name, mode);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000463}
464
465static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000466builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000467 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000468 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000469{
Guido van Rossum94390a41992-08-14 15:14:30 +0000470 char *s;
471 int len;
472 if (!getargs(args, "s#", &s, &len))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000473 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000474 if (len != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000475 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000476 return NULL;
477 }
Guido van Rossum94390a41992-08-14 15:14:30 +0000478 return newintobject((long)(s[0] & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000479}
480
481static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000482builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000483 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000484 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000485{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000486 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000487 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossumd4905451991-05-05 20:00:36 +0000488 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000489 if (v->ob_type->tp_as_number == NULL ||
490 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000491 err_setstr(TypeError, "pow() requires numeric arguments");
492 return NULL;
493 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000494 if (coerce(&v, &w) != 0)
495 return NULL;
496 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
497 DECREF(v);
498 DECREF(w);
499 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000500}
501
502static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000503builtin_range(self, v)
504 object *self;
505 object *v;
506{
507 static char *errmsg = "range() requires 1-3 int arguments";
508 int i, n;
509 long ilow, ihigh, istep;
510 if (v != NULL && is_intobject(v)) {
511 ilow = 0; ihigh = getintvalue(v); istep = 1;
512 }
513 else if (v == NULL || !is_tupleobject(v)) {
514 err_setstr(TypeError, errmsg);
515 return NULL;
516 }
517 else {
518 n = gettuplesize(v);
519 if (n < 1 || n > 3) {
520 err_setstr(TypeError, errmsg);
521 return NULL;
522 }
523 for (i = 0; i < n; i++) {
524 if (!is_intobject(gettupleitem(v, i))) {
525 err_setstr(TypeError, errmsg);
526 return NULL;
527 }
528 }
529 if (n == 3) {
530 istep = getintvalue(gettupleitem(v, 2));
531 --n;
532 }
533 else
534 istep = 1;
535 ihigh = getintvalue(gettupleitem(v, --n));
536 if (n > 0)
537 ilow = getintvalue(gettupleitem(v, 0));
538 else
539 ilow = 0;
540 }
541 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000542 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000543 return NULL;
544 }
545 /* XXX ought to check overflow of subtraction */
546 if (istep > 0)
547 n = (ihigh - ilow + istep - 1) / istep;
548 else
549 n = (ihigh - ilow + istep + 1) / istep;
550 if (n < 0)
551 n = 0;
552 v = newlistobject(n);
553 if (v == NULL)
554 return NULL;
555 for (i = 0; i < n; i++) {
556 object *w = newintobject(ilow);
557 if (w == NULL) {
558 DECREF(v);
559 return NULL;
560 }
561 setlistitem(v, i, w);
562 ilow += istep;
563 }
564 return v;
565}
566
567static object *
568builtin_raw_input(self, v)
569 object *self;
570 object *v;
571{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000572 object *f = sysget("stdout");
573 if (f == NULL) {
574 err_setstr(RuntimeError, "lost sys.stdout");
575 return NULL;
576 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000577 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000578 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000579 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +0000580 return NULL;
581 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000582 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000583}
584
585static object *
586builtin_reload(self, v)
587 object *self;
588 object *v;
589{
590 return reload_module(v);
591}
592
593static object *
594builtin_type(self, v)
595 object *self;
596 object *v;
597{
598 if (v == NULL) {
599 err_setstr(TypeError, "type() requres an argument");
600 return NULL;
601 }
602 v = (object *)v->ob_type;
603 INCREF(v);
604 return v;
605}
606
607static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000608 {"abs", builtin_abs},
609 {"apply", builtin_apply},
610 {"chr", builtin_chr},
Guido van Rossum04691fc1992-08-12 15:35:34 +0000611 {"coerce", builtin_coerce},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000612 {"dir", builtin_dir},
613 {"divmod", builtin_divmod},
614 {"eval", builtin_eval},
615 {"exec", builtin_exec},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000616 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000617 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000618 {"getattr", builtin_getattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000619 {"hex", builtin_hex},
620 {"input", builtin_input},
621 {"int", builtin_int},
622 {"len", builtin_len},
623 {"long", builtin_long},
624 {"max", builtin_max},
625 {"min", builtin_min},
626 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000627 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000628 {"ord", builtin_ord},
629 {"pow", builtin_pow},
630 {"range", builtin_range},
631 {"raw_input", builtin_raw_input},
632 {"reload", builtin_reload},
Guido van Rossum33894be1992-01-27 16:53:09 +0000633 {"setattr", builtin_setattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000634 {"type", builtin_type},
635 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000636};
637
638static object *builtin_dict;
639
640object *
641getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000642 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000643{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000644 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000645}
646
647/* Predefined exceptions */
648
Guido van Rossumfb905c31991-12-16 15:42:38 +0000649object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000650object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000651object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000652object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000653object *IndexError;
654object *KeyError;
655object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000656object *MemoryError;
657object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000658object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000659object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000660object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000661object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000662object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000663object *TypeError;
664object *ValueError;
665object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000666
Guido van Rossum3f5da241990-12-20 15:06:42 +0000667static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000668newstdexception(name)
669 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000670{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000671 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000672 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
673 fatal("no mem for new standard exception");
674 return v;
675}
676
677static void
678initerrors()
679{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000680 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000681 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000682 IOError = newstdexception("IOError");
683 ImportError = newstdexception("ImportError");
684 IndexError = newstdexception("IndexError");
685 KeyError = newstdexception("KeyError");
686 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000687 MemoryError = newstdexception("MemoryError");
688 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000689 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000690 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000691 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000692 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000693 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000694 TypeError = newstdexception("TypeError");
695 ValueError = newstdexception("ValueError");
696 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000697}
698
699void
700initbuiltin()
701{
702 object *m;
703 m = initmodule("builtin", builtin_methods);
704 builtin_dict = getmoduledict(m);
705 INCREF(builtin_dict);
706 initerrors();
707 (void) dictinsert(builtin_dict, "None", None);
708}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000709
710/* Coerce two numeric types to the "larger" one.
711 Increment the reference count on each argument.
712 Return -1 and raise an exception if no coercion is possible
713 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +0000714*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000715
716int
717coerce(pv, pw)
718 object **pv, **pw;
719{
720 register object *v = *pv;
721 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000722 int res;
723
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000724 if (v->ob_type == w->ob_type) {
725 INCREF(v);
726 INCREF(w);
727 return 0;
728 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000729 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
730 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
731 if (res <= 0)
732 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000733 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000734 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
735 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
736 if (res <= 0)
737 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000738 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000739 err_setstr(TypeError, "number coercion failed");
740 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000741}