bltinmodule.c revision 8a1e8eb62fc89814a942f6ba59cac0ac32cd9fe5
1/*********************************************************** 2Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, 3The Netherlands. 4 5 All Rights Reserved 6 7Permission to use, copy, modify, and distribute this software and its 8documentation for any purpose and without fee is hereby granted, 9provided that the above copyright notice appear in all copies and that 10both that copyright notice and this permission notice appear in 11supporting documentation, and that the names of Stichting Mathematisch 12Centrum or CWI not be used in advertising or publicity pertaining to 13distribution of the software without specific, written prior permission. 14 15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO 16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE 18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 22 23******************************************************************/ 24 25/* Built-in functions */ 26 27#include "allobjects.h" 28 29#include "node.h" 30#include "graminit.h" 31#include "sysmodule.h" 32#include "bltinmodule.h" 33#include "import.h" 34#include "pythonrun.h" 35#include "ceval.h" 36#include "modsupport.h" 37#include "compile.h" 38#include "eval.h" 39 40/* Forward */ 41static object *filterstring PROTO((object *, object *)); 42static object *filtertuple PROTO((object *, object *)); 43 44static object * 45builtin___import__(self, args) 46 object *self; 47 object *args; 48{ 49 char *name; 50 object *globals = NULL; 51 object *locals = NULL; 52 object *fromlist = NULL; 53 54 if (!newgetargs(args, "s|OOO:__import__", 55 &name, &globals, &locals, &fromlist)) 56 return NULL; 57 return import_module(name); 58} 59 60 61static object * 62builtin_abs(self, args) 63 object *self; 64 object *args; 65{ 66 object *v; 67 number_methods *nm; 68 69 if (!newgetargs(args, "O:abs", &v)) 70 return NULL; 71 if ((nm = v->ob_type->tp_as_number) == NULL) { 72 err_setstr(TypeError, "abs() requires numeric argument"); 73 return NULL; 74 } 75 return (*nm->nb_absolute)(v); 76} 77 78static object * 79builtin_apply(self, args) 80 object *self; 81 object *args; 82{ 83 object *func, *arglist; 84 85 if (!newgetargs(args, "OO:apply", &func, &arglist)) 86 return NULL; 87 if (!is_tupleobject(arglist)) { 88 err_setstr(TypeError, "apply() 2nd argument must be tuple"); 89 return NULL; 90 } 91 return call_object(func, arglist); 92} 93 94static object * 95builtin_callable(self, args) 96 object *self; 97 object *args; 98{ 99 object *v; 100 101 if (!newgetargs(args, "O:callable", &v)) 102 return NULL; 103 return newintobject((long)callable(v)); 104} 105 106static object * 107builtin_filter(self, args) 108 object *self; 109 object *args; 110{ 111 object *func, *seq, *result; 112 sequence_methods *sqf; 113 int len; 114 register int i, j; 115 116 if (!newgetargs(args, "OO:filter", &func, &seq)) 117 return NULL; 118 119 if (is_stringobject(seq)) { 120 object *r = filterstring(func, seq); 121 return r; 122 } 123 124 if (is_tupleobject(seq)) { 125 object *r = filtertuple(func, seq); 126 return r; 127 } 128 129 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) { 130 err_setstr(TypeError, 131 "argument 2 to filter() must be a sequence type"); 132 goto Fail_2; 133 } 134 135 if ((len = (*sqf->sq_length)(seq)) < 0) 136 goto Fail_2; 137 138 if (is_listobject(seq) && seq->ob_refcnt == 1) { 139 INCREF(seq); 140 result = seq; 141 } 142 else { 143 if ((result = newlistobject(len)) == NULL) 144 goto Fail_2; 145 } 146 147 for (i = j = 0; ; ++i) { 148 object *item, *good; 149 int ok; 150 151 if ((item = (*sqf->sq_item)(seq, i)) == NULL) { 152 if (i < len) 153 goto Fail_1; 154 if (err_occurred() == IndexError) { 155 err_clear(); 156 break; 157 } 158 goto Fail_1; 159 } 160 161 if (func == None) { 162 good = item; 163 INCREF(good); 164 } 165 else { 166 object *arg = mkvalue("(O)", item); 167 if (arg == NULL) 168 goto Fail_1; 169 good = call_object(func, arg); 170 DECREF(arg); 171 if (good == NULL) { 172 DECREF(item); 173 goto Fail_1; 174 } 175 } 176 ok = testbool(good); 177 DECREF(good); 178 if (ok) { 179 if (j < len) { 180 if (setlistitem(result, j++, item) < 0) 181 goto Fail_1; 182 } 183 else { 184 j++; 185 if (addlistitem(result, item) < 0) 186 goto Fail_1; 187 } 188 } else { 189 DECREF(item); 190 } 191 } 192 193 194 if (j < len && setlistslice(result, j, len, NULL) < 0) 195 goto Fail_1; 196 197 return result; 198 199Fail_1: 200 DECREF(result); 201Fail_2: 202 return NULL; 203} 204 205static object * 206builtin_chr(self, args) 207 object *self; 208 object *args; 209{ 210 long x; 211 char s[1]; 212 213 if (!newgetargs(args, "l:chr", &x)) 214 return NULL; 215 if (x < 0 || x >= 256) { 216 err_setstr(ValueError, "chr() arg not in range(256)"); 217 return NULL; 218 } 219 s[0] = x; 220 return newsizedstringobject(s, 1); 221} 222 223static object * 224builtin_cmp(self, args) 225 object *self; 226 object *args; 227{ 228 object *a, *b; 229 230 if (!newgetargs(args, "OO:cmp", &a, &b)) 231 return NULL; 232 return newintobject((long)cmpobject(a, b)); 233} 234 235static object * 236builtin_coerce(self, args) 237 object *self; 238 object *args; 239{ 240 object *v, *w; 241 object *res; 242 243 if (!newgetargs(args, "OO:coerce", &v, &w)) 244 return NULL; 245 if (coerce(&v, &w) < 0) 246 return NULL; 247 res = mkvalue("(OO)", v, w); 248 DECREF(v); 249 DECREF(w); 250 return res; 251} 252 253static object * 254builtin_compile(self, args) 255 object *self; 256 object *args; 257{ 258 char *str; 259 char *filename; 260 char *startstr; 261 int start; 262 263 if (!newgetargs(args, "sss:compile", &str, &filename, &startstr)) 264 return NULL; 265 if (strcmp(startstr, "exec") == 0) 266 start = file_input; 267 else if (strcmp(startstr, "eval") == 0) 268 start = eval_input; 269 else { 270 err_setstr(ValueError, 271 "compile() mode must be 'exec' or 'eval'"); 272 return NULL; 273 } 274 return compile_string(str, filename, start); 275} 276 277static object * 278builtin_dir(self, args) 279 object *self; 280 object *args; 281{ 282 object *v = NULL; 283 object *d; 284 285 if (!newgetargs(args, "|O:dir", &v)) 286 return NULL; 287 if (v == NULL) { 288 d = getlocals(); 289 INCREF(d); 290 } 291 else { 292 d = getattr(v, "__dict__"); 293 if (d == NULL) { 294 err_setstr(TypeError, 295 "dir() argument must have __dict__ attribute"); 296 return NULL; 297 } 298 } 299 if (is_dictobject(d)) { 300 v = getdictkeys(d); 301 if (sortlist(v) != 0) { 302 DECREF(v); 303 v = NULL; 304 } 305 } 306 else { 307 v = newlistobject(0); 308 } 309 DECREF(d); 310 return v; 311} 312 313static object * 314do_divmod(v, w) 315 object *v, *w; 316{ 317 object *res; 318 319 if (is_instanceobject(v) || is_instanceobject(w)) 320 return instancebinop(v, w, "__divmod__", "__rdivmod__", 321 do_divmod); 322 if (v->ob_type->tp_as_number == NULL || 323 w->ob_type->tp_as_number == NULL) { 324 err_setstr(TypeError, 325 "divmod() requires numeric or class instance arguments"); 326 return NULL; 327 } 328 if (coerce(&v, &w) != 0) 329 return NULL; 330 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w); 331 DECREF(v); 332 DECREF(w); 333 return res; 334} 335 336static object * 337builtin_divmod(self, args) 338 object *self; 339 object *args; 340{ 341 object *v, *w; 342 343 if (!newgetargs(args, "OO:divmod", &v, &w)) 344 return NULL; 345 return do_divmod(v, w); 346} 347 348static object * 349builtin_eval(self, args) 350 object *self; 351 object *args; 352{ 353 object *cmd; 354 object *globals = None, *locals = None; 355 char *str; 356 357 if (!newgetargs(args, "O|O!O!:eval", 358 &cmd, 359 &Mappingtype, &globals, 360 &Mappingtype, &locals)) 361 return NULL; 362 if (globals == None) { 363 globals = getglobals(); 364 if (locals == None) 365 locals = getlocals(); 366 } 367 else if (locals == None) 368 locals = globals; 369 if (dictlookup(globals, "__builtins__") == NULL) { 370 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0) 371 return NULL; 372 } 373 if (is_codeobject(cmd)) 374 return eval_code((codeobject *) cmd, globals, locals, 375 (object *)NULL, (object *)NULL); 376 if (!is_stringobject(cmd)) { 377 err_setstr(TypeError, 378 "eval() argument 1 must be string or code object"); 379 return NULL; 380 } 381 str = getstringvalue(cmd); 382 if (strlen(str) != getstringsize(cmd)) { 383 err_setstr(ValueError, 384 "embedded '\\0' in string arg"); 385 return NULL; 386 } 387 while (*str == ' ' || *str == '\t') 388 str++; 389 return run_string(str, eval_input, globals, locals); 390} 391 392static object * 393builtin_execfile(self, args) 394 object *self; 395 object *args; 396{ 397 char *filename; 398 object *globals = None, *locals = None; 399 object *res; 400 FILE* fp; 401 402 if (!newgetargs(args, "s|O!O!:execfile", 403 &filename, 404 &Mappingtype, &globals, 405 &Mappingtype, &locals)) 406 return NULL; 407 if (globals == None) { 408 globals = getglobals(); 409 if (locals == None) 410 locals = getlocals(); 411 } 412 else if (locals == None) 413 locals = globals; 414 if (dictlookup(globals, "__builtins__") == NULL) { 415 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0) 416 return NULL; 417 } 418 BGN_SAVE 419 fp = fopen(filename, "r"); 420 END_SAVE 421 if (fp == NULL) { 422 err_errno(IOError); 423 return NULL; 424 } 425 res = run_file(fp, filename, file_input, globals, locals); 426 BGN_SAVE 427 fclose(fp); 428 END_SAVE 429 return res; 430} 431 432static object * 433builtin_float(self, args) 434 object *self; 435 object *args; 436{ 437 object *v; 438 number_methods *nb; 439 440 if (!newgetargs(args, "O:float", &v)) 441 return NULL; 442 if ((nb = v->ob_type->tp_as_number) == NULL || 443 nb->nb_float == NULL) { 444 err_setstr(TypeError, 445 "float() argument can't be converted to float"); 446 return NULL; 447 } 448 return (*nb->nb_float)(v); 449} 450 451static object * 452builtin_getattr(self, args) 453 object *self; 454 object *args; 455{ 456 object *v; 457 object *name; 458 459 if (!newgetargs(args, "OS:getattr", &v, &name)) 460 return NULL; 461 return getattro(v, name); 462} 463 464static object * 465builtin_hasattr(self, args) 466 object *self; 467 object *args; 468{ 469 object *v; 470 object *name; 471 472 if (!newgetargs(args, "OS:hasattr", &v, &name)) 473 return NULL; 474 v = getattro(v, name); 475 if (v == NULL) { 476 err_clear(); 477 return newintobject(0L); 478 } 479 DECREF(v); 480 return newintobject(1L); 481} 482 483static object * 484builtin_id(self, args) 485 object *self; 486 object *args; 487{ 488 object *v; 489 490 if (!newgetargs(args, "O:id", &v)) 491 return NULL; 492 return newintobject((long)v); 493} 494 495static object * 496builtin_map(self, args) 497 object *self; 498 object *args; 499{ 500 typedef struct { 501 object *seq; 502 sequence_methods *sqf; 503 int len; 504 } sequence; 505 506 object *func, *result; 507 sequence *seqs = NULL, *sqp; 508 int n, len; 509 register int i, j; 510 511 n = gettuplesize(args); 512 if (n < 2) { 513 err_setstr(TypeError, "map() requires at least two args"); 514 return NULL; 515 } 516 517 func = gettupleitem(args, 0); 518 n--; 519 520 if ((seqs = NEW(sequence, n)) == NULL) { 521 err_nomem(); 522 goto Fail_2; 523 } 524 525 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) { 526 int curlen; 527 528 if ((sqp->seq = gettupleitem(args, i + 1)) == NULL) 529 goto Fail_2; 530 531 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) { 532 static char errmsg[] = 533 "argument %d to map() must be a sequence object"; 534 char errbuf[sizeof(errmsg) + 3]; 535 536 sprintf(errbuf, errmsg, i+2); 537 err_setstr(TypeError, errbuf); 538 goto Fail_2; 539 } 540 541 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0) 542 goto Fail_2; 543 544 if (curlen > len) 545 len = curlen; 546 } 547 548 if ((result = (object *) newlistobject(len)) == NULL) 549 goto Fail_2; 550 551 /* XXX Special case map(None, single_list) could be more efficient */ 552 for (i = 0; ; ++i) { 553 object *arglist, *item, *value; 554 int any = 0; 555 556 if (func == None && n == 1) 557 arglist = NULL; 558 else { 559 if ((arglist = newtupleobject(n)) == NULL) 560 goto Fail_1; 561 } 562 563 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) { 564 if (sqp->len < 0) { 565 INCREF(None); 566 item = None; 567 } 568 else { 569 item = (*sqp->sqf->sq_item)(sqp->seq, i); 570 if (item == NULL) { 571 if (i < sqp->len) 572 goto Fail_0; 573 if (err_occurred() == IndexError) { 574 err_clear(); 575 INCREF(None); 576 item = None; 577 sqp->len = -1; 578 } 579 else { 580 goto Fail_0; 581 } 582 } 583 else 584 any = 1; 585 586 } 587 if (!arglist) 588 break; 589 if (settupleitem(arglist, j, item) < 0) { 590 DECREF(item); 591 goto Fail_0; 592 } 593 continue; 594 595 Fail_0: 596 XDECREF(arglist); 597 goto Fail_1; 598 } 599 600 if (!arglist) 601 arglist = item; 602 603 if (!any) { 604 DECREF(arglist); 605 break; 606 } 607 608 if (func == None) 609 value = arglist; 610 else { 611 value = call_object(func, arglist); 612 DECREF(arglist); 613 if (value == NULL) 614 goto Fail_1; 615 } 616 if (i >= len) { 617 if (addlistitem(result, value) < 0) 618 goto Fail_1; 619 } 620 else { 621 if (setlistitem(result, i, value) < 0) 622 goto Fail_1; 623 } 624 } 625 626 DEL(seqs); 627 return result; 628 629Fail_1: 630 DECREF(result); 631Fail_2: 632 if (seqs) DEL(seqs); 633 return NULL; 634} 635 636static object * 637builtin_setattr(self, args) 638 object *self; 639 object *args; 640{ 641 object *v; 642 object *name; 643 object *value; 644 645 if (!newgetargs(args, "OSO:setattr", &v, &name, &value)) 646 return NULL; 647 if (setattro(v, name, value) != 0) 648 return NULL; 649 INCREF(None); 650 return None; 651} 652 653static object * 654builtin_delattr(self, args) 655 object *self; 656 object *args; 657{ 658 object *v; 659 object *name; 660 661 if (!newgetargs(args, "OS:delattr", &v, &name)) 662 return NULL; 663 if (setattro(v, name, (object *)NULL) != 0) 664 return NULL; 665 INCREF(None); 666 return None; 667} 668 669static object * 670builtin_hash(self, args) 671 object *self; 672 object *args; 673{ 674 object *v; 675 long x; 676 677 if (!newgetargs(args, "O:hash", &v)) 678 return NULL; 679 x = hashobject(v); 680 if (x == -1) 681 return NULL; 682 return newintobject(x); 683} 684 685static object * 686builtin_hex(self, args) 687 object *self; 688 object *args; 689{ 690 object *v; 691 number_methods *nb; 692 693 if (!newgetargs(args, "O:hex", &v)) 694 return NULL; 695 696 if ((nb = v->ob_type->tp_as_number) == NULL || 697 nb->nb_hex == NULL) { 698 err_setstr(TypeError, 699 "hex() argument can't be converted to hex"); 700 return NULL; 701 } 702 return (*nb->nb_hex)(v); 703} 704 705static object *builtin_raw_input PROTO((object *, object *)); 706 707static object * 708builtin_input(self, args) 709 object *self; 710 object *args; 711{ 712 object *line; 713 char *str; 714 object *res; 715 object *globals, *locals; 716 717 line = builtin_raw_input(self, args); 718 if (line == NULL) 719 return line; 720 if (!getargs(line, "s;embedded '\\0' in input line", &str)) 721 return NULL; 722 while (*str == ' ' || *str == '\t') 723 str++; 724 globals = getglobals(); 725 locals = getlocals(); 726 if (dictlookup(globals, "__builtins__") == NULL) { 727 if (dictinsert(globals, "__builtins__", getbuiltins()) != 0) 728 return NULL; 729 } 730 res = run_string(str, eval_input, globals, locals); 731 DECREF(line); 732 return res; 733} 734 735static object * 736builtin_int(self, args) 737 object *self; 738 object *args; 739{ 740 object *v; 741 number_methods *nb; 742 743 if (!newgetargs(args, "O:int", &v)) 744 return NULL; 745 if ((nb = v->ob_type->tp_as_number) == NULL || 746 nb->nb_int == NULL) { 747 err_setstr(TypeError, 748 "int() argument can't be converted to int"); 749 return NULL; 750 } 751 return (*nb->nb_int)(v); 752} 753 754static object * 755builtin_len(self, args) 756 object *self; 757 object *args; 758{ 759 object *v; 760 long len; 761 typeobject *tp; 762 763 if (!newgetargs(args, "O:len", &v)) 764 return NULL; 765 tp = v->ob_type; 766 if (tp->tp_as_sequence != NULL) { 767 len = (*tp->tp_as_sequence->sq_length)(v); 768 } 769 else if (tp->tp_as_mapping != NULL) { 770 len = (*tp->tp_as_mapping->mp_length)(v); 771 } 772 else { 773 err_setstr(TypeError, "len() of unsized object"); 774 return NULL; 775 } 776 if (len < 0) 777 return NULL; 778 else 779 return newintobject(len); 780} 781 782static object * 783builtin_long(self, args) 784 object *self; 785 object *args; 786{ 787 object *v; 788 number_methods *nb; 789 790 if (!newgetargs(args, "O:long", &v)) 791 return NULL; 792 if ((nb = v->ob_type->tp_as_number) == NULL || 793 nb->nb_long == NULL) { 794 err_setstr(TypeError, 795 "long() argument can't be converted to long"); 796 return NULL; 797 } 798 return (*nb->nb_long)(v); 799} 800 801static object * 802min_max(args, sign) 803 object *args; 804 int sign; 805{ 806 int i; 807 object *v, *w, *x; 808 sequence_methods *sq; 809 810 if (gettuplesize(args) > 1) 811 v = args; 812 else if (!newgetargs(args, "O:min/max", &v)) 813 return NULL; 814 sq = v->ob_type->tp_as_sequence; 815 if (sq == NULL) { 816 err_setstr(TypeError, "min() or max() of non-sequence"); 817 return NULL; 818 } 819 w = NULL; 820 for (i = 0; ; i++) { 821 x = (*sq->sq_item)(v, i); /* Implies INCREF */ 822 if (x == NULL) { 823 if (err_occurred() == IndexError) { 824 err_clear(); 825 break; 826 } 827 XDECREF(w); 828 return NULL; 829 } 830 if (w == NULL) 831 w = x; 832 else { 833 if (cmpobject(x, w) * sign > 0) { 834 DECREF(w); 835 w = x; 836 } 837 else 838 DECREF(x); 839 } 840 } 841 if (w == NULL) 842 err_setstr(ValueError, "min() or max() of empty sequence"); 843 return w; 844} 845 846static object * 847builtin_min(self, v) 848 object *self; 849 object *v; 850{ 851 return min_max(v, -1); 852} 853 854static object * 855builtin_max(self, v) 856 object *self; 857 object *v; 858{ 859 return min_max(v, 1); 860} 861 862static object * 863builtin_oct(self, args) 864 object *self; 865 object *args; 866{ 867 object *v; 868 number_methods *nb; 869 870 if (!newgetargs(args, "O:oct", &v)) 871 return NULL; 872 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL || 873 nb->nb_oct == NULL) { 874 err_setstr(TypeError, 875 "oct() argument can't be converted to oct"); 876 return NULL; 877 } 878 return (*nb->nb_oct)(v); 879} 880 881static object * 882builtin_open(self, args) 883 object *self; 884 object *args; 885{ 886 char *name; 887 char *mode = "r"; 888 int bufsize = -1; 889 object *f; 890 891 if (!newgetargs(args, "s|si:open", &name, &mode, &bufsize)) 892 return NULL; 893 f = newfileobject(name, mode); 894 if (f != NULL) 895 setfilebufsize(f, bufsize); 896 return f; 897} 898 899static object * 900builtin_ord(self, args) 901 object *self; 902 object *args; 903{ 904 char c; 905 906 if (!newgetargs(args, "c:ord", &c)) 907 return NULL; 908 return newintobject((long)(c & 0xff)); 909} 910 911static object * 912do_pow(v, w) 913 object *v, *w; 914{ 915 object *res; 916 if (is_instanceobject(v) || is_instanceobject(w)) 917 return instancebinop(v, w, "__pow__", "__rpow__", do_pow); 918 if (v->ob_type->tp_as_number == NULL || 919 w->ob_type->tp_as_number == NULL) { 920 err_setstr(TypeError, "pow() requires numeric arguments"); 921 return NULL; 922 } 923 if (is_floatobject(w) && getfloatvalue(v) < 0.0) { 924 if (!err_occurred()) 925 err_setstr(ValueError, "negative number to float power"); 926 return NULL; 927 } 928 if (coerce(&v, &w) != 0) 929 return NULL; 930 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None); 931 DECREF(v); 932 DECREF(w); 933 return res; 934} 935 936static object * 937builtin_pow(self, args) 938 object *self; 939 object *args; 940{ 941 object *v, *w, *z = None, *res; 942 object *v1, *z1, *w2, *z2; 943 944 if (!newgetargs(args, "OO|O:pow", &v, &w, &z)) 945 return NULL; 946 if (z == None) 947 return do_pow(v, w); 948 /* XXX The ternary version doesn't do class instance coercions */ 949 if (is_instanceobject(v)) 950 return v->ob_type->tp_as_number->nb_power(v, w, z); 951 if (v->ob_type->tp_as_number == NULL || 952 z->ob_type->tp_as_number == NULL || 953 w->ob_type->tp_as_number == NULL) { 954 err_setstr(TypeError, "pow() requires numeric arguments"); 955 return NULL; 956 } 957 if (coerce(&v, &w) != 0) 958 return NULL; 959 res = NULL; 960 v1 = v; 961 z1 = z; 962 if (coerce(&v1, &z1) != 0) 963 goto error2; 964 w2 = w; 965 z2 = z1; 966 if (coerce(&w2, &z2) != 0) 967 goto error1; 968 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2); 969 DECREF(w2); 970 DECREF(z2); 971 error1: 972 DECREF(v1); 973 DECREF(z1); 974 error2: 975 DECREF(v); 976 DECREF(w); 977 return res; 978} 979 980static object * 981builtin_range(self, args) 982 object *self; 983 object *args; 984{ 985 long ilow = 0, ihigh = 0, istep = 1; 986 int i, n; 987 object *v; 988 989 if (gettuplesize(args) <= 1) { 990 if (!newgetargs(args, 991 "l;range() requires 1-3 int arguments", 992 &ihigh)) 993 return NULL; 994 } 995 else { 996 if (!newgetargs(args, 997 "ll|l;range() requires 1-3 int arguments", 998 &ilow, &ihigh, &istep)) 999 return NULL; 1000 } 1001 if (istep == 0) { 1002 err_setstr(ValueError, "zero step for range()"); 1003 return NULL; 1004 } 1005 /* XXX ought to check overflow of subtraction */ 1006 if (istep > 0) 1007 n = (ihigh - ilow + istep - 1) / istep; 1008 else 1009 n = (ihigh - ilow + istep + 1) / istep; 1010 if (n < 0) 1011 n = 0; 1012 v = newlistobject(n); 1013 if (v == NULL) 1014 return NULL; 1015 for (i = 0; i < n; i++) { 1016 object *w = newintobject(ilow); 1017 if (w == NULL) { 1018 DECREF(v); 1019 return NULL; 1020 } 1021 setlistitem(v, i, w); 1022 ilow += istep; 1023 } 1024 return v; 1025} 1026 1027static object * 1028builtin_xrange(self, args) 1029 object *self; 1030 object *args; 1031{ 1032 long ilow = 0, ihigh = 0, istep = 1; 1033 long n; 1034 1035 if (gettuplesize(args) <= 1) { 1036 if (!newgetargs(args, 1037 "l;xrange() requires 1-3 int arguments", 1038 &ihigh)) 1039 return NULL; 1040 } 1041 else { 1042 if (!newgetargs(args, 1043 "ll|l;xrange() requires 1-3 int arguments", 1044 &ilow, &ihigh, &istep)) 1045 return NULL; 1046 } 1047 if (istep == 0) { 1048 err_setstr(ValueError, "zero step for xrange()"); 1049 return NULL; 1050 } 1051 /* XXX ought to check overflow of subtraction */ 1052 if (istep > 0) 1053 n = (ihigh - ilow + istep - 1) / istep; 1054 else 1055 n = (ihigh - ilow + istep + 1) / istep; 1056 if (n < 0) 1057 n = 0; 1058 return newrangeobject(ilow, n, istep, 1); 1059} 1060 1061static object * 1062builtin_raw_input(self, args) 1063 object *self; 1064 object *args; 1065{ 1066 object *v = NULL; 1067 object *f; 1068 1069 if (!newgetargs(args, "|O:[raw_]input", &v)) 1070 return NULL; 1071 if (v != NULL) { 1072 f = sysget("stdout"); 1073 if (f == NULL) { 1074 err_setstr(RuntimeError, "lost sys.stdout"); 1075 return NULL; 1076 } 1077 flushline(); 1078 if (writeobject(v, f, PRINT_RAW) != 0) 1079 return NULL; 1080 } 1081 f = sysget("stdin"); 1082 if (f == NULL) { 1083 err_setstr(RuntimeError, "lost sys.stdin"); 1084 return NULL; 1085 } 1086 return filegetline(f, -1); 1087} 1088 1089static object * 1090builtin_reduce(self, args) 1091 object *self; 1092 object *args; 1093{ 1094 object *seq, *func, *result = NULL; 1095 sequence_methods *sqf; 1096 register int i; 1097 1098 if (!newgetargs(args, "OO|O:reduce", &func, &seq, &result)) 1099 return NULL; 1100 if (result != NULL) 1101 INCREF(result); 1102 1103 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) { 1104 err_setstr(TypeError, 1105 "2nd argument to reduce() must be a sequence object"); 1106 return NULL; 1107 } 1108 1109 if ((args = newtupleobject(2)) == NULL) 1110 goto Fail; 1111 1112 for (i = 0; ; ++i) { 1113 object *op2; 1114 1115 if (args->ob_refcnt > 1) { 1116 DECREF(args); 1117 if ((args = newtupleobject(2)) == NULL) 1118 goto Fail; 1119 } 1120 1121 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) { 1122 if (err_occurred() == IndexError) { 1123 err_clear(); 1124 break; 1125 } 1126 goto Fail; 1127 } 1128 1129 if (result == NULL) 1130 result = op2; 1131 else { 1132 settupleitem(args, 0, result); 1133 settupleitem(args, 1, op2); 1134 if ((result = call_object(func, args)) == NULL) 1135 goto Fail; 1136 } 1137 } 1138 1139 DECREF(args); 1140 1141 if (result == NULL) 1142 err_setstr(TypeError, 1143 "reduce of empty sequence with no initial value"); 1144 1145 return result; 1146 1147Fail: 1148 XDECREF(args); 1149 XDECREF(result); 1150 return NULL; 1151} 1152 1153static object * 1154builtin_reload(self, args) 1155 object *self; 1156 object *args; 1157{ 1158 object *v; 1159 1160 if (!newgetargs(args, "O:reload", &v)) 1161 return NULL; 1162 return reload_module(v); 1163} 1164 1165static object * 1166builtin_repr(self, args) 1167 object *self; 1168 object *args; 1169{ 1170 object *v; 1171 1172 if (!newgetargs(args, "O:repr", &v)) 1173 return NULL; 1174 return reprobject(v); 1175} 1176 1177static object * 1178builtin_round(self, args) 1179 object *self; 1180 object *args; 1181{ 1182 extern double floor PROTO((double)); 1183 extern double ceil PROTO((double)); 1184 double x; 1185 double f; 1186 int ndigits = 0; 1187 int i; 1188 1189 if (!newgetargs(args, "d|i:round", &x, &ndigits)) 1190 return NULL; 1191 f = 1.0; 1192 for (i = ndigits; --i >= 0; ) 1193 f = f*10.0; 1194 for (i = ndigits; ++i <= 0; ) 1195 f = f*0.1; 1196 if (x >= 0.0) 1197 return newfloatobject(floor(x*f + 0.5) / f); 1198 else 1199 return newfloatobject(ceil(x*f - 0.5) / f); 1200} 1201 1202static object * 1203builtin_str(self, args) 1204 object *self; 1205 object *args; 1206{ 1207 object *v; 1208 1209 if (!newgetargs(args, "O:str", &v)) 1210 return NULL; 1211 return strobject(v); 1212} 1213 1214static object * 1215builtin_tuple(self, args) 1216 object *self; 1217 object *args; 1218{ 1219 object *v; 1220 sequence_methods *sqf; 1221 1222 if (!newgetargs(args, "O:tuple", &v)) 1223 return NULL; 1224 if (is_tupleobject(v)) { 1225 INCREF(v); 1226 return v; 1227 } 1228 if (is_listobject(v)) 1229 return listtuple(v); 1230 if (is_stringobject(v)) { 1231 int n = getstringsize(v); 1232 object *t = newtupleobject(n); 1233 if (t != NULL) { 1234 int i; 1235 char *p = getstringvalue(v); 1236 for (i = 0; i < n; i++) { 1237 object *item = newsizedstringobject(p+i, 1); 1238 if (item == NULL) { 1239 DECREF(t); 1240 t = NULL; 1241 break; 1242 } 1243 settupleitem(t, i, item); 1244 } 1245 } 1246 return t; 1247 } 1248 /* Generic sequence object */ 1249 if ((sqf = v->ob_type->tp_as_sequence) != NULL) { 1250 int n = (*sqf->sq_length)(v); 1251 int i; 1252 object *t; 1253 if (n < 0) 1254 return NULL; 1255 t = newtupleobject(n); 1256 if (t == NULL) 1257 return NULL; 1258 for (i = 0; i < n; i++) { 1259 object *item = (*sqf->sq_item)(v, i); 1260 if (item == NULL) { 1261 DECREF(t); 1262 t = NULL; 1263 break; 1264 } 1265 settupleitem(t, i, item); 1266 } 1267 /* XXX Should support indefinite-length sequences */ 1268 return t; 1269 } 1270 /* None of the above */ 1271 err_setstr(TypeError, "tuple() argument must be a sequence"); 1272 return NULL; 1273} 1274 1275static object * 1276builtin_type(self, args) 1277 object *self; 1278 object *args; 1279{ 1280 object *v; 1281 1282 if (!newgetargs(args, "O:type", &v)) 1283 return NULL; 1284 v = (object *)v->ob_type; 1285 INCREF(v); 1286 return v; 1287} 1288 1289static object * 1290builtin_vars(self, args) 1291 object *self; 1292 object *args; 1293{ 1294 object *v = NULL; 1295 object *d; 1296 1297 if (!newgetargs(args, "|O:vars", &v)) 1298 return NULL; 1299 if (v == NULL) { 1300 d = getlocals(); 1301 INCREF(d); 1302 } 1303 else { 1304 d = getattr(v, "__dict__"); 1305 if (d == NULL) { 1306 err_setstr(TypeError, 1307 "vars() argument must have __dict__ attribute"); 1308 return NULL; 1309 } 1310 } 1311 return d; 1312} 1313 1314static struct methodlist builtin_methods[] = { 1315 {"__import__", builtin___import__, 1}, 1316 {"abs", builtin_abs, 1}, 1317 {"apply", builtin_apply, 1}, 1318 {"callable", builtin_callable, 1}, 1319 {"chr", builtin_chr, 1}, 1320 {"cmp", builtin_cmp, 1}, 1321 {"coerce", builtin_coerce, 1}, 1322 {"compile", builtin_compile, 1}, 1323 {"delattr", builtin_delattr, 1}, 1324 {"dir", builtin_dir, 1}, 1325 {"divmod", builtin_divmod, 1}, 1326 {"eval", builtin_eval, 1}, 1327 {"execfile", builtin_execfile, 1}, 1328 {"filter", builtin_filter, 1}, 1329 {"float", builtin_float, 1}, 1330 {"getattr", builtin_getattr, 1}, 1331 {"hasattr", builtin_hasattr, 1}, 1332 {"hash", builtin_hash, 1}, 1333 {"hex", builtin_hex, 1}, 1334 {"id", builtin_id, 1}, 1335 {"input", builtin_input, 1}, 1336 {"int", builtin_int, 1}, 1337 {"len", builtin_len, 1}, 1338 {"long", builtin_long, 1}, 1339 {"map", builtin_map, 1}, 1340 {"max", builtin_max, 1}, 1341 {"min", builtin_min, 1}, 1342 {"oct", builtin_oct, 1}, 1343 {"open", builtin_open, 1}, 1344 {"ord", builtin_ord, 1}, 1345 {"pow", builtin_pow, 1}, 1346 {"range", builtin_range, 1}, 1347 {"raw_input", builtin_raw_input, 1}, 1348 {"reduce", builtin_reduce, 1}, 1349 {"reload", builtin_reload, 1}, 1350 {"repr", builtin_repr, 1}, 1351 {"round", builtin_round, 1}, 1352 {"setattr", builtin_setattr, 1}, 1353 {"str", builtin_str, 1}, 1354 {"tuple", builtin_tuple, 1}, 1355 {"type", builtin_type, 1}, 1356 {"vars", builtin_vars, 1}, 1357 {"xrange", builtin_xrange, 1}, 1358 {NULL, NULL}, 1359}; 1360 1361static object *builtin_mod; 1362static object *builtin_dict; 1363 1364object * 1365getbuiltinmod() 1366{ 1367 return builtin_mod; 1368} 1369 1370object * 1371getbuiltindict() 1372{ 1373 return builtin_dict; 1374} 1375 1376/* Predefined exceptions */ 1377 1378object *AccessError; 1379object *AttributeError; 1380object *ConflictError; 1381object *EOFError; 1382object *IOError; 1383object *ImportError; 1384object *IndexError; 1385object *KeyError; 1386object *KeyboardInterrupt; 1387object *MemoryError; 1388object *NameError; 1389object *OverflowError; 1390object *RuntimeError; 1391object *SyntaxError; 1392object *SystemError; 1393object *SystemExit; 1394object *TypeError; 1395object *ValueError; 1396object *ZeroDivisionError; 1397 1398static object * 1399newstdexception(name) 1400 char *name; 1401{ 1402 object *v = newstringobject(name); 1403 if (v == NULL || dictinsert(builtin_dict, name, v) != 0) 1404 fatal("no mem for new standard exception"); 1405 return v; 1406} 1407 1408static void 1409initerrors() 1410{ 1411 AccessError = newstdexception("AccessError"); 1412 AttributeError = newstdexception("AttributeError"); 1413 ConflictError = newstdexception("ConflictError"); 1414 EOFError = newstdexception("EOFError"); 1415 IOError = newstdexception("IOError"); 1416 ImportError = newstdexception("ImportError"); 1417 IndexError = newstdexception("IndexError"); 1418 KeyError = newstdexception("KeyError"); 1419 KeyboardInterrupt = newstdexception("KeyboardInterrupt"); 1420 MemoryError = newstdexception("MemoryError"); 1421 NameError = newstdexception("NameError"); 1422 OverflowError = newstdexception("OverflowError"); 1423 RuntimeError = newstdexception("RuntimeError"); 1424 SyntaxError = newstdexception("SyntaxError"); 1425 SystemError = newstdexception("SystemError"); 1426 SystemExit = newstdexception("SystemExit"); 1427 TypeError = newstdexception("TypeError"); 1428 ValueError = newstdexception("ValueError"); 1429 ZeroDivisionError = newstdexception("ZeroDivisionError"); 1430} 1431 1432void 1433initbuiltin() 1434{ 1435 builtin_mod = initmodule("__builtin__", builtin_methods); 1436 builtin_dict = getmoduledict(builtin_mod); 1437 INCREF(builtin_dict); 1438 initerrors(); 1439 (void) dictinsert(builtin_dict, "None", None); 1440} 1441 1442 1443/* Helper for filter(): filter a tuple through a function */ 1444 1445static object * 1446filtertuple(func, tuple) 1447 object *func; 1448 object *tuple; 1449{ 1450 object *result; 1451 register int i, j; 1452 int len = gettuplesize(tuple); 1453 1454 if ((result = newtupleobject(len)) == NULL) 1455 return NULL; 1456 1457 for (i = j = 0; i < len; ++i) { 1458 object *item, *good; 1459 int ok; 1460 1461 if ((item = gettupleitem(tuple, i)) == NULL) 1462 goto Fail_1; 1463 if (func == None) { 1464 INCREF(item); 1465 good = item; 1466 } 1467 else { 1468 object *arg = mkvalue("(O)", item); 1469 if (arg == NULL) 1470 goto Fail_1; 1471 good = call_object(func, arg); 1472 DECREF(arg); 1473 if (good == NULL) 1474 goto Fail_1; 1475 } 1476 ok = testbool(good); 1477 DECREF(good); 1478 if (ok) { 1479 INCREF(item); 1480 if (settupleitem(result, j++, item) < 0) 1481 goto Fail_1; 1482 } 1483 } 1484 1485 if (resizetuple(&result, j, 0) < 0) 1486 return NULL; 1487 1488 return result; 1489 1490Fail_1: 1491 DECREF(result); 1492 return NULL; 1493} 1494 1495 1496/* Helper for filter(): filter a string through a function */ 1497 1498static object * 1499filterstring(func, strobj) 1500 object *func; 1501 object *strobj; 1502{ 1503 object *result; 1504 register int i, j; 1505 int len = getstringsize(strobj); 1506 1507 if (func == None) { 1508 /* No character is ever false -- share input string */ 1509 INCREF(strobj); 1510 return strobj; 1511 } 1512 if ((result = newsizedstringobject(NULL, len)) == NULL) 1513 return NULL; 1514 1515 for (i = j = 0; i < len; ++i) { 1516 object *item, *arg, *good; 1517 int ok; 1518 1519 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i); 1520 if (item == NULL) 1521 goto Fail_1; 1522 arg = mkvalue("(O)", item); 1523 DECREF(item); 1524 if (arg == NULL) 1525 goto Fail_1; 1526 good = call_object(func, arg); 1527 DECREF(arg); 1528 if (good == NULL) 1529 goto Fail_1; 1530 ok = testbool(good); 1531 DECREF(good); 1532 if (ok) 1533 GETSTRINGVALUE((stringobject *)result)[j++] = 1534 GETSTRINGVALUE((stringobject *)item)[0]; 1535 } 1536 1537 if (resizestring(&result, j) < 0) 1538 return NULL; 1539 1540 return result; 1541 1542Fail_1: 1543 DECREF(result); 1544 return NULL; 1545} 1546