blob: c2c29662b6bbf06c9e5ad2e8c47167af324df850 [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,
Guido van Rossum81daa321993-05-20 14:24:46 +0000215 (object *)NULL, (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 Rossum25831651993-05-19 14:50:45 +0000799object *AccessError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000800object *AttributeError;
Guido van Rossum25831651993-05-19 14:50:45 +0000801object *ConflictError;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000802object *EOFError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000803object *IOError;
Guido van Rossumed7711b1991-12-24 13:24:53 +0000804object *ImportError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000805object *IndexError;
806object *KeyError;
807object *KeyboardInterrupt;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000808object *MemoryError;
809object *NameError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000810object *OverflowError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000811object *RuntimeError;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000812object *SyntaxError;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000813object *SystemError;
Guido van Rossum768a3f01991-12-31 13:13:47 +0000814object *SystemExit;
Guido van Rossumfb905c31991-12-16 15:42:38 +0000815object *TypeError;
816object *ValueError;
817object *ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +0000818
Guido van Rossum3f5da241990-12-20 15:06:42 +0000819static object *
Guido van Rossumfb905c31991-12-16 15:42:38 +0000820newstdexception(name)
821 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000822{
Guido van Rossumfb905c31991-12-16 15:42:38 +0000823 object *v = newstringobject(name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000824 if (v == NULL || dictinsert(builtin_dict, name, v) != 0)
825 fatal("no mem for new standard exception");
826 return v;
827}
828
829static void
830initerrors()
831{
Guido van Rossum25831651993-05-19 14:50:45 +0000832 AccessError = newstdexception("AccessError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000833 AttributeError = newstdexception("AttributeError");
Guido van Rossum25831651993-05-19 14:50:45 +0000834 ConflictError = newstdexception("ConflictError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000835 EOFError = newstdexception("EOFError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000836 IOError = newstdexception("IOError");
837 ImportError = newstdexception("ImportError");
838 IndexError = newstdexception("IndexError");
839 KeyError = newstdexception("KeyError");
840 KeyboardInterrupt = newstdexception("KeyboardInterrupt");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000841 MemoryError = newstdexception("MemoryError");
842 NameError = newstdexception("NameError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000843 OverflowError = newstdexception("OverflowError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000844 RuntimeError = newstdexception("RuntimeError");
Guido van Rossumfb905c31991-12-16 15:42:38 +0000845 SyntaxError = newstdexception("SyntaxError");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000846 SystemError = newstdexception("SystemError");
Guido van Rossum768a3f01991-12-31 13:13:47 +0000847 SystemExit = newstdexception("SystemExit");
Guido van Rossumed7711b1991-12-24 13:24:53 +0000848 TypeError = newstdexception("TypeError");
849 ValueError = newstdexception("ValueError");
850 ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000851}
852
853void
854initbuiltin()
855{
856 object *m;
857 m = initmodule("builtin", builtin_methods);
858 builtin_dict = getmoduledict(m);
859 INCREF(builtin_dict);
860 initerrors();
861 (void) dictinsert(builtin_dict, "None", None);
862}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000863
864/* Coerce two numeric types to the "larger" one.
865 Increment the reference count on each argument.
866 Return -1 and raise an exception if no coercion is possible
867 (and then no reference count is incremented).
Guido van Rossume6eefc21992-08-14 12:06:52 +0000868*/
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000869
870int
871coerce(pv, pw)
872 object **pv, **pw;
873{
874 register object *v = *pv;
875 register object *w = *pw;
Guido van Rossume6eefc21992-08-14 12:06:52 +0000876 int res;
877
Guido van Rossum9e51f9b1993-02-12 16:29:05 +0000878 if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000879 INCREF(v);
880 INCREF(w);
881 return 0;
882 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000883 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
884 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
885 if (res <= 0)
886 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000887 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000888 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
889 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
890 if (res <= 0)
891 return res;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000892 }
Guido van Rossume6eefc21992-08-14 12:06:52 +0000893 err_setstr(TypeError, "number coercion failed");
894 return -1;
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000895}