blob: 60208a0d47c49f01e6dd5e5c6766d1ca692c79c3 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossume5372401993-03-16 12:15:04 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum3f5da241990-12-20 15:06:42 +000025/* Built-in functions */
26
27#include "allobjects.h"
28
29#include "node.h"
30#include "graminit.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000031#include "sysmodule.h"
Guido van Rossum86cd6e61991-01-21 15:12:35 +000032#include "bltinmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000033#include "import.h"
34#include "pythonrun.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035#include "ceval.h"
36#include "modsupport.h"
Guido van Rossum5b722181993-03-30 17:46:03 +000037#include "compile.h"
38#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000039
40static object *
41builtin_abs(self, v)
42 object *self;
43 object *v;
44{
Guido van Rossumd4905451991-05-05 20:00:36 +000045 number_methods *nm;
46 if (v == NULL || (nm = v->ob_type->tp_as_number) == NULL) {
47 err_setstr(TypeError, "abs() requires numeric argument");
48 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000049 }
Guido van Rossumd4905451991-05-05 20:00:36 +000050 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000051}
52
53static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000054builtin_apply(self, args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000055 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000056 object *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000057{
Guido van Rossum94390a41992-08-14 15:14:30 +000058 object *func, *arglist;
59 if (!getargs(args, "(OO)", &func, &arglist))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000060 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +000061 return call_object(func, arglist);
Guido van Rossumc02e15c1991-12-16 13:03:00 +000062}
63
64static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000065builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000066 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000067 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000068{
69 long x;
70 char s[1];
Guido van Rossum94390a41992-08-14 15:14:30 +000071 if (!getargs(args, "l", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +000072 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000073 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +000074 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +000075 return NULL;
76 }
77 s[0] = x;
78 return newsizedstringobject(s, 1);
79}
80
81static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000082builtin_cmp(self, args)
83 object *self;
84 object *args;
85{
86 object *a, *b;
87 if (!getargs(args, "(OO)", &a, &b))
88 return NULL;
89 return newintobject((long)cmpobject(a, b));
90}
91
92static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +000093builtin_coerce(self, args)
94 object *self;
95 object *args;
96{
97 object *v, *w;
98 object *res;
99
100 if (!getargs(args, "(OO)", &v, &w))
101 return NULL;
102 if (coerce(&v, &w) < 0)
103 return NULL;
104 res = mkvalue("(OO)", v, w);
105 DECREF(v);
106 DECREF(w);
107 return res;
108}
109
110static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000111builtin_compile(self, args)
112 object *self;
113 object *args;
114{
115 char *str;
116 char *filename;
117 char *startstr;
118 int start;
119 if (!getargs(args, "(sss)", &str, &filename, &startstr))
120 return NULL;
121 if (strcmp(startstr, "exec") == 0)
122 start = file_input;
123 else if (strcmp(startstr, "eval") == 0)
124 start = eval_input;
125 else {
126 err_setstr(ValueError,
127 "compile() mode must be 'exec' or 'eval'");
128 return NULL;
129 }
130 return compile_string(str, filename, start);
131}
132
133static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000134builtin_dir(self, v)
135 object *self;
136 object *v;
137{
138 object *d;
139 if (v == NULL) {
140 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000141 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000142 }
143 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000144 d = getattr(v, "__dict__");
145 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000146 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000147 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000148 return NULL;
149 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000150 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000151 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000152 v = getdictkeys(d);
153 if (sortlist(v) != 0) {
154 DECREF(v);
155 v = NULL;
156 }
157 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000158 else {
159 v = newlistobject(0);
160 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000161 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000162 return v;
163}
164
165static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000166builtin_divmod(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000167 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000168 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000169{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000170 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000171 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000172 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000173 if (v->ob_type->tp_as_number == NULL ||
174 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000175 err_setstr(TypeError, "divmod() requires numeric arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000176 return NULL;
177 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000178 if (coerce(&v, &w) != 0)
179 return NULL;
180 x = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
181 DECREF(v);
182 DECREF(w);
183 return x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000184}
185
186static object *
187exec_eval(v, start)
188 object *v;
189 int start;
190{
191 object *str = NULL, *globals = NULL, *locals = NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000192 char *s;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000193 int n;
194 if (v != NULL) {
Guido van Rossum5b722181993-03-30 17:46:03 +0000195 if (is_tupleobject(v) &&
Guido van Rossum3f5da241990-12-20 15:06:42 +0000196 ((n = gettuplesize(v)) == 2 || n == 3)) {
197 str = gettupleitem(v, 0);
198 globals = gettupleitem(v, 1);
199 if (n == 3)
200 locals = gettupleitem(v, 2);
201 }
Guido van Rossum5b722181993-03-30 17:46:03 +0000202 else
203 str = v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000204 }
Guido van Rossum5b722181993-03-30 17:46:03 +0000205 if (str == NULL || (!is_stringobject(str) && !is_codeobject(str)) ||
Guido van Rossum3f5da241990-12-20 15:06:42 +0000206 globals != NULL && !is_dictobject(globals) ||
207 locals != NULL && !is_dictobject(locals)) {
208 err_setstr(TypeError,
Guido van Rossum5b722181993-03-30 17:46:03 +0000209 "exec/eval arguments must be (string|code)[,dict[,dict]]");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000210 return NULL;
211 }
Guido van Rossum5b722181993-03-30 17:46:03 +0000212 if (is_codeobject(str))
213 return eval_code((codeobject *) str, globals, locals,
Guido van Rossum81daa321993-05-20 14:24:46 +0000214 (object *)NULL, (object *)NULL);
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000215 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000216 if (strlen(s) != getstringsize(str)) {
217 err_setstr(ValueError, "embedded '\\0' in string arg");
218 return NULL;
219 }
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000220 if (start == eval_input) {
221 while (*s == ' ' || *s == '\t')
222 s++;
223 }
224 return run_string(s, start, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000225}
226
227static object *
228builtin_eval(self, v)
229 object *self;
230 object *v;
231{
232 return exec_eval(v, eval_input);
233}
234
235static object *
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000236builtin_execfile(self, v)
237 object *self;
238 object *v;
239{
240 object *str = NULL, *globals = NULL, *locals = NULL, *w;
241 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000242 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000243 int n;
244 if (v != NULL) {
245 if (is_stringobject(v))
246 str = v;
247 else if (is_tupleobject(v) &&
248 ((n = gettuplesize(v)) == 2 || n == 3)) {
249 str = gettupleitem(v, 0);
250 globals = gettupleitem(v, 1);
251 if (n == 3)
252 locals = gettupleitem(v, 2);
253 }
254 }
255 if (str == NULL || !is_stringobject(str) ||
256 globals != NULL && !is_dictobject(globals) ||
257 locals != NULL && !is_dictobject(locals)) {
258 err_setstr(TypeError,
259 "execfile arguments must be filename[,dict[,dict]]");
260 return NULL;
261 }
Guido van Rossum2b81dc91992-08-19 16:40:53 +0000262 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000263 if (strlen(s) != getstringsize(str)) {
264 err_setstr(ValueError, "embedded '\\0' in string arg");
265 return NULL;
266 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000267 BGN_SAVE
Guido van Rossum94390a41992-08-14 15:14:30 +0000268 fp = fopen(s, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000269 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000270 if (fp == NULL) {
271 err_setstr(IOError, "execfile cannot open the file argument");
272 return NULL;
273 }
274 w = run_file(fp, getstringvalue(str), file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000275 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000276 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000277 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000278 return w;
279}
280
281static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000282builtin_float(self, v)
283 object *self;
284 object *v;
285{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000286 number_methods *nb;
287
288 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
289 nb->nb_float == NULL) {
290 err_setstr(TypeError,
291 "float() argument can't be converted to float");
292 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000293 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000294 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000295}
296
297static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000298builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000299 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000300 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000301{
Guido van Rossum94390a41992-08-14 15:14:30 +0000302 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000303 object *name;
304 if (!getargs(args, "(OS)", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000305 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000306 return getattro(v, name);
307}
308
309static object *
310builtin_hasattr(self, args)
311 object *self;
312 object *args;
313{
314 object *v;
315 object *name;
316 if (!getargs(args, "(OS)", &v, &name))
317 return NULL;
318 v = getattro(v, name);
319 if (v == NULL) {
320 err_clear();
321 return newintobject(0L);
322 }
323 DECREF(v);
324 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000325}
326
327static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000328builtin_id(self, args)
329 object *self;
330 object *args;
331{
332 object *v;
333 if (!getargs(args, "O", &v))
334 return NULL;
335 return newintobject((long)v);
336}
337
338static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000339builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000340 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000341 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000342{
Guido van Rossum94390a41992-08-14 15:14:30 +0000343 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000344 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000345 object *value;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000346 if (!getargs(args, "(OSO)", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000347 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000348 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000349 return NULL;
350 INCREF(None);
351 return None;
352}
353
354static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000355builtin_hash(self, args)
356 object *self;
357 object *args;
358{
359 object *v;
360 long x;
361 if (!getargs(args, "O", &v))
362 return NULL;
363 x = hashobject(v);
364 if (x == -1)
365 return NULL;
366 return newintobject(x);
367}
368
369static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000370builtin_hex(self, v)
371 object *self;
372 object *v;
373{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000374 number_methods *nb;
375
376 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
377 nb->nb_hex == NULL) {
378 err_setstr(TypeError,
379 "hex() argument can't be converted to hex");
380 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000381 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000382 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000383}
384
Guido van Rossum3165fe61992-09-25 21:59:05 +0000385static object *builtin_raw_input PROTO((object *, object *));
386
Guido van Rossum006bcd41991-10-24 14:54:44 +0000387static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000388builtin_input(self, v)
389 object *self;
390 object *v;
391{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000392 object *line = builtin_raw_input(self, v);
393 if (line == NULL)
394 return line;
395 v = exec_eval(line, eval_input);
396 DECREF(line);
397 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000398}
399
400static object *
401builtin_int(self, v)
402 object *self;
403 object *v;
404{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000405 number_methods *nb;
406
407 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
408 nb->nb_int == NULL) {
409 err_setstr(TypeError,
410 "int() argument can't be converted to int");
411 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000412 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000413 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000414}
415
416static object *
417builtin_len(self, v)
418 object *self;
419 object *v;
420{
421 long len;
422 typeobject *tp;
423 if (v == NULL) {
424 err_setstr(TypeError, "len() without argument");
425 return NULL;
426 }
427 tp = v->ob_type;
428 if (tp->tp_as_sequence != NULL) {
429 len = (*tp->tp_as_sequence->sq_length)(v);
430 }
431 else if (tp->tp_as_mapping != NULL) {
432 len = (*tp->tp_as_mapping->mp_length)(v);
433 }
434 else {
435 err_setstr(TypeError, "len() of unsized object");
436 return NULL;
437 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000438 if (len < 0)
439 return NULL;
440 else
441 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000442}
443
444static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000445builtin_long(self, v)
446 object *self;
447 object *v;
448{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000449 number_methods *nb;
450
451 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
452 nb->nb_long == NULL) {
453 err_setstr(TypeError,
454 "long() argument can't be converted to long");
455 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000456 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000457 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000458}
459
460static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000461min_max(v, sign)
462 object *v;
463 int sign;
464{
465 int i, n, cmp;
466 object *w, *x;
467 sequence_methods *sq;
468 if (v == NULL) {
469 err_setstr(TypeError, "min() or max() without argument");
470 return NULL;
471 }
472 sq = v->ob_type->tp_as_sequence;
473 if (sq == NULL) {
474 err_setstr(TypeError, "min() or max() of non-sequence");
475 return NULL;
476 }
477 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000478 if (n < 0)
479 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000480 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000481 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000482 return NULL;
483 }
484 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
485 for (i = 1; i < n; i++) {
486 x = (*sq->sq_item)(v, i); /* Implies INCREF */
487 cmp = cmpobject(x, w);
488 if (cmp * sign > 0) {
489 DECREF(w);
490 w = x;
491 }
492 else
493 DECREF(x);
494 }
495 return w;
496}
497
498static object *
499builtin_min(self, v)
500 object *self;
501 object *v;
502{
503 return min_max(v, -1);
504}
505
506static object *
507builtin_max(self, v)
508 object *self;
509 object *v;
510{
511 return min_max(v, 1);
512}
513
514static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000515builtin_oct(self, v)
516 object *self;
517 object *v;
518{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000519 number_methods *nb;
520
521 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
522 nb->nb_oct == NULL) {
523 err_setstr(TypeError,
524 "oct() argument can't be converted to oct");
525 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000526 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000527 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000528}
529
530static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000531builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000532 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000533 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000534{
Guido van Rossum94390a41992-08-14 15:14:30 +0000535 char *name, *mode;
536 if (!getargs(args, "(ss)", &name, &mode))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000537 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000538 return newfileobject(name, mode);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000539}
540
541static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000542builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000543 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000544 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000545{
Guido van Rossum94390a41992-08-14 15:14:30 +0000546 char *s;
547 int len;
548 if (!getargs(args, "s#", &s, &len))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000549 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000550 if (len != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000551 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000552 return NULL;
553 }
Guido van Rossum94390a41992-08-14 15:14:30 +0000554 return newintobject((long)(s[0] & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000555}
556
557static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000558builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000559 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000560 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000561{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000562 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000563 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossumd4905451991-05-05 20:00:36 +0000564 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000565 if (v->ob_type->tp_as_number == NULL ||
566 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000567 err_setstr(TypeError, "pow() requires numeric arguments");
568 return NULL;
569 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000570 if (coerce(&v, &w) != 0)
571 return NULL;
572 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
573 DECREF(v);
574 DECREF(w);
575 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000576}
577
578static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000579builtin_range(self, v)
580 object *self;
581 object *v;
582{
583 static char *errmsg = "range() requires 1-3 int arguments";
584 int i, n;
585 long ilow, ihigh, istep;
586 if (v != NULL && is_intobject(v)) {
587 ilow = 0; ihigh = getintvalue(v); istep = 1;
588 }
589 else if (v == NULL || !is_tupleobject(v)) {
590 err_setstr(TypeError, errmsg);
591 return NULL;
592 }
593 else {
594 n = gettuplesize(v);
595 if (n < 1 || n > 3) {
596 err_setstr(TypeError, errmsg);
597 return NULL;
598 }
599 for (i = 0; i < n; i++) {
600 if (!is_intobject(gettupleitem(v, i))) {
601 err_setstr(TypeError, errmsg);
602 return NULL;
603 }
604 }
605 if (n == 3) {
606 istep = getintvalue(gettupleitem(v, 2));
607 --n;
608 }
609 else
610 istep = 1;
611 ihigh = getintvalue(gettupleitem(v, --n));
612 if (n > 0)
613 ilow = getintvalue(gettupleitem(v, 0));
614 else
615 ilow = 0;
616 }
617 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000618 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000619 return NULL;
620 }
621 /* XXX ought to check overflow of subtraction */
622 if (istep > 0)
623 n = (ihigh - ilow + istep - 1) / istep;
624 else
625 n = (ihigh - ilow + istep + 1) / istep;
626 if (n < 0)
627 n = 0;
628 v = newlistobject(n);
629 if (v == NULL)
630 return NULL;
631 for (i = 0; i < n; i++) {
632 object *w = newintobject(ilow);
633 if (w == NULL) {
634 DECREF(v);
635 return NULL;
636 }
637 setlistitem(v, i, w);
638 ilow += istep;
639 }
640 return v;
641}
642
643static object *
644builtin_raw_input(self, v)
645 object *self;
646 object *v;
647{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000648 object *f = sysget("stdout");
649 if (f == NULL) {
650 err_setstr(RuntimeError, "lost sys.stdout");
651 return NULL;
652 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000653 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000654 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000655 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +0000656 return NULL;
657 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000658 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000659}
660
661static object *
662builtin_reload(self, v)
663 object *self;
664 object *v;
665{
666 return reload_module(v);
667}
668
669static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +0000670builtin_repr(self, v)
671 object *self;
672 object *v;
673{
674 if (v == NULL) {
675 err_badarg();
676 return NULL;
677 }
678 return reprobject(v);
679}
680
681static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000682builtin_round(self, args)
683 object *self;
684 object *args;
685{
686 extern double floor PROTO((double));
687 extern double ceil PROTO((double));
688 double x;
689 double f;
690 int ndigits = 0;
691 int sign = 1;
692 int i;
693 if (!getargs(args, "d", &x)) {
694 err_clear();
695 if (!getargs(args, "(di)", &x, &ndigits))
696 return NULL;
697 }
698 f = 1.0;
699 for (i = ndigits; --i >= 0; )
700 f = f*10.0;
701 for (i = ndigits; ++i <= 0; )
702 f = f*0.1;
703 if (x >= 0.0)
704 return newfloatobject(floor(x*f + 0.5) / f);
705 else
706 return newfloatobject(ceil(x*f - 0.5) / f);
707}
708
709static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +0000710builtin_str(self, v)
711 object *self;
712 object *v;
713{
714 if (v == NULL) {
715 err_badarg();
716 return NULL;
717 }
718 if (is_stringobject(v)) {
719 INCREF(v);
720 return v;
721 }
722 else
723 return reprobject(v);
724}
725
726static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000727builtin_type(self, v)
728 object *self;
729 object *v;
730{
731 if (v == NULL) {
Guido van Rossumc89705d1992-11-26 08:54:07 +0000732 err_setstr(TypeError, "type() requires an argument");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000733 return NULL;
734 }
735 v = (object *)v->ob_type;
736 INCREF(v);
737 return v;
738}
739
740static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000741 {"abs", builtin_abs},
742 {"apply", builtin_apply},
743 {"chr", builtin_chr},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000744 {"cmp", builtin_cmp},
Guido van Rossum04691fc1992-08-12 15:35:34 +0000745 {"coerce", builtin_coerce},
Guido van Rossum5b722181993-03-30 17:46:03 +0000746 {"compile", builtin_compile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000747 {"dir", builtin_dir},
748 {"divmod", builtin_divmod},
749 {"eval", builtin_eval},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000750 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000751 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000752 {"getattr", builtin_getattr},
Guido van Rossum9bfef441993-03-29 10:43:31 +0000753 {"hasattr", builtin_hasattr},
754 {"hash", builtin_hash},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000755 {"hex", builtin_hex},
Guido van Rossum5b722181993-03-30 17:46:03 +0000756 {"id", builtin_id},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000757 {"input", builtin_input},
758 {"int", builtin_int},
759 {"len", builtin_len},
760 {"long", builtin_long},
761 {"max", builtin_max},
762 {"min", builtin_min},
763 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000764 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000765 {"ord", builtin_ord},
766 {"pow", builtin_pow},
767 {"range", builtin_range},
768 {"raw_input", builtin_raw_input},
769 {"reload", builtin_reload},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000770 {"repr", builtin_repr},
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000771 {"round", builtin_round},
Guido van Rossum33894be1992-01-27 16:53:09 +0000772 {"setattr", builtin_setattr},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000773 {"str", builtin_str},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000774 {"type", builtin_type},
775 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000776};
777
778static object *builtin_dict;
779
780object *
781getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000782 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000783{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000784 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000785}
786
787/* Predefined exceptions */
788
Guido van Rossum25831651993-05-19 14:50:45 +0000789object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000790object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +0000791object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000792object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000793object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000794object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000795object *IndexError;
796object *KeyError;
797object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000798object *MemoryError;
799object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000800object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000801object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000802object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000803object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000804object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000805object *TypeError;
806object *ValueError;
807object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000808
Guido van Rossum3f5da241990-12-20 15:06:42 +0000809static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000810newstdexception(name)
811 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000812{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000813 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000814 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
815 fatal("no mem for new standard exception");
816 return v;
817}
818
819static void
820initerrors()
821{
Guido van Rossum25831651993-05-19 14:50:45 +0000822 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000823 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +0000824 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000825 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000826 IOError = newstdexception("IOError");
827 ImportError = newstdexception("ImportError");
828 IndexError = newstdexception("IndexError");
829 KeyError = newstdexception("KeyError");
830 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000831 MemoryError = newstdexception("MemoryError");
832 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000833 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000834 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000835 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000836 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000837 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000838 TypeError = newstdexception("TypeError");
839 ValueError = newstdexception("ValueError");
840 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000841}
842
843void
844initbuiltin()
845{
846 object *m;
Guido van Rossum89b33251993-10-22 14:26:06 +0000847 m = initmodule("__builtin__", builtin_methods);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000848 builtin_dict = getmoduledict(m);
849 INCREF(builtin_dict);
850 initerrors();
851 (void) dictinsert(builtin_dict, "None", None);
852}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000853
854/* Coerce two numeric types to the "larger" one.
855 Increment the reference count on each argument.
856 Return -1 and raise an exception if no coercion is possible
857 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +0000858*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000859
860int
861coerce(pv, pw)
862 object **pv, **pw;
863{
864 register object *v = *pv;
865 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000866 int res;
867
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000868 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000869 INCREF(v);
870 INCREF(w);
871 return 0;
872 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000873 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
874 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
875 if (res <= 0)
876 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000877 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000878 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
879 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
880 if (res <= 0)
881 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000882 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000883 err_setstr(TypeError, "number coercion failed");
884 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000885}