blob: a6e02bed2d6b6a7d2c18537bfc578618a7d86e01 [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);
415 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000416 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000417 return NULL;
418 }
419 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
420 for (i = 1; i < n; i++) {
421 x = (*sq->sq_item)(v, i); /* Implies INCREF */
422 cmp = cmpobject(x, w);
423 if (cmp * sign > 0) {
424 DECREF(w);
425 w = x;
426 }
427 else
428 DECREF(x);
429 }
430 return w;
431}
432
433static object *
434builtin_min(self, v)
435 object *self;
436 object *v;
437{
438 return min_max(v, -1);
439}
440
441static object *
442builtin_max(self, v)
443 object *self;
444 object *v;
445{
446 return min_max(v, 1);
447}
448
449static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000450builtin_oct(self, v)
451 object *self;
452 object *v;
453{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000454 number_methods *nb;
455
456 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
457 nb->nb_oct == NULL) {
458 err_setstr(TypeError,
459 "oct() argument can't be converted to oct");
460 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000461 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000462 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000463}
464
465static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000466builtin_open(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 *name, *mode;
471 if (!getargs(args, "(ss)", &name, &mode))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000472 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000473 return newfileobject(name, mode);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000474}
475
476static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000477builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000478 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000479 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000480{
Guido van Rossum94390a41992-08-14 15:14:30 +0000481 char *s;
482 int len;
483 if (!getargs(args, "s#", &s, &len))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000484 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000485 if (len != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000486 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000487 return NULL;
488 }
Guido van Rossum94390a41992-08-14 15:14:30 +0000489 return newintobject((long)(s[0] & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000490}
491
492static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000493builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000494 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000495 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000496{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000497 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000498 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossumd4905451991-05-05 20:00:36 +0000499 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000500 if (v->ob_type->tp_as_number == NULL ||
501 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000502 err_setstr(TypeError, "pow() requires numeric arguments");
503 return NULL;
504 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000505 if (coerce(&v, &w) != 0)
506 return NULL;
507 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
508 DECREF(v);
509 DECREF(w);
510 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000511}
512
513static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000514builtin_range(self, v)
515 object *self;
516 object *v;
517{
518 static char *errmsg = "range() requires 1-3 int arguments";
519 int i, n;
520 long ilow, ihigh, istep;
521 if (v != NULL && is_intobject(v)) {
522 ilow = 0; ihigh = getintvalue(v); istep = 1;
523 }
524 else if (v == NULL || !is_tupleobject(v)) {
525 err_setstr(TypeError, errmsg);
526 return NULL;
527 }
528 else {
529 n = gettuplesize(v);
530 if (n < 1 || n > 3) {
531 err_setstr(TypeError, errmsg);
532 return NULL;
533 }
534 for (i = 0; i < n; i++) {
535 if (!is_intobject(gettupleitem(v, i))) {
536 err_setstr(TypeError, errmsg);
537 return NULL;
538 }
539 }
540 if (n == 3) {
541 istep = getintvalue(gettupleitem(v, 2));
542 --n;
543 }
544 else
545 istep = 1;
546 ihigh = getintvalue(gettupleitem(v, --n));
547 if (n > 0)
548 ilow = getintvalue(gettupleitem(v, 0));
549 else
550 ilow = 0;
551 }
552 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000553 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000554 return NULL;
555 }
556 /* XXX ought to check overflow of subtraction */
557 if (istep > 0)
558 n = (ihigh - ilow + istep - 1) / istep;
559 else
560 n = (ihigh - ilow + istep + 1) / istep;
561 if (n < 0)
562 n = 0;
563 v = newlistobject(n);
564 if (v == NULL)
565 return NULL;
566 for (i = 0; i < n; i++) {
567 object *w = newintobject(ilow);
568 if (w == NULL) {
569 DECREF(v);
570 return NULL;
571 }
572 setlistitem(v, i, w);
573 ilow += istep;
574 }
575 return v;
576}
577
578static object *
579builtin_raw_input(self, v)
580 object *self;
581 object *v;
582{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000583 object *f = sysget("stdout");
584 if (f == NULL) {
585 err_setstr(RuntimeError, "lost sys.stdout");
586 return NULL;
587 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000588 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000589 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000590 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +0000591 return NULL;
592 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000593 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000594}
595
596static object *
597builtin_reload(self, v)
598 object *self;
599 object *v;
600{
601 return reload_module(v);
602}
603
604static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +0000605builtin_repr(self, v)
606 object *self;
607 object *v;
608{
609 if (v == NULL) {
610 err_badarg();
611 return NULL;
612 }
613 return reprobject(v);
614}
615
616static object *
617builtin_str(self, v)
618 object *self;
619 object *v;
620{
621 if (v == NULL) {
622 err_badarg();
623 return NULL;
624 }
625 if (is_stringobject(v)) {
626 INCREF(v);
627 return v;
628 }
629 else
630 return reprobject(v);
631}
632
633static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000634builtin_type(self, v)
635 object *self;
636 object *v;
637{
638 if (v == NULL) {
Guido van Rossumc89705d1992-11-26 08:54:07 +0000639 err_setstr(TypeError, "type() requires an argument");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000640 return NULL;
641 }
642 v = (object *)v->ob_type;
643 INCREF(v);
644 return v;
645}
646
647static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000648 {"abs", builtin_abs},
649 {"apply", builtin_apply},
650 {"chr", builtin_chr},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000651 {"cmp", builtin_cmp},
Guido van Rossum04691fc1992-08-12 15:35:34 +0000652 {"coerce", builtin_coerce},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000653 {"dir", builtin_dir},
654 {"divmod", builtin_divmod},
655 {"eval", builtin_eval},
656 {"exec", builtin_exec},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000657 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000658 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000659 {"getattr", builtin_getattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000660 {"hex", builtin_hex},
661 {"input", builtin_input},
662 {"int", builtin_int},
663 {"len", builtin_len},
664 {"long", builtin_long},
665 {"max", builtin_max},
666 {"min", builtin_min},
667 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000668 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000669 {"ord", builtin_ord},
670 {"pow", builtin_pow},
671 {"range", builtin_range},
672 {"raw_input", builtin_raw_input},
673 {"reload", builtin_reload},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000674 {"repr", builtin_repr},
Guido van Rossum33894be1992-01-27 16:53:09 +0000675 {"setattr", builtin_setattr},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000676 {"str", builtin_str},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000677 {"type", builtin_type},
678 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000679};
680
681static object *builtin_dict;
682
683object *
684getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000685 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000686{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000687 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000688}
689
690/* Predefined exceptions */
691
Guido van Rossumfb905c31991-12-16 15:42:38 +0000692object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000693object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000694object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000695object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000696object *IndexError;
697object *KeyError;
698object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000699object *MemoryError;
700object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000701object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000702object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000703object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000704object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000705object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000706object *TypeError;
707object *ValueError;
708object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000709
Guido van Rossum3f5da241990-12-20 15:06:42 +0000710static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000711newstdexception(name)
712 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000713{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000714 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000715 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
716 fatal("no mem for new standard exception");
717 return v;
718}
719
720static void
721initerrors()
722{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000723 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000724 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000725 IOError = newstdexception("IOError");
726 ImportError = newstdexception("ImportError");
727 IndexError = newstdexception("IndexError");
728 KeyError = newstdexception("KeyError");
729 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000730 MemoryError = newstdexception("MemoryError");
731 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000732 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000733 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000734 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000735 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000736 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000737 TypeError = newstdexception("TypeError");
738 ValueError = newstdexception("ValueError");
739 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000740}
741
742void
743initbuiltin()
744{
745 object *m;
746 m = initmodule("builtin", builtin_methods);
747 builtin_dict = getmoduledict(m);
748 INCREF(builtin_dict);
749 initerrors();
750 (void) dictinsert(builtin_dict, "None", None);
751}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000752
753/* Coerce two numeric types to the "larger" one.
754 Increment the reference count on each argument.
755 Return -1 and raise an exception if no coercion is possible
756 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +0000757*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000758
759int
760coerce(pv, pw)
761 object **pv, **pw;
762{
763 register object *v = *pv;
764 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000765 int res;
766
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000767 if (v->ob_type == w->ob_type) {
768 INCREF(v);
769 INCREF(w);
770 return 0;
771 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000772 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
773 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
774 if (res <= 0)
775 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000776 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000777 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
778 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
779 if (res <= 0)
780 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000781 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000782 err_setstr(TypeError, "number coercion failed");
783 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000784}