blob: 18fae5ca75e3f3b3a6e8fa49ec8fa2878997436c [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 *
605builtin_type(self, v)
606 object *self;
607 object *v;
608{
609 if (v == NULL) {
610 err_setstr(TypeError, "type() requres an argument");
611 return NULL;
612 }
613 v = (object *)v->ob_type;
614 INCREF(v);
615 return v;
616}
617
618static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000619 {"abs", builtin_abs},
620 {"apply", builtin_apply},
621 {"chr", builtin_chr},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000622 {"cmp", builtin_cmp},
Guido van Rossum04691fc1992-08-12 15:35:34 +0000623 {"coerce", builtin_coerce},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000624 {"dir", builtin_dir},
625 {"divmod", builtin_divmod},
626 {"eval", builtin_eval},
627 {"exec", builtin_exec},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000628 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000629 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000630 {"getattr", builtin_getattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000631 {"hex", builtin_hex},
632 {"input", builtin_input},
633 {"int", builtin_int},
634 {"len", builtin_len},
635 {"long", builtin_long},
636 {"max", builtin_max},
637 {"min", builtin_min},
638 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000639 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000640 {"ord", builtin_ord},
641 {"pow", builtin_pow},
642 {"range", builtin_range},
643 {"raw_input", builtin_raw_input},
644 {"reload", builtin_reload},
Guido van Rossum33894be1992-01-27 16:53:09 +0000645 {"setattr", builtin_setattr},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000646 {"type", builtin_type},
647 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000648};
649
650static object *builtin_dict;
651
652object *
653getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000654 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000655{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000656 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000657}
658
659/* Predefined exceptions */
660
Guido van Rossumfb905c31991-12-16 15:42:38 +0000661object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000662object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000663object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000664object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000665object *IndexError;
666object *KeyError;
667object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000668object *MemoryError;
669object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000670object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000671object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000672object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000673object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000674object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000675object *TypeError;
676object *ValueError;
677object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000678
Guido van Rossum3f5da241990-12-20 15:06:42 +0000679static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000680newstdexception(name)
681 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000682{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000683 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000684 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
685 fatal("no mem for new standard exception");
686 return v;
687}
688
689static void
690initerrors()
691{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000692 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000693 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000694 IOError = newstdexception("IOError");
695 ImportError = newstdexception("ImportError");
696 IndexError = newstdexception("IndexError");
697 KeyError = newstdexception("KeyError");
698 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000699 MemoryError = newstdexception("MemoryError");
700 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000701 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000702 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000703 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000704 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000705 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000706 TypeError = newstdexception("TypeError");
707 ValueError = newstdexception("ValueError");
708 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000709}
710
711void
712initbuiltin()
713{
714 object *m;
715 m = initmodule("builtin", builtin_methods);
716 builtin_dict = getmoduledict(m);
717 INCREF(builtin_dict);
718 initerrors();
719 (void) dictinsert(builtin_dict, "None", None);
720}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000721
722/* Coerce two numeric types to the "larger" one.
723 Increment the reference count on each argument.
724 Return -1 and raise an exception if no coercion is possible
725 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +0000726*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000727
728int
729coerce(pv, pw)
730 object **pv, **pw;
731{
732 register object *v = *pv;
733 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000734 int res;
735
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000736 if (v->ob_type == w->ob_type) {
737 INCREF(v);
738 INCREF(w);
739 return 0;
740 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000741 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
742 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
743 if (res <= 0)
744 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000745 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000746 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
747 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
748 if (res <= 0)
749 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000750 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000751 err_setstr(TypeError, "number coercion failed");
752 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000753}