blob: b74b9cc0282f2f5e407cb3d5c04861b905a81654 [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"
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"
Guido van Rossum5b722181993-03-30 17:46:03 +000038#include "compile.h"
39#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000040
41static object *
42builtin_abs(self, v)
43 object *self;
44 object *v;
45{
Guido van Rossumd4905451991-05-05 20:00:36 +000046 number_methods *nm;
47 if (v == NULL || (nm = v->ob_type->tp_as_number) == NULL) {
48 err_setstr(TypeError, "abs() requires numeric argument");
49 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000050 }
Guido van Rossumd4905451991-05-05 20:00:36 +000051 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000052}
53
54static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000055builtin_apply(self, args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000056 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000057 object *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000058{
Guido van Rossum94390a41992-08-14 15:14:30 +000059 object *func, *arglist;
60 if (!getargs(args, "(OO)", &func, &arglist))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000061 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +000062 return call_object(func, arglist);
Guido van Rossumc02e15c1991-12-16 13:03:00 +000063}
64
65static object *
Guido van Rossum94390a41992-08-14 15:14:30 +000066builtin_chr(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000067 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +000068 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000069{
70 long x;
71 char s[1];
Guido van Rossum94390a41992-08-14 15:14:30 +000072 if (!getargs(args, "l", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +000073 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000074 if (x < 0 || x >= 256) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +000075 err_setstr(ValueError, "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +000076 return NULL;
77 }
78 s[0] = x;
79 return newsizedstringobject(s, 1);
80}
81
82static object *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000083builtin_cmp(self, args)
84 object *self;
85 object *args;
86{
87 object *a, *b;
88 if (!getargs(args, "(OO)", &a, &b))
89 return NULL;
90 return newintobject((long)cmpobject(a, b));
91}
92
93static object *
Guido van Rossum04691fc1992-08-12 15:35:34 +000094builtin_coerce(self, args)
95 object *self;
96 object *args;
97{
98 object *v, *w;
99 object *res;
100
101 if (!getargs(args, "(OO)", &v, &w))
102 return NULL;
103 if (coerce(&v, &w) < 0)
104 return NULL;
105 res = mkvalue("(OO)", v, w);
106 DECREF(v);
107 DECREF(w);
108 return res;
109}
110
111static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000112builtin_compile(self, args)
113 object *self;
114 object *args;
115{
116 char *str;
117 char *filename;
118 char *startstr;
119 int start;
120 if (!getargs(args, "(sss)", &str, &filename, &startstr))
121 return NULL;
122 if (strcmp(startstr, "exec") == 0)
123 start = file_input;
124 else if (strcmp(startstr, "eval") == 0)
125 start = eval_input;
126 else {
127 err_setstr(ValueError,
128 "compile() mode must be 'exec' or 'eval'");
129 return NULL;
130 }
131 return compile_string(str, filename, start);
132}
133
134static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000135builtin_dir(self, v)
136 object *self;
137 object *v;
138{
139 object *d;
140 if (v == NULL) {
141 d = getlocals();
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000142 INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000143 }
144 else {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000145 d = getattr(v, "__dict__");
146 if (d == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000147 err_setstr(TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000148 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000149 return NULL;
150 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000151 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000152 if (is_dictobject(d)) {
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000153 v = getdictkeys(d);
154 if (sortlist(v) != 0) {
155 DECREF(v);
156 v = NULL;
157 }
158 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000159 else {
160 v = newlistobject(0);
161 }
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000162 DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000163 return v;
164}
165
166static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000167builtin_divmod(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000168 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000169 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000170{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000171 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000172 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000173 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000174 if (v->ob_type->tp_as_number == NULL ||
175 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000176 err_setstr(TypeError, "divmod() requires numeric arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000177 return NULL;
178 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000179 if (coerce(&v, &w) != 0)
180 return NULL;
181 x = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
182 DECREF(v);
183 DECREF(w);
184 return x;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000185}
186
187static object *
188exec_eval(v, start)
189 object *v;
190 int start;
191{
192 object *str = NULL, *globals = NULL, *locals = NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000193 char *s;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000194 int n;
195 if (v != NULL) {
Guido van Rossum5b722181993-03-30 17:46:03 +0000196 if (is_tupleobject(v) &&
Guido van Rossum3f5da241990-12-20 15:06:42 +0000197 ((n = gettuplesize(v)) == 2 || n == 3)) {
198 str = gettupleitem(v, 0);
199 globals = gettupleitem(v, 1);
200 if (n == 3)
201 locals = gettupleitem(v, 2);
202 }
Guido van Rossum5b722181993-03-30 17:46:03 +0000203 else
204 str = v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000205 }
Guido van Rossum5b722181993-03-30 17:46:03 +0000206 if (str == NULL || (!is_stringobject(str) && !is_codeobject(str)) ||
Guido van Rossum3f5da241990-12-20 15:06:42 +0000207 globals != NULL && !is_dictobject(globals) ||
208 locals != NULL && !is_dictobject(locals)) {
209 err_setstr(TypeError,
Guido van Rossum5b722181993-03-30 17:46:03 +0000210 "exec/eval arguments must be (string|code)[,dict[,dict]]");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000211 return NULL;
212 }
Guido van Rossum5b722181993-03-30 17:46:03 +0000213 if (is_codeobject(str))
214 return eval_code((codeobject *) str, globals, locals,
215 (object *)NULL);
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000216 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000217 if (strlen(s) != getstringsize(str)) {
218 err_setstr(ValueError, "embedded '\\0' in string arg");
219 return NULL;
220 }
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000221 if (start == eval_input) {
222 while (*s == ' ' || *s == '\t')
223 s++;
224 }
225 return run_string(s, start, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000226}
227
228static object *
229builtin_eval(self, v)
230 object *self;
231 object *v;
232{
233 return exec_eval(v, eval_input);
234}
235
236static object *
237builtin_exec(self, v)
238 object *self;
239 object *v;
240{
241 return exec_eval(v, file_input);
242}
243
244static object *
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000245builtin_execfile(self, v)
246 object *self;
247 object *v;
248{
249 object *str = NULL, *globals = NULL, *locals = NULL, *w;
250 FILE* fp;
Guido van Rossum94390a41992-08-14 15:14:30 +0000251 char *s;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000252 int n;
253 if (v != NULL) {
254 if (is_stringobject(v))
255 str = v;
256 else if (is_tupleobject(v) &&
257 ((n = gettuplesize(v)) == 2 || n == 3)) {
258 str = gettupleitem(v, 0);
259 globals = gettupleitem(v, 1);
260 if (n == 3)
261 locals = gettupleitem(v, 2);
262 }
263 }
264 if (str == NULL || !is_stringobject(str) ||
265 globals != NULL && !is_dictobject(globals) ||
266 locals != NULL && !is_dictobject(locals)) {
267 err_setstr(TypeError,
268 "execfile arguments must be filename[,dict[,dict]]");
269 return NULL;
270 }
Guido van Rossum2b81dc91992-08-19 16:40:53 +0000271 s = getstringvalue(str);
Guido van Rossum94390a41992-08-14 15:14:30 +0000272 if (strlen(s) != getstringsize(str)) {
273 err_setstr(ValueError, "embedded '\\0' in string arg");
274 return NULL;
275 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000276 BGN_SAVE
Guido van Rossum94390a41992-08-14 15:14:30 +0000277 fp = fopen(s, "r");
Guido van Rossumff4949e1992-08-05 19:58:53 +0000278 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000279 if (fp == NULL) {
280 err_setstr(IOError, "execfile cannot open the file argument");
281 return NULL;
282 }
283 w = run_file(fp, getstringvalue(str), file_input, globals, locals);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000284 BGN_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000285 fclose(fp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000286 END_SAVE
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000287 return w;
288}
289
290static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000291builtin_float(self, v)
292 object *self;
293 object *v;
294{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000295 number_methods *nb;
296
297 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
298 nb->nb_float == NULL) {
299 err_setstr(TypeError,
300 "float() argument can't be converted to float");
301 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000302 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000303 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000304}
305
306static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000307builtin_getattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000308 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000309 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000310{
Guido van Rossum94390a41992-08-14 15:14:30 +0000311 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000312 object *name;
313 if (!getargs(args, "(OS)", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000314 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000315 return getattro(v, name);
316}
317
318static object *
319builtin_hasattr(self, args)
320 object *self;
321 object *args;
322{
323 object *v;
324 object *name;
325 if (!getargs(args, "(OS)", &v, &name))
326 return NULL;
327 v = getattro(v, name);
328 if (v == NULL) {
329 err_clear();
330 return newintobject(0L);
331 }
332 DECREF(v);
333 return newintobject(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000334}
335
336static object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000337builtin_id(self, args)
338 object *self;
339 object *args;
340{
341 object *v;
342 if (!getargs(args, "O", &v))
343 return NULL;
344 return newintobject((long)v);
345}
346
347static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000348builtin_setattr(self, args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000349 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000350 object *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000351{
Guido van Rossum94390a41992-08-14 15:14:30 +0000352 object *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000353 object *name;
Guido van Rossum94390a41992-08-14 15:14:30 +0000354 object *value;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000355 if (!getargs(args, "(OSO)", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000356 return NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000357 if (setattro(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000358 return NULL;
359 INCREF(None);
360 return None;
361}
362
363static object *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000364builtin_hash(self, args)
365 object *self;
366 object *args;
367{
368 object *v;
369 long x;
370 if (!getargs(args, "O", &v))
371 return NULL;
372 x = hashobject(v);
373 if (x == -1)
374 return NULL;
375 return newintobject(x);
376}
377
378static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000379builtin_hex(self, v)
380 object *self;
381 object *v;
382{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000383 number_methods *nb;
384
385 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
386 nb->nb_hex == NULL) {
387 err_setstr(TypeError,
388 "hex() argument can't be converted to hex");
389 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000390 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000391 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000392}
393
Guido van Rossum3165fe61992-09-25 21:59:05 +0000394static object *builtin_raw_input PROTO((object *, object *));
395
Guido van Rossum006bcd41991-10-24 14:54:44 +0000396static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000397builtin_input(self, v)
398 object *self;
399 object *v;
400{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000401 object *line = builtin_raw_input(self, v);
402 if (line == NULL)
403 return line;
404 v = exec_eval(line, eval_input);
405 DECREF(line);
406 return v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000407}
408
409static object *
410builtin_int(self, v)
411 object *self;
412 object *v;
413{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000414 number_methods *nb;
415
416 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
417 nb->nb_int == NULL) {
418 err_setstr(TypeError,
419 "int() argument can't be converted to int");
420 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000421 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000422 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000423}
424
425static object *
426builtin_len(self, v)
427 object *self;
428 object *v;
429{
430 long len;
431 typeobject *tp;
432 if (v == NULL) {
433 err_setstr(TypeError, "len() without argument");
434 return NULL;
435 }
436 tp = v->ob_type;
437 if (tp->tp_as_sequence != NULL) {
438 len = (*tp->tp_as_sequence->sq_length)(v);
439 }
440 else if (tp->tp_as_mapping != NULL) {
441 len = (*tp->tp_as_mapping->mp_length)(v);
442 }
443 else {
444 err_setstr(TypeError, "len() of unsized object");
445 return NULL;
446 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000447 if (len < 0)
448 return NULL;
449 else
450 return newintobject(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000451}
452
453static object *
Guido van Rossumd4905451991-05-05 20:00:36 +0000454builtin_long(self, v)
455 object *self;
456 object *v;
457{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000458 number_methods *nb;
459
460 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
461 nb->nb_long == NULL) {
462 err_setstr(TypeError,
463 "long() argument can't be converted to long");
464 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +0000465 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000466 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000467}
468
469static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000470min_max(v, sign)
471 object *v;
472 int sign;
473{
474 int i, n, cmp;
475 object *w, *x;
476 sequence_methods *sq;
477 if (v == NULL) {
478 err_setstr(TypeError, "min() or max() without argument");
479 return NULL;
480 }
481 sq = v->ob_type->tp_as_sequence;
482 if (sq == NULL) {
483 err_setstr(TypeError, "min() or max() of non-sequence");
484 return NULL;
485 }
486 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +0000487 if (n < 0)
488 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000489 if (n == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000490 err_setstr(ValueError, "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000491 return NULL;
492 }
493 w = (*sq->sq_item)(v, 0); /* Implies INCREF */
494 for (i = 1; i < n; i++) {
495 x = (*sq->sq_item)(v, i); /* Implies INCREF */
496 cmp = cmpobject(x, w);
497 if (cmp * sign > 0) {
498 DECREF(w);
499 w = x;
500 }
501 else
502 DECREF(x);
503 }
504 return w;
505}
506
507static object *
508builtin_min(self, v)
509 object *self;
510 object *v;
511{
512 return min_max(v, -1);
513}
514
515static object *
516builtin_max(self, v)
517 object *self;
518 object *v;
519{
520 return min_max(v, 1);
521}
522
523static object *
Guido van Rossum006bcd41991-10-24 14:54:44 +0000524builtin_oct(self, v)
525 object *self;
526 object *v;
527{
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000528 number_methods *nb;
529
530 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
531 nb->nb_oct == NULL) {
532 err_setstr(TypeError,
533 "oct() argument can't be converted to oct");
534 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000535 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000536 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000537}
538
539static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000540builtin_open(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000541 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000542 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000543{
Guido van Rossum94390a41992-08-14 15:14:30 +0000544 char *name, *mode;
545 if (!getargs(args, "(ss)", &name, &mode))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000546 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000547 return newfileobject(name, mode);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000548}
549
550static object *
Guido van Rossum94390a41992-08-14 15:14:30 +0000551builtin_ord(self, args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000552 object *self;
Guido van Rossum94390a41992-08-14 15:14:30 +0000553 object *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000554{
Guido van Rossum94390a41992-08-14 15:14:30 +0000555 char *s;
556 int len;
557 if (!getargs(args, "s#", &s, &len))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000558 return NULL;
Guido van Rossum94390a41992-08-14 15:14:30 +0000559 if (len != 1) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000560 err_setstr(ValueError, "ord() arg must have length 1");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000561 return NULL;
562 }
Guido van Rossum94390a41992-08-14 15:14:30 +0000563 return newintobject((long)(s[0] & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000564}
565
566static object *
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000567builtin_pow(self, args)
Guido van Rossumd4905451991-05-05 20:00:36 +0000568 object *self;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000569 object *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000570{
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000571 object *v, *w, *x;
Guido van Rossum94390a41992-08-14 15:14:30 +0000572 if (!getargs(args, "(OO)", &v, &w))
Guido van Rossumd4905451991-05-05 20:00:36 +0000573 return NULL;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000574 if (v->ob_type->tp_as_number == NULL ||
575 w->ob_type->tp_as_number == NULL) {
Guido van Rossumd4905451991-05-05 20:00:36 +0000576 err_setstr(TypeError, "pow() requires numeric arguments");
577 return NULL;
578 }
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000579 if (coerce(&v, &w) != 0)
580 return NULL;
581 x = (*v->ob_type->tp_as_number->nb_power)(v, w);
582 DECREF(v);
583 DECREF(w);
584 return x;
Guido van Rossumd4905451991-05-05 20:00:36 +0000585}
586
587static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000588builtin_range(self, v)
589 object *self;
590 object *v;
591{
592 static char *errmsg = "range() requires 1-3 int arguments";
593 int i, n;
594 long ilow, ihigh, istep;
595 if (v != NULL && is_intobject(v)) {
596 ilow = 0; ihigh = getintvalue(v); istep = 1;
597 }
598 else if (v == NULL || !is_tupleobject(v)) {
599 err_setstr(TypeError, errmsg);
600 return NULL;
601 }
602 else {
603 n = gettuplesize(v);
604 if (n < 1 || n > 3) {
605 err_setstr(TypeError, errmsg);
606 return NULL;
607 }
608 for (i = 0; i < n; i++) {
609 if (!is_intobject(gettupleitem(v, i))) {
610 err_setstr(TypeError, errmsg);
611 return NULL;
612 }
613 }
614 if (n == 3) {
615 istep = getintvalue(gettupleitem(v, 2));
616 --n;
617 }
618 else
619 istep = 1;
620 ihigh = getintvalue(gettupleitem(v, --n));
621 if (n > 0)
622 ilow = getintvalue(gettupleitem(v, 0));
623 else
624 ilow = 0;
625 }
626 if (istep == 0) {
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000627 err_setstr(ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000628 return NULL;
629 }
630 /* XXX ought to check overflow of subtraction */
631 if (istep > 0)
632 n = (ihigh - ilow + istep - 1) / istep;
633 else
634 n = (ihigh - ilow + istep + 1) / istep;
635 if (n < 0)
636 n = 0;
637 v = newlistobject(n);
638 if (v == NULL)
639 return NULL;
640 for (i = 0; i < n; i++) {
641 object *w = newintobject(ilow);
642 if (w == NULL) {
643 DECREF(v);
644 return NULL;
645 }
646 setlistitem(v, i, w);
647 ilow += istep;
648 }
649 return v;
650}
651
652static object *
653builtin_raw_input(self, v)
654 object *self;
655 object *v;
656{
Guido van Rossum3165fe61992-09-25 21:59:05 +0000657 object *f = sysget("stdout");
658 if (f == NULL) {
659 err_setstr(RuntimeError, "lost sys.stdout");
660 return NULL;
661 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000662 flushline();
Guido van Rossum90933611991-06-07 16:10:43 +0000663 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000664 if (writeobject(v, f, PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +0000665 return NULL;
666 }
Guido van Rossum26203aa1991-04-04 15:20:41 +0000667 return filegetline(sysget("stdin"), -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000668}
669
670static object *
671builtin_reload(self, v)
672 object *self;
673 object *v;
674{
675 return reload_module(v);
676}
677
678static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +0000679builtin_repr(self, v)
680 object *self;
681 object *v;
682{
683 if (v == NULL) {
684 err_badarg();
685 return NULL;
686 }
687 return reprobject(v);
688}
689
690static object *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000691builtin_round(self, args)
692 object *self;
693 object *args;
694{
695 extern double floor PROTO((double));
696 extern double ceil PROTO((double));
697 double x;
698 double f;
699 int ndigits = 0;
700 int sign = 1;
701 int i;
702 if (!getargs(args, "d", &x)) {
703 err_clear();
704 if (!getargs(args, "(di)", &x, &ndigits))
705 return NULL;
706 }
707 f = 1.0;
708 for (i = ndigits; --i >= 0; )
709 f = f*10.0;
710 for (i = ndigits; ++i <= 0; )
711 f = f*0.1;
712 if (x >= 0.0)
713 return newfloatobject(floor(x*f + 0.5) / f);
714 else
715 return newfloatobject(ceil(x*f - 0.5) / f);
716}
717
718static object *
Guido van Rossumc89705d1992-11-26 08:54:07 +0000719builtin_str(self, v)
720 object *self;
721 object *v;
722{
723 if (v == NULL) {
724 err_badarg();
725 return NULL;
726 }
727 if (is_stringobject(v)) {
728 INCREF(v);
729 return v;
730 }
731 else
732 return reprobject(v);
733}
734
735static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000736builtin_type(self, v)
737 object *self;
738 object *v;
739{
740 if (v == NULL) {
Guido van Rossumc89705d1992-11-26 08:54:07 +0000741 err_setstr(TypeError, "type() requires an argument");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000742 return NULL;
743 }
744 v = (object *)v->ob_type;
745 INCREF(v);
746 return v;
747}
748
749static struct methodlist builtin_methods[] = {
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000750 {"abs", builtin_abs},
751 {"apply", builtin_apply},
752 {"chr", builtin_chr},
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000753 {"cmp", builtin_cmp},
Guido van Rossum04691fc1992-08-12 15:35:34 +0000754 {"coerce", builtin_coerce},
Guido van Rossum5b722181993-03-30 17:46:03 +0000755 {"compile", builtin_compile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000756 {"dir", builtin_dir},
757 {"divmod", builtin_divmod},
758 {"eval", builtin_eval},
759 {"exec", builtin_exec},
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000760 {"execfile", builtin_execfile},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000761 {"float", builtin_float},
Guido van Rossum33894be1992-01-27 16:53:09 +0000762 {"getattr", builtin_getattr},
Guido van Rossum9bfef441993-03-29 10:43:31 +0000763 {"hasattr", builtin_hasattr},
764 {"hash", builtin_hash},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000765 {"hex", builtin_hex},
Guido van Rossum5b722181993-03-30 17:46:03 +0000766 {"id", builtin_id},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000767 {"input", builtin_input},
768 {"int", builtin_int},
769 {"len", builtin_len},
770 {"long", builtin_long},
771 {"max", builtin_max},
772 {"min", builtin_min},
773 {"oct", builtin_oct},
Guido van Rossum57789491992-02-05 11:17:52 +0000774 {"open", builtin_open},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000775 {"ord", builtin_ord},
776 {"pow", builtin_pow},
777 {"range", builtin_range},
778 {"raw_input", builtin_raw_input},
779 {"reload", builtin_reload},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000780 {"repr", builtin_repr},
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000781 {"round", builtin_round},
Guido van Rossum33894be1992-01-27 16:53:09 +0000782 {"setattr", builtin_setattr},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000783 {"str", builtin_str},
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000784 {"type", builtin_type},
785 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000786};
787
788static object *builtin_dict;
789
790object *
791getbuiltin(name)
Guido van Rossuma57fb011991-08-16 08:54:58 +0000792 object *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000793{
Guido van Rossuma57fb011991-08-16 08:54:58 +0000794 return dict2lookup(builtin_dict, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000795}
796
797/* Predefined exceptions */
798
Guido van Rossumfb905c31991-12-16 15:42:38 +0000799object *AttributeError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000800object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000801object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000802object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000803object *IndexError;
804object *KeyError;
805object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000806object *MemoryError;
807object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000808object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000809object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000810object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000811object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000812object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000813object *TypeError;
814object *ValueError;
815object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000816
Guido van Rossum3f5da241990-12-20 15:06:42 +0000817static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000818newstdexception(name)
819 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000820{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000821 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000822 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
823 fatal("no mem for new standard exception");
824 return v;
825}
826
827static void
828initerrors()
829{
Guido van Rossumed7711b1991-12-24 13:24:53 +0000830 AttributeError = newstdexception("AttributeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000831 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000832 IOError = newstdexception("IOError");
833 ImportError = newstdexception("ImportError");
834 IndexError = newstdexception("IndexError");
835 KeyError = newstdexception("KeyError");
836 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000837 MemoryError = newstdexception("MemoryError");
838 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000839 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000840 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000841 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000842 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000843 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000844 TypeError = newstdexception("TypeError");
845 ValueError = newstdexception("ValueError");
846 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000847}
848
849void
850initbuiltin()
851{
852 object *m;
853 m = initmodule("builtin", builtin_methods);
854 builtin_dict = getmoduledict(m);
855 INCREF(builtin_dict);
856 initerrors();
857 (void) dictinsert(builtin_dict, "None", None);
858}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000859
860/* Coerce two numeric types to the "larger" one.
861 Increment the reference count on each argument.
862 Return -1 and raise an exception if no coercion is possible
863 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +0000864*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000865
866int
867coerce(pv, pw)
868 object **pv, **pw;
869{
870 register object *v = *pv;
871 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000872 int res;
873
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000874 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000875 INCREF(v);
876 INCREF(w);
877 return 0;
878 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000879 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
880 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
881 if (res <= 0)
882 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000883 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000884 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
885 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
886 if (res <= 0)
887 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000888 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000889 err_setstr(TypeError, "number coercion failed");
890 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000891}