blob: dc65ffb117c32898b7bed16ab46e68dda208e311 [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 *
236builtin_exec(self, v)
237 object *self;
238 object *v;
239{
240 return exec_eval(v, file_input);
241}
242
243static object *
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000244builtin_execfile(self, v)
245 object *self;
246 object *v;
247{
248 object *str = NULL, *globals = NULL, *locals = NULL, *w;
249 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000250 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000251 int n;
252 if (v != NULL) {
253 if (is_stringobject(v))
254 str = v;
255 else if (is_tupleobject(v) &&
256 ((n = gettuplesize(v)) == 2 || n == 3)) {
257 str = gettupleitem(v, 0);
258 globals = gettupleitem(v, 1);
259 if (n == 3)
260 locals = gettupleitem(v, 2);
261 }
262 }
263 if (str == NULL || !is_stringobject(str) ||
264 globals != NULL && !is_dictobject(globals) ||
265 locals != NULL && !is_dictobject(locals)) {
266 err_setstr(TypeError,
267 "execfile arguments must be filename[,dict[,dict]]");
268 return NULL;
269 }
Guido van Rossum2b81dc91992-08-19 16:40:53 +0000270 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000271 if (strlen(s) != getstringsize(str)) {
272 err_setstr(ValueError, "embedded '\\0' in string arg");
273 return NULL;
274 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000275 BGN_SAVE
Guido van Rossum94390a41992-08-14 15:14:30 +0000276 fp = fopen(s, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000277 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000278 if (fp == NULL) {
279 err_setstr(IOError, "execfile cannot open the file argument");
280 return NULL;
281 }
282 w = run_file(fp, getstringvalue(str), file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000283 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000284 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000285 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000286 return w;
287}
288
289static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000290builtin_float(self, v)
291 object *self;
292 object *v;
293{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000294 number_methods *nb;
295
296 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
297 nb->nb_float == NULL) {
298 err_setstr(TypeError,
299 "float() argument can't be converted to float");
300 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000301 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000302 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000303}
304
305static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000306builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000307 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000308 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000309{
Guido van Rossum94390a41992-08-14 15:14:30 +0000310 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000311 object *name;
312 if (!getargs(args, "(OS)", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000313 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000314 return getattro(v, name);
315}
316
317static object *
318builtin_hasattr(self, args)
319 object *self;
320 object *args;
321{
322 object *v;
323 object *name;
324 if (!getargs(args, "(OS)", &v, &name))
325 return NULL;
326 v = getattro(v, name);
327 if (v == NULL) {
328 err_clear();
329 return newintobject(0L);
330 }
331 DECREF(v);
332 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000333}
334
335static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000336builtin_id(self, args)
337 object *self;
338 object *args;
339{
340 object *v;
341 if (!getargs(args, "O", &v))
342 return NULL;
343 return newintobject((long)v);
344}
345
346static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000347builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000348 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000349 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000350{
Guido van Rossum94390a41992-08-14 15:14:30 +0000351 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000352 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000353 object *value;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000354 if (!getargs(args, "(OSO)", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000355 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000356 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000357 return NULL;
358 INCREF(None);
359 return None;
360}
361
362static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000363builtin_hash(self, args)
364 object *self;
365 object *args;
366{
367 object *v;
368 long x;
369 if (!getargs(args, "O", &v))
370 return NULL;
371 x = hashobject(v);
372 if (x == -1)
373 return NULL;
374 return newintobject(x);
375}
376
377static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000378builtin_hex(self, v)
379 object *self;
380 object *v;
381{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000382 number_methods *nb;
383
384 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
385 nb->nb_hex == NULL) {
386 err_setstr(TypeError,
387 "hex() argument can't be converted to hex");
388 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000389 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000390 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000391}
392
Guido van Rossum3165fe61992-09-25 21:59:05 +0000393static object *builtin_raw_input PROTO((object *, object *));
394
Guido van Rossum006bcd41991-10-24 14:54:44 +0000395static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000396builtin_input(self, v)
397 object *self;
398 object *v;
399{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000400 object *line = builtin_raw_input(self, v);
401 if (line == NULL)
402 return line;
403 v = exec_eval(line, eval_input);
404 DECREF(line);
405 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000406}
407
408static object *
409builtin_int(self, v)
410 object *self;
411 object *v;
412{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000413 number_methods *nb;
414
415 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
416 nb->nb_int == NULL) {
417 err_setstr(TypeError,
418 "int() argument can't be converted to int");
419 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000420 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000421 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000422}
423
424static object *
425builtin_len(self, v)
426 object *self;
427 object *v;
428{
429 long len;
430 typeobject *tp;
431 if (v == NULL) {
432 err_setstr(TypeError, "len() without argument");
433 return NULL;
434 }
435 tp = v->ob_type;
436 if (tp->tp_as_sequence != NULL) {
437 len = (*tp->tp_as_sequence->sq_length)(v);
438 }
439 else if (tp->tp_as_mapping != NULL) {
440 len = (*tp->tp_as_mapping->mp_length)(v);
441 }
442 else {
443 err_setstr(TypeError, "len() of unsized object");
444 return NULL;
445 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000446 if (len < 0)
447 return NULL;
448 else
449 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000450}
451
452static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000453builtin_long(self, v)
454 object *self;
455 object *v;
456{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000457 number_methods *nb;
458
459 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
460 nb->nb_long == NULL) {
461 err_setstr(TypeError,
462 "long() argument can't be converted to long");
463 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000464 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000465 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000466}
467
468static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000469min_max(v, sign)
470 object *v;
471 int sign;
472{
473 int i, n, cmp;
474 object *w, *x;
475 sequence_methods *sq;
476 if (v == NULL) {
477 err_setstr(TypeError, "min() or max() without argument");
478 return NULL;
479 }
480 sq = v->ob_type->tp_as_sequence;
481 if (sq == NULL) {
482 err_setstr(TypeError, "min() or max() of non-sequence");
483 return NULL;
484 }
485 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000486 if (n < 0)
487 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000488 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000489 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000490 return NULL;
491 }
492 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
493 for (i = 1; i < n; i++) {
494 x = (*sq->sq_item)(v, i); /* Implies INCREF */
495 cmp = cmpobject(x, w);
496 if (cmp * sign > 0) {
497 DECREF(w);
498 w = x;
499 }
500 else
501 DECREF(x);
502 }
503 return w;
504}
505
506static object *
507builtin_min(self, v)
508 object *self;
509 object *v;
510{
511 return min_max(v, -1);
512}
513
514static object *
515builtin_max(self, v)
516 object *self;
517 object *v;
518{
519 return min_max(v, 1);
520}
521
522static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000523builtin_oct(self, v)
524 object *self;
525 object *v;
526{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000527 number_methods *nb;
528
529 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
530 nb->nb_oct == NULL) {
531 err_setstr(TypeError,
532 "oct() argument can't be converted to oct");
533 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000534 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000535 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000536}
537
538static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000539builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000540 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000541 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000542{
Guido van Rossum94390a41992-08-14 15:14:30 +0000543 char *name, *mode;
544 if (!getargs(args, "(ss)", &name, &mode))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000545 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000546 return newfileobject(name, mode);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000547}
548
549static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000550builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000551 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000552 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000553{
Guido van Rossum94390a41992-08-14 15:14:30 +0000554 char *s;
555 int len;
556 if (!getargs(args, "s#", &s, &len))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000557 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000558 if (len != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000559 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000560 return NULL;
561 }
Guido van Rossum94390a41992-08-14 15:14:30 +0000562 return newintobject((long)(s[0] & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000563}
564
565static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000566builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000567 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000568 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000569{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000570 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000571 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossumd4905451991-05-05 20:00:36 +0000572 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000573 if (v->ob_type->tp_as_number == NULL ||
574 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000575 err_setstr(TypeError, "pow() requires numeric arguments");
576 return NULL;
577 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000578 if (coerce(&v, &w) != 0)
579 return NULL;
580 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
581 DECREF(v);
582 DECREF(w);
583 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000584}
585
586static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000587builtin_range(self, v)
588 object *self;
589 object *v;
590{
591 static char *errmsg = "range() requires 1-3 int arguments";
592 int i, n;
593 long ilow, ihigh, istep;
594 if (v != NULL && is_intobject(v)) {
595 ilow = 0; ihigh = getintvalue(v); istep = 1;
596 }
597 else if (v == NULL || !is_tupleobject(v)) {
598 err_setstr(TypeError, errmsg);
599 return NULL;
600 }
601 else {
602 n = gettuplesize(v);
603 if (n < 1 || n > 3) {
604 err_setstr(TypeError, errmsg);
605 return NULL;
606 }
607 for (i = 0; i < n; i++) {
608 if (!is_intobject(gettupleitem(v, i))) {
609 err_setstr(TypeError, errmsg);
610 return NULL;
611 }
612 }
613 if (n == 3) {
614 istep = getintvalue(gettupleitem(v, 2));
615 --n;
616 }
617 else
618 istep = 1;
619 ihigh = getintvalue(gettupleitem(v, --n));
620 if (n > 0)
621 ilow = getintvalue(gettupleitem(v, 0));
622 else
623 ilow = 0;
624 }
625 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000626 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000627 return NULL;
628 }
629 /* XXX ought to check overflow of subtraction */
630 if (istep > 0)
631 n = (ihigh - ilow + istep - 1) / istep;
632 else
633 n = (ihigh - ilow + istep + 1) / istep;
634 if (n < 0)
635 n = 0;
636 v = newlistobject(n);
637 if (v == NULL)
638 return NULL;
639 for (i = 0; i < n; i++) {
640 object *w = newintobject(ilow);
641 if (w == NULL) {
642 DECREF(v);
643 return NULL;
644 }
645 setlistitem(v, i, w);
646 ilow += istep;
647 }
648 return v;
649}
650
651static object *
652builtin_raw_input(self, v)
653 object *self;
654 object *v;
655{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000656 object *f = sysget("stdout");
657 if (f == NULL) {
658 err_setstr(RuntimeError, "lost sys.stdout");
659 return NULL;
660 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000661 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000662 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000663 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +0000664 return NULL;
665 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000666 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000667}
668
669static object *
670builtin_reload(self, v)
671 object *self;
672 object *v;
673{
674 return reload_module(v);
675}
676
677static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +0000678builtin_repr(self, v)
679 object *self;
680 object *v;
681{
682 if (v == NULL) {
683 err_badarg();
684 return NULL;
685 }
686 return reprobject(v);
687}
688
689static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000690builtin_round(self, args)
691 object *self;
692 object *args;
693{
694 extern double floor PROTO((double));
695 extern double ceil PROTO((double));
696 double x;
697 double f;
698 int ndigits = 0;
699 int sign = 1;
700 int i;
701 if (!getargs(args, "d", &x)) {
702 err_clear();
703 if (!getargs(args, "(di)", &x, &ndigits))
704 return NULL;
705 }
706 f = 1.0;
707 for (i = ndigits; --i >= 0; )
708 f = f*10.0;
709 for (i = ndigits; ++i <= 0; )
710 f = f*0.1;
711 if (x >= 0.0)
712 return newfloatobject(floor(x*f + 0.5) / f);
713 else
714 return newfloatobject(ceil(x*f - 0.5) / f);
715}
716
717static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +0000718builtin_str(self, v)
719 object *self;
720 object *v;
721{
722 if (v == NULL) {
723 err_badarg();
724 return NULL;
725 }
726 if (is_stringobject(v)) {
727 INCREF(v);
728 return v;
729 }
730 else
731 return reprobject(v);
732}
733
734static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000735builtin_type(self, v)
736 object *self;
737 object *v;
738{
739 if (v == NULL) {
Guido van Rossumc89705d1992-11-26 08:54:07 +0000740 err_setstr(TypeError, "type() requires an argument");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000741 return NULL;
742 }
743 v = (object *)v->ob_type;
744 INCREF(v);
745 return v;
746}
747
748static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000749 {"abs", builtin_abs},
750 {"apply", builtin_apply},
751 {"chr", builtin_chr},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000752 {"cmp", builtin_cmp},
Guido van Rossum04691fc1992-08-12 15:35:34 +0000753 {"coerce", builtin_coerce},
Guido van Rossum5b722181993-03-30 17:46:03 +0000754 {"compile", builtin_compile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000755 {"dir", builtin_dir},
756 {"divmod", builtin_divmod},
757 {"eval", builtin_eval},
758 {"exec", builtin_exec},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000759 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000760 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000761 {"getattr", builtin_getattr},
Guido van Rossum9bfef441993-03-29 10:43:31 +0000762 {"hasattr", builtin_hasattr},
763 {"hash", builtin_hash},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000764 {"hex", builtin_hex},
Guido van Rossum5b722181993-03-30 17:46:03 +0000765 {"id", builtin_id},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000766 {"input", builtin_input},
767 {"int", builtin_int},
768 {"len", builtin_len},
769 {"long", builtin_long},
770 {"max", builtin_max},
771 {"min", builtin_min},
772 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000773 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000774 {"ord", builtin_ord},
775 {"pow", builtin_pow},
776 {"range", builtin_range},
777 {"raw_input", builtin_raw_input},
778 {"reload", builtin_reload},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000779 {"repr", builtin_repr},
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000780 {"round", builtin_round},
Guido van Rossum33894be1992-01-27 16:53:09 +0000781 {"setattr", builtin_setattr},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000782 {"str", builtin_str},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000783 {"type", builtin_type},
784 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000785};
786
787static object *builtin_dict;
788
789object *
790getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000791 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000792{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000793 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000794}
795
796/* Predefined exceptions */
797
Guido van Rossum25831651993-05-19 14:50:45 +0000798object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000799object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +0000800object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000801object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000802object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000803object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000804object *IndexError;
805object *KeyError;
806object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000807object *MemoryError;
808object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000809object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000810object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000811object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000812object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000813object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000814object *TypeError;
815object *ValueError;
816object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000817
Guido van Rossum3f5da241990-12-20 15:06:42 +0000818static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000819newstdexception(name)
820 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000821{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000822 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000823 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
824 fatal("no mem for new standard exception");
825 return v;
826}
827
828static void
829initerrors()
830{
Guido van Rossum25831651993-05-19 14:50:45 +0000831 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000832 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +0000833 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000834 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000835 IOError = newstdexception("IOError");
836 ImportError = newstdexception("ImportError");
837 IndexError = newstdexception("IndexError");
838 KeyError = newstdexception("KeyError");
839 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000840 MemoryError = newstdexception("MemoryError");
841 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000842 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000843 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000844 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000845 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000846 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000847 TypeError = newstdexception("TypeError");
848 ValueError = newstdexception("ValueError");
849 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000850}
851
852void
853initbuiltin()
854{
855 object *m;
856 m = initmodule("builtin", builtin_methods);
857 builtin_dict = getmoduledict(m);
858 INCREF(builtin_dict);
859 initerrors();
860 (void) dictinsert(builtin_dict, "None", None);
861}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000862
863/* Coerce two numeric types to the "larger" one.
864 Increment the reference count on each argument.
865 Return -1 and raise an exception if no coercion is possible
866 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +0000867*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000868
869int
870coerce(pv, pw)
871 object **pv, **pw;
872{
873 register object *v = *pv;
874 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000875 int res;
876
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000877 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000878 INCREF(v);
879 INCREF(w);
880 return 0;
881 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000882 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
883 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
884 if (res <= 0)
885 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000886 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000887 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
888 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
889 if (res <= 0)
890 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000891 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000892 err_setstr(TypeError, "number coercion failed");
893 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000894}