1 2 #include "Python.h" 3 4 #include "clinic/_operator.c.h" 5 6 /*[clinic input] 7 module _operator 8 [clinic start generated code]*/ 9 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=672ecf48487521e7]*/ 10 11 PyDoc_STRVAR(operator_doc, 12 "Operator interface.\n\ 13 \n\ 14 This module exports a set of functions implemented in C corresponding\n\ 15 to the intrinsic operators of Python. For example, operator.add(x, y)\n\ 16 is equivalent to the expression x+y. The function names are those\n\ 17 used for special methods; variants without leading and trailing\n\ 18 '__' are also provided for convenience."); 19 20 21 /*[clinic input] 22 _operator.truth -> bool 23 24 a: object 25 / 26 27 Return True if a is true, False otherwise. 28 [clinic start generated code]*/ 29 30 static int 31 _operator_truth_impl(PyObject *module, PyObject *a) 32 /*[clinic end generated code: output=eaf87767234fa5d7 input=bc74a4cd90235875]*/ 33 { 34 return PyObject_IsTrue(a); 35 } 36 37 /*[clinic input] 38 _operator.add 39 40 a: object 41 b: object 42 / 43 44 Same as a + b. 45 [clinic start generated code]*/ 46 47 static PyObject * 48 _operator_add_impl(PyObject *module, PyObject *a, PyObject *b) 49 /*[clinic end generated code: output=8292984204f45164 input=5efe3bff856ac215]*/ 50 { 51 return PyNumber_Add(a, b); 52 } 53 54 /*[clinic input] 55 _operator.sub = _operator.add 56 57 Same as a - b. 58 [clinic start generated code]*/ 59 60 static PyObject * 61 _operator_sub_impl(PyObject *module, PyObject *a, PyObject *b) 62 /*[clinic end generated code: output=4adfc3b888c1ee2e input=6494c6b100b8e795]*/ 63 { 64 return PyNumber_Subtract(a, b); 65 } 66 67 /*[clinic input] 68 _operator.mul = _operator.add 69 70 Same as a * b. 71 [clinic start generated code]*/ 72 73 static PyObject * 74 _operator_mul_impl(PyObject *module, PyObject *a, PyObject *b) 75 /*[clinic end generated code: output=d24d66f55a01944c input=2368615b4358b70d]*/ 76 { 77 return PyNumber_Multiply(a, b); 78 } 79 80 /*[clinic input] 81 _operator.matmul = _operator.add 82 83 Same as a @ b. 84 [clinic start generated code]*/ 85 86 static PyObject * 87 _operator_matmul_impl(PyObject *module, PyObject *a, PyObject *b) 88 /*[clinic end generated code: output=a20d917eb35d0101 input=9ab304e37fb42dd4]*/ 89 { 90 return PyNumber_MatrixMultiply(a, b); 91 } 92 93 /*[clinic input] 94 _operator.floordiv = _operator.add 95 96 Same as a // b. 97 [clinic start generated code]*/ 98 99 static PyObject * 100 _operator_floordiv_impl(PyObject *module, PyObject *a, PyObject *b) 101 /*[clinic end generated code: output=df26b71a60589f99 input=bb2e88ba446c612c]*/ 102 { 103 return PyNumber_FloorDivide(a, b); 104 } 105 106 /*[clinic input] 107 _operator.truediv = _operator.add 108 109 Same as a / b. 110 [clinic start generated code]*/ 111 112 static PyObject * 113 _operator_truediv_impl(PyObject *module, PyObject *a, PyObject *b) 114 /*[clinic end generated code: output=0e6a959944d77719 input=ecbb947673f4eb1f]*/ 115 { 116 return PyNumber_TrueDivide(a, b); 117 } 118 119 /*[clinic input] 120 _operator.mod = _operator.add 121 122 Same as a % b. 123 [clinic start generated code]*/ 124 125 static PyObject * 126 _operator_mod_impl(PyObject *module, PyObject *a, PyObject *b) 127 /*[clinic end generated code: output=9519822f0bbec166 input=102e19b422342ac1]*/ 128 { 129 return PyNumber_Remainder(a, b); 130 } 131 132 /*[clinic input] 133 _operator.neg 134 135 a: object 136 / 137 138 Same as -a. 139 [clinic start generated code]*/ 140 141 static PyObject * 142 _operator_neg(PyObject *module, PyObject *a) 143 /*[clinic end generated code: output=36e08ecfc6a1c08c input=84f09bdcf27c96ec]*/ 144 { 145 return PyNumber_Negative(a); 146 } 147 148 /*[clinic input] 149 _operator.pos = _operator.neg 150 151 Same as +a. 152 [clinic start generated code]*/ 153 154 static PyObject * 155 _operator_pos(PyObject *module, PyObject *a) 156 /*[clinic end generated code: output=dad7a126221dd091 input=b6445b63fddb8772]*/ 157 { 158 return PyNumber_Positive(a); 159 } 160 161 /*[clinic input] 162 _operator.abs = _operator.neg 163 164 Same as abs(a). 165 [clinic start generated code]*/ 166 167 static PyObject * 168 _operator_abs(PyObject *module, PyObject *a) 169 /*[clinic end generated code: output=1389a93ba053ea3e input=341d07ba86f58039]*/ 170 { 171 return PyNumber_Absolute(a); 172 } 173 174 /*[clinic input] 175 _operator.inv = _operator.neg 176 177 Same as ~a. 178 [clinic start generated code]*/ 179 180 static PyObject * 181 _operator_inv(PyObject *module, PyObject *a) 182 /*[clinic end generated code: output=a56875ba075ee06d input=b01a4677739f6eb2]*/ 183 { 184 return PyNumber_Invert(a); 185 } 186 187 /*[clinic input] 188 _operator.invert = _operator.neg 189 190 Same as ~a. 191 [clinic start generated code]*/ 192 193 static PyObject * 194 _operator_invert(PyObject *module, PyObject *a) 195 /*[clinic end generated code: output=406b5aa030545fcc input=7f2d607176672e55]*/ 196 { 197 return PyNumber_Invert(a); 198 } 199 200 /*[clinic input] 201 _operator.lshift = _operator.add 202 203 Same as a << b. 204 [clinic start generated code]*/ 205 206 static PyObject * 207 _operator_lshift_impl(PyObject *module, PyObject *a, PyObject *b) 208 /*[clinic end generated code: output=37f7e52c41435bd8 input=746e8a160cbbc9eb]*/ 209 { 210 return PyNumber_Lshift(a, b); 211 } 212 213 /*[clinic input] 214 _operator.rshift = _operator.add 215 216 Same as a >> b. 217 [clinic start generated code]*/ 218 219 static PyObject * 220 _operator_rshift_impl(PyObject *module, PyObject *a, PyObject *b) 221 /*[clinic end generated code: output=4593c7ef30ec2ee3 input=d2c85bb5a64504c2]*/ 222 { 223 return PyNumber_Rshift(a, b); 224 } 225 226 /*[clinic input] 227 _operator.not_ = _operator.truth 228 229 Same as not a. 230 [clinic start generated code]*/ 231 232 static int 233 _operator_not__impl(PyObject *module, PyObject *a) 234 /*[clinic end generated code: output=743f9c24a09759ef input=854156d50804d9b8]*/ 235 { 236 return PyObject_Not(a); 237 } 238 239 /*[clinic input] 240 _operator.and_ = _operator.add 241 242 Same as a & b. 243 [clinic start generated code]*/ 244 245 static PyObject * 246 _operator_and__impl(PyObject *module, PyObject *a, PyObject *b) 247 /*[clinic end generated code: output=93c4fe88f7b76d9e input=4f3057c90ec4c99f]*/ 248 { 249 return PyNumber_And(a, b); 250 } 251 252 /*[clinic input] 253 _operator.xor = _operator.add 254 255 Same as a ^ b. 256 [clinic start generated code]*/ 257 258 static PyObject * 259 _operator_xor_impl(PyObject *module, PyObject *a, PyObject *b) 260 /*[clinic end generated code: output=b24cd8b79fde0004 input=3c5cfa7253d808dd]*/ 261 { 262 return PyNumber_Xor(a, b); 263 } 264 265 /*[clinic input] 266 _operator.or_ = _operator.add 267 268 Same as a | b. 269 [clinic start generated code]*/ 270 271 static PyObject * 272 _operator_or__impl(PyObject *module, PyObject *a, PyObject *b) 273 /*[clinic end generated code: output=58024867b8d90461 input=b40c6c44f7c79c09]*/ 274 { 275 return PyNumber_Or(a, b); 276 } 277 278 /*[clinic input] 279 _operator.iadd = _operator.add 280 281 Same as a += b. 282 [clinic start generated code]*/ 283 284 static PyObject * 285 _operator_iadd_impl(PyObject *module, PyObject *a, PyObject *b) 286 /*[clinic end generated code: output=07dc627832526eb5 input=d22a91c07ac69227]*/ 287 { 288 return PyNumber_InPlaceAdd(a, b); 289 } 290 291 /*[clinic input] 292 _operator.isub = _operator.add 293 294 Same as a -= b. 295 [clinic start generated code]*/ 296 297 static PyObject * 298 _operator_isub_impl(PyObject *module, PyObject *a, PyObject *b) 299 /*[clinic end generated code: output=4513467d23b5e0b1 input=4591b00d0a0ccafd]*/ 300 { 301 return PyNumber_InPlaceSubtract(a, b); 302 } 303 304 /*[clinic input] 305 _operator.imul = _operator.add 306 307 Same as a *= b. 308 [clinic start generated code]*/ 309 310 static PyObject * 311 _operator_imul_impl(PyObject *module, PyObject *a, PyObject *b) 312 /*[clinic end generated code: output=5e87dacd19a71eab input=0e01fb8631e1b76f]*/ 313 { 314 return PyNumber_InPlaceMultiply(a, b); 315 } 316 317 /*[clinic input] 318 _operator.imatmul = _operator.add 319 320 Same as a @= b. 321 [clinic start generated code]*/ 322 323 static PyObject * 324 _operator_imatmul_impl(PyObject *module, PyObject *a, PyObject *b) 325 /*[clinic end generated code: output=d603cbdf716ce519 input=bb614026372cd542]*/ 326 { 327 return PyNumber_InPlaceMatrixMultiply(a, b); 328 } 329 330 /*[clinic input] 331 _operator.ifloordiv = _operator.add 332 333 Same as a //= b. 334 [clinic start generated code]*/ 335 336 static PyObject * 337 _operator_ifloordiv_impl(PyObject *module, PyObject *a, PyObject *b) 338 /*[clinic end generated code: output=535336048c681794 input=9df3b5021cff4ca1]*/ 339 { 340 return PyNumber_InPlaceFloorDivide(a, b); 341 } 342 343 /*[clinic input] 344 _operator.itruediv = _operator.add 345 346 Same as a /= b. 347 [clinic start generated code]*/ 348 349 static PyObject * 350 _operator_itruediv_impl(PyObject *module, PyObject *a, PyObject *b) 351 /*[clinic end generated code: output=28017fbd3563952f input=9a1ee01608f5f590]*/ 352 { 353 return PyNumber_InPlaceTrueDivide(a, b); 354 } 355 356 /*[clinic input] 357 _operator.imod = _operator.add 358 359 Same as a %= b. 360 [clinic start generated code]*/ 361 362 static PyObject * 363 _operator_imod_impl(PyObject *module, PyObject *a, PyObject *b) 364 /*[clinic end generated code: output=f7c540ae0fc70904 input=d0c384a3ce38e1dd]*/ 365 { 366 return PyNumber_InPlaceRemainder(a, b); 367 } 368 369 /*[clinic input] 370 _operator.ilshift = _operator.add 371 372 Same as a <<= b. 373 [clinic start generated code]*/ 374 375 static PyObject * 376 _operator_ilshift_impl(PyObject *module, PyObject *a, PyObject *b) 377 /*[clinic end generated code: output=e73a8fee1ac18749 input=e21b6b310f54572e]*/ 378 { 379 return PyNumber_InPlaceLshift(a, b); 380 } 381 382 /*[clinic input] 383 _operator.irshift = _operator.add 384 385 Same as a >>= b. 386 [clinic start generated code]*/ 387 388 static PyObject * 389 _operator_irshift_impl(PyObject *module, PyObject *a, PyObject *b) 390 /*[clinic end generated code: output=97f2af6b5ff2ed81 input=6778dbd0f6e1ec16]*/ 391 { 392 return PyNumber_InPlaceRshift(a, b); 393 } 394 395 /*[clinic input] 396 _operator.iand = _operator.add 397 398 Same as a &= b. 399 [clinic start generated code]*/ 400 401 static PyObject * 402 _operator_iand_impl(PyObject *module, PyObject *a, PyObject *b) 403 /*[clinic end generated code: output=4599e9d40cbf7d00 input=71dfd8e70c156a7b]*/ 404 { 405 return PyNumber_InPlaceAnd(a, b); 406 } 407 408 /*[clinic input] 409 _operator.ixor = _operator.add 410 411 Same as a ^= b. 412 [clinic start generated code]*/ 413 414 static PyObject * 415 _operator_ixor_impl(PyObject *module, PyObject *a, PyObject *b) 416 /*[clinic end generated code: output=5ff881766872be03 input=695c32bec0604d86]*/ 417 { 418 return PyNumber_InPlaceXor(a, b); 419 } 420 421 /*[clinic input] 422 _operator.ior = _operator.add 423 424 Same as a |= b. 425 [clinic start generated code]*/ 426 427 static PyObject * 428 _operator_ior_impl(PyObject *module, PyObject *a, PyObject *b) 429 /*[clinic end generated code: output=48aac319445bf759 input=8f01d03eda9920cf]*/ 430 { 431 return PyNumber_InPlaceOr(a, b); 432 } 433 434 /*[clinic input] 435 _operator.concat = _operator.add 436 437 Same as a + b, for a and b sequences. 438 [clinic start generated code]*/ 439 440 static PyObject * 441 _operator_concat_impl(PyObject *module, PyObject *a, PyObject *b) 442 /*[clinic end generated code: output=80028390942c5f11 input=8544ccd5341a3658]*/ 443 { 444 return PySequence_Concat(a, b); 445 } 446 447 /*[clinic input] 448 _operator.iconcat = _operator.add 449 450 Same as a += b, for a and b sequences. 451 [clinic start generated code]*/ 452 453 static PyObject * 454 _operator_iconcat_impl(PyObject *module, PyObject *a, PyObject *b) 455 /*[clinic end generated code: output=3ea0a162ebb2e26d input=8f5fe5722fcd837e]*/ 456 { 457 return PySequence_InPlaceConcat(a, b); 458 } 459 460 /*[clinic input] 461 _operator.contains -> bool 462 463 a: object 464 b: object 465 / 466 467 Same as b in a (note reversed operands). 468 [clinic start generated code]*/ 469 470 static int 471 _operator_contains_impl(PyObject *module, PyObject *a, PyObject *b) 472 /*[clinic end generated code: output=413b4dbe82b6ffc1 input=9122a69b505fde13]*/ 473 { 474 return PySequence_Contains(a, b); 475 } 476 477 /*[clinic input] 478 _operator.indexOf -> Py_ssize_t 479 480 a: object 481 b: object 482 / 483 484 Return the first index of b in a. 485 [clinic start generated code]*/ 486 487 static Py_ssize_t 488 _operator_indexOf_impl(PyObject *module, PyObject *a, PyObject *b) 489 /*[clinic end generated code: output=c6226d8e0fb60fa6 input=8be2e43b6a6fffe3]*/ 490 { 491 return PySequence_Index(a, b); 492 } 493 494 /*[clinic input] 495 _operator.countOf = _operator.indexOf 496 497 Return the number of times b occurs in a. 498 [clinic start generated code]*/ 499 500 static Py_ssize_t 501 _operator_countOf_impl(PyObject *module, PyObject *a, PyObject *b) 502 /*[clinic end generated code: output=9e1623197daf3382 input=0c3a2656add252db]*/ 503 { 504 return PySequence_Count(a, b); 505 } 506 507 /*[clinic input] 508 _operator.getitem 509 510 a: object 511 b: object 512 / 513 514 Same as a[b]. 515 [clinic start generated code]*/ 516 517 static PyObject * 518 _operator_getitem_impl(PyObject *module, PyObject *a, PyObject *b) 519 /*[clinic end generated code: output=6c8d8101a676e594 input=6682797320e48845]*/ 520 { 521 return PyObject_GetItem(a, b); 522 } 523 524 /*[clinic input] 525 _operator.setitem 526 527 a: object 528 b: object 529 c: object 530 / 531 532 Same as a[b] = c. 533 [clinic start generated code]*/ 534 535 static PyObject * 536 _operator_setitem_impl(PyObject *module, PyObject *a, PyObject *b, 537 PyObject *c) 538 /*[clinic end generated code: output=1324f9061ae99e25 input=ceaf453c4d3a58df]*/ 539 { 540 if (-1 == PyObject_SetItem(a, b, c)) 541 return NULL; 542 Py_RETURN_NONE; 543 } 544 545 /*[clinic input] 546 _operator.delitem = _operator.getitem 547 548 Same as del a[b]. 549 [clinic start generated code]*/ 550 551 static PyObject * 552 _operator_delitem_impl(PyObject *module, PyObject *a, PyObject *b) 553 /*[clinic end generated code: output=db18f61506295799 input=991bec56a0d3ec7f]*/ 554 { 555 if (-1 == PyObject_DelItem(a, b)) 556 return NULL; 557 Py_RETURN_NONE; 558 } 559 560 /*[clinic input] 561 _operator.eq 562 563 a: object 564 b: object 565 / 566 567 Same as a == b. 568 [clinic start generated code]*/ 569 570 static PyObject * 571 _operator_eq_impl(PyObject *module, PyObject *a, PyObject *b) 572 /*[clinic end generated code: output=8d7d46ed4135677c input=586fca687a95a83f]*/ 573 { 574 return PyObject_RichCompare(a, b, Py_EQ); 575 } 576 577 /*[clinic input] 578 _operator.ne = _operator.eq 579 580 Same as a != b. 581 [clinic start generated code]*/ 582 583 static PyObject * 584 _operator_ne_impl(PyObject *module, PyObject *a, PyObject *b) 585 /*[clinic end generated code: output=c99bd0c3a4c01297 input=5d88f23d35e9abac]*/ 586 { 587 return PyObject_RichCompare(a, b, Py_NE); 588 } 589 590 /*[clinic input] 591 _operator.lt = _operator.eq 592 593 Same as a < b. 594 [clinic start generated code]*/ 595 596 static PyObject * 597 _operator_lt_impl(PyObject *module, PyObject *a, PyObject *b) 598 /*[clinic end generated code: output=082d7c45c440e535 input=34a59ad6d39d3a2b]*/ 599 { 600 return PyObject_RichCompare(a, b, Py_LT); 601 } 602 603 /*[clinic input] 604 _operator.le = _operator.eq 605 606 Same as a <= b. 607 [clinic start generated code]*/ 608 609 static PyObject * 610 _operator_le_impl(PyObject *module, PyObject *a, PyObject *b) 611 /*[clinic end generated code: output=00970a2923d0ae17 input=b812a7860a0bef44]*/ 612 { 613 return PyObject_RichCompare(a, b, Py_LE); 614 } 615 616 /*[clinic input] 617 _operator.gt = _operator.eq 618 619 Same as a > b. 620 [clinic start generated code]*/ 621 622 static PyObject * 623 _operator_gt_impl(PyObject *module, PyObject *a, PyObject *b) 624 /*[clinic end generated code: output=8d373349ecf25641 input=9bdb45b995ada35b]*/ 625 { 626 return PyObject_RichCompare(a, b, Py_GT); 627 } 628 629 /*[clinic input] 630 _operator.ge = _operator.eq 631 632 Same as a >= b. 633 [clinic start generated code]*/ 634 635 static PyObject * 636 _operator_ge_impl(PyObject *module, PyObject *a, PyObject *b) 637 /*[clinic end generated code: output=7ce3882256d4b137 input=cf1dc4a5ca9c35f5]*/ 638 { 639 return PyObject_RichCompare(a, b, Py_GE); 640 } 641 642 /*[clinic input] 643 _operator.pow = _operator.add 644 645 Same as a ** b. 646 [clinic start generated code]*/ 647 648 static PyObject * 649 _operator_pow_impl(PyObject *module, PyObject *a, PyObject *b) 650 /*[clinic end generated code: output=09e668ad50036120 input=690b40f097ab1637]*/ 651 { 652 return PyNumber_Power(a, b, Py_None); 653 } 654 655 /*[clinic input] 656 _operator.ipow = _operator.add 657 658 Same as a **= b. 659 [clinic start generated code]*/ 660 661 static PyObject * 662 _operator_ipow_impl(PyObject *module, PyObject *a, PyObject *b) 663 /*[clinic end generated code: output=7189ff4d4367c808 input=f00623899d07499a]*/ 664 { 665 return PyNumber_InPlacePower(a, b, Py_None); 666 } 667 668 /*[clinic input] 669 _operator.index 670 671 a: object 672 / 673 674 Same as a.__index__() 675 [clinic start generated code]*/ 676 677 static PyObject * 678 _operator_index(PyObject *module, PyObject *a) 679 /*[clinic end generated code: output=d972b0764ac305fc input=6f54d50ea64a579c]*/ 680 { 681 return PyNumber_Index(a); 682 } 683 684 /*[clinic input] 685 _operator.is_ = _operator.add 686 687 Same as a is b. 688 [clinic start generated code]*/ 689 690 static PyObject * 691 _operator_is__impl(PyObject *module, PyObject *a, PyObject *b) 692 /*[clinic end generated code: output=bcd47a402e482e1d input=5fa9b97df03c427f]*/ 693 { 694 PyObject *result; 695 result = (a == b) ? Py_True : Py_False; 696 Py_INCREF(result); 697 return result; 698 } 699 700 /*[clinic input] 701 _operator.is_not = _operator.add 702 703 Same as a is not b. 704 [clinic start generated code]*/ 705 706 static PyObject * 707 _operator_is_not_impl(PyObject *module, PyObject *a, PyObject *b) 708 /*[clinic end generated code: output=491a1f2f81f6c7f9 input=5a93f7e1a93535f1]*/ 709 { 710 PyObject *result; 711 result = (a != b) ? Py_True : Py_False; 712 Py_INCREF(result); 713 return result; 714 } 715 716 /* compare_digest **********************************************************/ 717 718 /* 719 * timing safe compare 720 * 721 * Returns 1 of the strings are equal. 722 * In case of len(a) != len(b) the function tries to keep the timing 723 * dependent on the length of b. CPU cache locally may still alter timing 724 * a bit. 725 */ 726 static int 727 _tscmp(const unsigned char *a, const unsigned char *b, 728 Py_ssize_t len_a, Py_ssize_t len_b) 729 { 730 /* The volatile type declarations make sure that the compiler has no 731 * chance to optimize and fold the code in any way that may change 732 * the timing. 733 */ 734 volatile Py_ssize_t length; 735 volatile const unsigned char *left; 736 volatile const unsigned char *right; 737 Py_ssize_t i; 738 unsigned char result; 739 740 /* loop count depends on length of b */ 741 length = len_b; 742 left = NULL; 743 right = b; 744 745 /* don't use else here to keep the amount of CPU instructions constant, 746 * volatile forces re-evaluation 747 * */ 748 if (len_a == length) { 749 left = *((volatile const unsigned char**)&a); 750 result = 0; 751 } 752 if (len_a != length) { 753 left = b; 754 result = 1; 755 } 756 757 for (i=0; i < length; i++) { 758 result |= *left++ ^ *right++; 759 } 760 761 return (result == 0); 762 } 763 764 /*[clinic input] 765 _operator.length_hint -> Py_ssize_t 766 767 obj: object 768 default: Py_ssize_t = 0 769 / 770 771 Return an estimate of the number of items in obj. 772 773 This is useful for presizing containers when building from an iterable. 774 775 If the object supports len(), the result will be exact. 776 Otherwise, it may over- or under-estimate by an arbitrary amount. 777 The result will be an integer >= 0. 778 [clinic start generated code]*/ 779 780 static Py_ssize_t 781 _operator_length_hint_impl(PyObject *module, PyObject *obj, 782 Py_ssize_t default_value) 783 /*[clinic end generated code: output=01d469edc1d612ad input=65ed29f04401e96a]*/ 784 { 785 return PyObject_LengthHint(obj, default_value); 786 } 787 788 /*[clinic input] 789 _operator._compare_digest = _operator.eq 790 791 Return 'a == b'. 792 793 This function uses an approach designed to prevent 794 timing analysis, making it appropriate for cryptography. 795 796 a and b must both be of the same type: either str (ASCII only), 797 or any bytes-like object. 798 799 Note: If a and b are of different lengths, or if an error occurs, 800 a timing attack could theoretically reveal information about the 801 types and lengths of a and b--but not their values. 802 [clinic start generated code]*/ 803 804 static PyObject * 805 _operator__compare_digest_impl(PyObject *module, PyObject *a, PyObject *b) 806 /*[clinic end generated code: output=11d452bdd3a23cbc input=9ac7e2c4e30bc356]*/ 807 { 808 int rc; 809 810 /* ASCII unicode string */ 811 if(PyUnicode_Check(a) && PyUnicode_Check(b)) { 812 if (PyUnicode_READY(a) == -1 || PyUnicode_READY(b) == -1) { 813 return NULL; 814 } 815 if (!PyUnicode_IS_ASCII(a) || !PyUnicode_IS_ASCII(b)) { 816 PyErr_SetString(PyExc_TypeError, 817 "comparing strings with non-ASCII characters is " 818 "not supported"); 819 return NULL; 820 } 821 822 rc = _tscmp(PyUnicode_DATA(a), 823 PyUnicode_DATA(b), 824 PyUnicode_GET_LENGTH(a), 825 PyUnicode_GET_LENGTH(b)); 826 } 827 /* fallback to buffer interface for bytes, bytesarray and other */ 828 else { 829 Py_buffer view_a; 830 Py_buffer view_b; 831 832 if (PyObject_CheckBuffer(a) == 0 && PyObject_CheckBuffer(b) == 0) { 833 PyErr_Format(PyExc_TypeError, 834 "unsupported operand types(s) or combination of types: " 835 "'%.100s' and '%.100s'", 836 Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name); 837 return NULL; 838 } 839 840 if (PyObject_GetBuffer(a, &view_a, PyBUF_SIMPLE) == -1) { 841 return NULL; 842 } 843 if (view_a.ndim > 1) { 844 PyErr_SetString(PyExc_BufferError, 845 "Buffer must be single dimension"); 846 PyBuffer_Release(&view_a); 847 return NULL; 848 } 849 850 if (PyObject_GetBuffer(b, &view_b, PyBUF_SIMPLE) == -1) { 851 PyBuffer_Release(&view_a); 852 return NULL; 853 } 854 if (view_b.ndim > 1) { 855 PyErr_SetString(PyExc_BufferError, 856 "Buffer must be single dimension"); 857 PyBuffer_Release(&view_a); 858 PyBuffer_Release(&view_b); 859 return NULL; 860 } 861 862 rc = _tscmp((const unsigned char*)view_a.buf, 863 (const unsigned char*)view_b.buf, 864 view_a.len, 865 view_b.len); 866 867 PyBuffer_Release(&view_a); 868 PyBuffer_Release(&view_b); 869 } 870 871 return PyBool_FromLong(rc); 872 } 873 874 /* operator methods **********************************************************/ 875 876 static struct PyMethodDef operator_methods[] = { 877 878 _OPERATOR_TRUTH_METHODDEF 879 _OPERATOR_CONTAINS_METHODDEF 880 _OPERATOR_INDEXOF_METHODDEF 881 _OPERATOR_COUNTOF_METHODDEF 882 _OPERATOR_IS__METHODDEF 883 _OPERATOR_IS_NOT_METHODDEF 884 _OPERATOR_INDEX_METHODDEF 885 _OPERATOR_ADD_METHODDEF 886 _OPERATOR_SUB_METHODDEF 887 _OPERATOR_MUL_METHODDEF 888 _OPERATOR_MATMUL_METHODDEF 889 _OPERATOR_FLOORDIV_METHODDEF 890 _OPERATOR_TRUEDIV_METHODDEF 891 _OPERATOR_MOD_METHODDEF 892 _OPERATOR_NEG_METHODDEF 893 _OPERATOR_POS_METHODDEF 894 _OPERATOR_ABS_METHODDEF 895 _OPERATOR_INV_METHODDEF 896 _OPERATOR_INVERT_METHODDEF 897 _OPERATOR_LSHIFT_METHODDEF 898 _OPERATOR_RSHIFT_METHODDEF 899 _OPERATOR_NOT__METHODDEF 900 _OPERATOR_AND__METHODDEF 901 _OPERATOR_XOR_METHODDEF 902 _OPERATOR_OR__METHODDEF 903 _OPERATOR_IADD_METHODDEF 904 _OPERATOR_ISUB_METHODDEF 905 _OPERATOR_IMUL_METHODDEF 906 _OPERATOR_IMATMUL_METHODDEF 907 _OPERATOR_IFLOORDIV_METHODDEF 908 _OPERATOR_ITRUEDIV_METHODDEF 909 _OPERATOR_IMOD_METHODDEF 910 _OPERATOR_ILSHIFT_METHODDEF 911 _OPERATOR_IRSHIFT_METHODDEF 912 _OPERATOR_IAND_METHODDEF 913 _OPERATOR_IXOR_METHODDEF 914 _OPERATOR_IOR_METHODDEF 915 _OPERATOR_CONCAT_METHODDEF 916 _OPERATOR_ICONCAT_METHODDEF 917 _OPERATOR_GETITEM_METHODDEF 918 _OPERATOR_SETITEM_METHODDEF 919 _OPERATOR_DELITEM_METHODDEF 920 _OPERATOR_POW_METHODDEF 921 _OPERATOR_IPOW_METHODDEF 922 _OPERATOR_EQ_METHODDEF 923 _OPERATOR_NE_METHODDEF 924 _OPERATOR_LT_METHODDEF 925 _OPERATOR_LE_METHODDEF 926 _OPERATOR_GT_METHODDEF 927 _OPERATOR_GE_METHODDEF 928 _OPERATOR__COMPARE_DIGEST_METHODDEF 929 _OPERATOR_LENGTH_HINT_METHODDEF 930 {NULL, NULL} /* sentinel */ 931 932 }; 933 934 /* itemgetter object **********************************************************/ 935 936 typedef struct { 937 PyObject_HEAD 938 Py_ssize_t nitems; 939 PyObject *item; 940 } itemgetterobject; 941 942 static PyTypeObject itemgetter_type; 943 944 /* AC 3.5: treats first argument as an iterable, otherwise uses *args */ 945 static PyObject * 946 itemgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 947 { 948 itemgetterobject *ig; 949 PyObject *item; 950 Py_ssize_t nitems; 951 952 if (!_PyArg_NoKeywords("itemgetter", kwds)) 953 return NULL; 954 955 nitems = PyTuple_GET_SIZE(args); 956 if (nitems <= 1) { 957 if (!PyArg_UnpackTuple(args, "itemgetter", 1, 1, &item)) 958 return NULL; 959 } else 960 item = args; 961 962 /* create itemgetterobject structure */ 963 ig = PyObject_GC_New(itemgetterobject, &itemgetter_type); 964 if (ig == NULL) 965 return NULL; 966 967 Py_INCREF(item); 968 ig->item = item; 969 ig->nitems = nitems; 970 971 PyObject_GC_Track(ig); 972 return (PyObject *)ig; 973 } 974 975 static void 976 itemgetter_dealloc(itemgetterobject *ig) 977 { 978 PyObject_GC_UnTrack(ig); 979 Py_XDECREF(ig->item); 980 PyObject_GC_Del(ig); 981 } 982 983 static int 984 itemgetter_traverse(itemgetterobject *ig, visitproc visit, void *arg) 985 { 986 Py_VISIT(ig->item); 987 return 0; 988 } 989 990 static PyObject * 991 itemgetter_call(itemgetterobject *ig, PyObject *args, PyObject *kw) 992 { 993 PyObject *obj, *result; 994 Py_ssize_t i, nitems=ig->nitems; 995 996 if (!_PyArg_NoKeywords("itemgetter", kw)) 997 return NULL; 998 if (!PyArg_UnpackTuple(args, "itemgetter", 1, 1, &obj)) 999 return NULL; 1000 if (nitems == 1) 1001 return PyObject_GetItem(obj, ig->item); 1002 1003 assert(PyTuple_Check(ig->item)); 1004 assert(PyTuple_GET_SIZE(ig->item) == nitems); 1005 1006 result = PyTuple_New(nitems); 1007 if (result == NULL) 1008 return NULL; 1009 1010 for (i=0 ; i < nitems ; i++) { 1011 PyObject *item, *val; 1012 item = PyTuple_GET_ITEM(ig->item, i); 1013 val = PyObject_GetItem(obj, item); 1014 if (val == NULL) { 1015 Py_DECREF(result); 1016 return NULL; 1017 } 1018 PyTuple_SET_ITEM(result, i, val); 1019 } 1020 return result; 1021 } 1022 1023 static PyObject * 1024 itemgetter_repr(itemgetterobject *ig) 1025 { 1026 PyObject *repr; 1027 const char *reprfmt; 1028 1029 int status = Py_ReprEnter((PyObject *)ig); 1030 if (status != 0) { 1031 if (status < 0) 1032 return NULL; 1033 return PyUnicode_FromFormat("%s(...)", Py_TYPE(ig)->tp_name); 1034 } 1035 1036 reprfmt = ig->nitems == 1 ? "%s(%R)" : "%s%R"; 1037 repr = PyUnicode_FromFormat(reprfmt, Py_TYPE(ig)->tp_name, ig->item); 1038 Py_ReprLeave((PyObject *)ig); 1039 return repr; 1040 } 1041 1042 static PyObject * 1043 itemgetter_reduce(itemgetterobject *ig) 1044 { 1045 if (ig->nitems == 1) 1046 return Py_BuildValue("O(O)", Py_TYPE(ig), ig->item); 1047 return PyTuple_Pack(2, Py_TYPE(ig), ig->item); 1048 } 1049 1050 PyDoc_STRVAR(reduce_doc, "Return state information for pickling"); 1051 1052 static PyMethodDef itemgetter_methods[] = { 1053 {"__reduce__", (PyCFunction)itemgetter_reduce, METH_NOARGS, 1054 reduce_doc}, 1055 {NULL} 1056 }; 1057 1058 PyDoc_STRVAR(itemgetter_doc, 1059 "itemgetter(item, ...) --> itemgetter object\n\ 1060 \n\ 1061 Return a callable object that fetches the given item(s) from its operand.\n\ 1062 After f = itemgetter(2), the call f(r) returns r[2].\n\ 1063 After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])"); 1064 1065 static PyTypeObject itemgetter_type = { 1066 PyVarObject_HEAD_INIT(NULL, 0) 1067 "operator.itemgetter", /* tp_name */ 1068 sizeof(itemgetterobject), /* tp_basicsize */ 1069 0, /* tp_itemsize */ 1070 /* methods */ 1071 (destructor)itemgetter_dealloc, /* tp_dealloc */ 1072 0, /* tp_print */ 1073 0, /* tp_getattr */ 1074 0, /* tp_setattr */ 1075 0, /* tp_reserved */ 1076 (reprfunc)itemgetter_repr, /* tp_repr */ 1077 0, /* tp_as_number */ 1078 0, /* tp_as_sequence */ 1079 0, /* tp_as_mapping */ 1080 0, /* tp_hash */ 1081 (ternaryfunc)itemgetter_call, /* tp_call */ 1082 0, /* tp_str */ 1083 PyObject_GenericGetAttr, /* tp_getattro */ 1084 0, /* tp_setattro */ 1085 0, /* tp_as_buffer */ 1086 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ 1087 itemgetter_doc, /* tp_doc */ 1088 (traverseproc)itemgetter_traverse, /* tp_traverse */ 1089 0, /* tp_clear */ 1090 0, /* tp_richcompare */ 1091 0, /* tp_weaklistoffset */ 1092 0, /* tp_iter */ 1093 0, /* tp_iternext */ 1094 itemgetter_methods, /* tp_methods */ 1095 0, /* tp_members */ 1096 0, /* tp_getset */ 1097 0, /* tp_base */ 1098 0, /* tp_dict */ 1099 0, /* tp_descr_get */ 1100 0, /* tp_descr_set */ 1101 0, /* tp_dictoffset */ 1102 0, /* tp_init */ 1103 0, /* tp_alloc */ 1104 itemgetter_new, /* tp_new */ 1105 0, /* tp_free */ 1106 }; 1107 1108 1109 /* attrgetter object **********************************************************/ 1110 1111 typedef struct { 1112 PyObject_HEAD 1113 Py_ssize_t nattrs; 1114 PyObject *attr; 1115 } attrgetterobject; 1116 1117 static PyTypeObject attrgetter_type; 1118 1119 /* AC 3.5: treats first argument as an iterable, otherwise uses *args */ 1120 static PyObject * 1121 attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 1122 { 1123 attrgetterobject *ag; 1124 PyObject *attr; 1125 Py_ssize_t nattrs, idx, char_idx; 1126 1127 if (!_PyArg_NoKeywords("attrgetter", kwds)) 1128 return NULL; 1129 1130 nattrs = PyTuple_GET_SIZE(args); 1131 if (nattrs <= 1) { 1132 if (!PyArg_UnpackTuple(args, "attrgetter", 1, 1, &attr)) 1133 return NULL; 1134 } 1135 1136 attr = PyTuple_New(nattrs); 1137 if (attr == NULL) 1138 return NULL; 1139 1140 /* prepare attr while checking args */ 1141 for (idx = 0; idx < nattrs; ++idx) { 1142 PyObject *item = PyTuple_GET_ITEM(args, idx); 1143 Py_ssize_t item_len; 1144 void *data; 1145 unsigned int kind; 1146 int dot_count; 1147 1148 if (!PyUnicode_Check(item)) { 1149 PyErr_SetString(PyExc_TypeError, 1150 "attribute name must be a string"); 1151 Py_DECREF(attr); 1152 return NULL; 1153 } 1154 if (PyUnicode_READY(item)) { 1155 Py_DECREF(attr); 1156 return NULL; 1157 } 1158 item_len = PyUnicode_GET_LENGTH(item); 1159 kind = PyUnicode_KIND(item); 1160 data = PyUnicode_DATA(item); 1161 1162 /* check whethere the string is dotted */ 1163 dot_count = 0; 1164 for (char_idx = 0; char_idx < item_len; ++char_idx) { 1165 if (PyUnicode_READ(kind, data, char_idx) == '.') 1166 ++dot_count; 1167 } 1168 1169 if (dot_count == 0) { 1170 Py_INCREF(item); 1171 PyUnicode_InternInPlace(&item); 1172 PyTuple_SET_ITEM(attr, idx, item); 1173 } else { /* make it a tuple of non-dotted attrnames */ 1174 PyObject *attr_chain = PyTuple_New(dot_count + 1); 1175 PyObject *attr_chain_item; 1176 Py_ssize_t unibuff_from = 0; 1177 Py_ssize_t unibuff_till = 0; 1178 Py_ssize_t attr_chain_idx = 0; 1179 1180 if (attr_chain == NULL) { 1181 Py_DECREF(attr); 1182 return NULL; 1183 } 1184 1185 for (; dot_count > 0; --dot_count) { 1186 while (PyUnicode_READ(kind, data, unibuff_till) != '.') { 1187 ++unibuff_till; 1188 } 1189 attr_chain_item = PyUnicode_Substring(item, 1190 unibuff_from, 1191 unibuff_till); 1192 if (attr_chain_item == NULL) { 1193 Py_DECREF(attr_chain); 1194 Py_DECREF(attr); 1195 return NULL; 1196 } 1197 PyUnicode_InternInPlace(&attr_chain_item); 1198 PyTuple_SET_ITEM(attr_chain, attr_chain_idx, attr_chain_item); 1199 ++attr_chain_idx; 1200 unibuff_till = unibuff_from = unibuff_till + 1; 1201 } 1202 1203 /* now add the last dotless name */ 1204 attr_chain_item = PyUnicode_Substring(item, 1205 unibuff_from, item_len); 1206 if (attr_chain_item == NULL) { 1207 Py_DECREF(attr_chain); 1208 Py_DECREF(attr); 1209 return NULL; 1210 } 1211 PyUnicode_InternInPlace(&attr_chain_item); 1212 PyTuple_SET_ITEM(attr_chain, attr_chain_idx, attr_chain_item); 1213 1214 PyTuple_SET_ITEM(attr, idx, attr_chain); 1215 } 1216 } 1217 1218 /* create attrgetterobject structure */ 1219 ag = PyObject_GC_New(attrgetterobject, &attrgetter_type); 1220 if (ag == NULL) { 1221 Py_DECREF(attr); 1222 return NULL; 1223 } 1224 1225 ag->attr = attr; 1226 ag->nattrs = nattrs; 1227 1228 PyObject_GC_Track(ag); 1229 return (PyObject *)ag; 1230 } 1231 1232 static void 1233 attrgetter_dealloc(attrgetterobject *ag) 1234 { 1235 PyObject_GC_UnTrack(ag); 1236 Py_XDECREF(ag->attr); 1237 PyObject_GC_Del(ag); 1238 } 1239 1240 static int 1241 attrgetter_traverse(attrgetterobject *ag, visitproc visit, void *arg) 1242 { 1243 Py_VISIT(ag->attr); 1244 return 0; 1245 } 1246 1247 static PyObject * 1248 dotted_getattr(PyObject *obj, PyObject *attr) 1249 { 1250 PyObject *newobj; 1251 1252 /* attr is either a tuple or instance of str. 1253 Ensured by the setup code of attrgetter_new */ 1254 if (PyTuple_CheckExact(attr)) { /* chained getattr */ 1255 Py_ssize_t name_idx = 0, name_count; 1256 PyObject *attr_name; 1257 1258 name_count = PyTuple_GET_SIZE(attr); 1259 Py_INCREF(obj); 1260 for (name_idx = 0; name_idx < name_count; ++name_idx) { 1261 attr_name = PyTuple_GET_ITEM(attr, name_idx); 1262 newobj = PyObject_GetAttr(obj, attr_name); 1263 Py_DECREF(obj); 1264 if (newobj == NULL) { 1265 return NULL; 1266 } 1267 /* here */ 1268 obj = newobj; 1269 } 1270 } else { /* single getattr */ 1271 newobj = PyObject_GetAttr(obj, attr); 1272 if (newobj == NULL) 1273 return NULL; 1274 obj = newobj; 1275 } 1276 1277 return obj; 1278 } 1279 1280 static PyObject * 1281 attrgetter_call(attrgetterobject *ag, PyObject *args, PyObject *kw) 1282 { 1283 PyObject *obj, *result; 1284 Py_ssize_t i, nattrs=ag->nattrs; 1285 1286 if (!_PyArg_NoKeywords("attrgetter", kw)) 1287 return NULL; 1288 if (!PyArg_UnpackTuple(args, "attrgetter", 1, 1, &obj)) 1289 return NULL; 1290 if (ag->nattrs == 1) /* ag->attr is always a tuple */ 1291 return dotted_getattr(obj, PyTuple_GET_ITEM(ag->attr, 0)); 1292 1293 assert(PyTuple_Check(ag->attr)); 1294 assert(PyTuple_GET_SIZE(ag->attr) == nattrs); 1295 1296 result = PyTuple_New(nattrs); 1297 if (result == NULL) 1298 return NULL; 1299 1300 for (i=0 ; i < nattrs ; i++) { 1301 PyObject *attr, *val; 1302 attr = PyTuple_GET_ITEM(ag->attr, i); 1303 val = dotted_getattr(obj, attr); 1304 if (val == NULL) { 1305 Py_DECREF(result); 1306 return NULL; 1307 } 1308 PyTuple_SET_ITEM(result, i, val); 1309 } 1310 return result; 1311 } 1312 1313 static PyObject * 1314 dotjoinattr(PyObject *attr, PyObject **attrsep) 1315 { 1316 if (PyTuple_CheckExact(attr)) { 1317 if (*attrsep == NULL) { 1318 *attrsep = PyUnicode_FromString("."); 1319 if (*attrsep == NULL) 1320 return NULL; 1321 } 1322 return PyUnicode_Join(*attrsep, attr); 1323 } else { 1324 Py_INCREF(attr); 1325 return attr; 1326 } 1327 } 1328 1329 static PyObject * 1330 attrgetter_args(attrgetterobject *ag) 1331 { 1332 Py_ssize_t i; 1333 PyObject *attrsep = NULL; 1334 PyObject *attrstrings = PyTuple_New(ag->nattrs); 1335 if (attrstrings == NULL) 1336 return NULL; 1337 1338 for (i = 0; i < ag->nattrs; ++i) { 1339 PyObject *attr = PyTuple_GET_ITEM(ag->attr, i); 1340 PyObject *attrstr = dotjoinattr(attr, &attrsep); 1341 if (attrstr == NULL) { 1342 Py_XDECREF(attrsep); 1343 Py_DECREF(attrstrings); 1344 return NULL; 1345 } 1346 PyTuple_SET_ITEM(attrstrings, i, attrstr); 1347 } 1348 Py_XDECREF(attrsep); 1349 return attrstrings; 1350 } 1351 1352 static PyObject * 1353 attrgetter_repr(attrgetterobject *ag) 1354 { 1355 PyObject *repr = NULL; 1356 int status = Py_ReprEnter((PyObject *)ag); 1357 if (status != 0) { 1358 if (status < 0) 1359 return NULL; 1360 return PyUnicode_FromFormat("%s(...)", Py_TYPE(ag)->tp_name); 1361 } 1362 1363 if (ag->nattrs == 1) { 1364 PyObject *attrsep = NULL; 1365 PyObject *attr = dotjoinattr(PyTuple_GET_ITEM(ag->attr, 0), &attrsep); 1366 if (attr != NULL) { 1367 repr = PyUnicode_FromFormat("%s(%R)", Py_TYPE(ag)->tp_name, attr); 1368 Py_DECREF(attr); 1369 } 1370 Py_XDECREF(attrsep); 1371 } 1372 else { 1373 PyObject *attrstrings = attrgetter_args(ag); 1374 if (attrstrings != NULL) { 1375 repr = PyUnicode_FromFormat("%s%R", 1376 Py_TYPE(ag)->tp_name, attrstrings); 1377 Py_DECREF(attrstrings); 1378 } 1379 } 1380 Py_ReprLeave((PyObject *)ag); 1381 return repr; 1382 } 1383 1384 static PyObject * 1385 attrgetter_reduce(attrgetterobject *ag) 1386 { 1387 PyObject *attrstrings = attrgetter_args(ag); 1388 if (attrstrings == NULL) 1389 return NULL; 1390 1391 return Py_BuildValue("ON", Py_TYPE(ag), attrstrings); 1392 } 1393 1394 static PyMethodDef attrgetter_methods[] = { 1395 {"__reduce__", (PyCFunction)attrgetter_reduce, METH_NOARGS, 1396 reduce_doc}, 1397 {NULL} 1398 }; 1399 1400 PyDoc_STRVAR(attrgetter_doc, 1401 "attrgetter(attr, ...) --> attrgetter object\n\ 1402 \n\ 1403 Return a callable object that fetches the given attribute(s) from its operand.\n\ 1404 After f = attrgetter('name'), the call f(r) returns r.name.\n\ 1405 After g = attrgetter('name', 'date'), the call g(r) returns (r.name, r.date).\n\ 1406 After h = attrgetter('name.first', 'name.last'), the call h(r) returns\n\ 1407 (r.name.first, r.name.last)."); 1408 1409 static PyTypeObject attrgetter_type = { 1410 PyVarObject_HEAD_INIT(NULL, 0) 1411 "operator.attrgetter", /* tp_name */ 1412 sizeof(attrgetterobject), /* tp_basicsize */ 1413 0, /* tp_itemsize */ 1414 /* methods */ 1415 (destructor)attrgetter_dealloc, /* tp_dealloc */ 1416 0, /* tp_print */ 1417 0, /* tp_getattr */ 1418 0, /* tp_setattr */ 1419 0, /* tp_reserved */ 1420 (reprfunc)attrgetter_repr, /* tp_repr */ 1421 0, /* tp_as_number */ 1422 0, /* tp_as_sequence */ 1423 0, /* tp_as_mapping */ 1424 0, /* tp_hash */ 1425 (ternaryfunc)attrgetter_call, /* tp_call */ 1426 0, /* tp_str */ 1427 PyObject_GenericGetAttr, /* tp_getattro */ 1428 0, /* tp_setattro */ 1429 0, /* tp_as_buffer */ 1430 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ 1431 attrgetter_doc, /* tp_doc */ 1432 (traverseproc)attrgetter_traverse, /* tp_traverse */ 1433 0, /* tp_clear */ 1434 0, /* tp_richcompare */ 1435 0, /* tp_weaklistoffset */ 1436 0, /* tp_iter */ 1437 0, /* tp_iternext */ 1438 attrgetter_methods, /* tp_methods */ 1439 0, /* tp_members */ 1440 0, /* tp_getset */ 1441 0, /* tp_base */ 1442 0, /* tp_dict */ 1443 0, /* tp_descr_get */ 1444 0, /* tp_descr_set */ 1445 0, /* tp_dictoffset */ 1446 0, /* tp_init */ 1447 0, /* tp_alloc */ 1448 attrgetter_new, /* tp_new */ 1449 0, /* tp_free */ 1450 }; 1451 1452 1453 /* methodcaller object **********************************************************/ 1454 1455 typedef struct { 1456 PyObject_HEAD 1457 PyObject *name; 1458 PyObject *args; 1459 PyObject *kwds; 1460 } methodcallerobject; 1461 1462 static PyTypeObject methodcaller_type; 1463 1464 /* AC 3.5: variable number of arguments, not currently support by AC */ 1465 static PyObject * 1466 methodcaller_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 1467 { 1468 methodcallerobject *mc; 1469 PyObject *name; 1470 1471 if (PyTuple_GET_SIZE(args) < 1) { 1472 PyErr_SetString(PyExc_TypeError, "methodcaller needs at least " 1473 "one argument, the method name"); 1474 return NULL; 1475 } 1476 1477 name = PyTuple_GET_ITEM(args, 0); 1478 if (!PyUnicode_Check(name)) { 1479 PyErr_SetString(PyExc_TypeError, 1480 "method name must be a string"); 1481 return NULL; 1482 } 1483 1484 /* create methodcallerobject structure */ 1485 mc = PyObject_GC_New(methodcallerobject, &methodcaller_type); 1486 if (mc == NULL) 1487 return NULL; 1488 1489 name = PyTuple_GET_ITEM(args, 0); 1490 Py_INCREF(name); 1491 PyUnicode_InternInPlace(&name); 1492 mc->name = name; 1493 1494 Py_XINCREF(kwds); 1495 mc->kwds = kwds; 1496 1497 mc->args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args)); 1498 if (mc->args == NULL) { 1499 Py_DECREF(mc); 1500 return NULL; 1501 } 1502 1503 PyObject_GC_Track(mc); 1504 return (PyObject *)mc; 1505 } 1506 1507 static void 1508 methodcaller_dealloc(methodcallerobject *mc) 1509 { 1510 PyObject_GC_UnTrack(mc); 1511 Py_XDECREF(mc->name); 1512 Py_XDECREF(mc->args); 1513 Py_XDECREF(mc->kwds); 1514 PyObject_GC_Del(mc); 1515 } 1516 1517 static int 1518 methodcaller_traverse(methodcallerobject *mc, visitproc visit, void *arg) 1519 { 1520 Py_VISIT(mc->args); 1521 Py_VISIT(mc->kwds); 1522 return 0; 1523 } 1524 1525 static PyObject * 1526 methodcaller_call(methodcallerobject *mc, PyObject *args, PyObject *kw) 1527 { 1528 PyObject *method, *obj, *result; 1529 1530 if (!_PyArg_NoKeywords("methodcaller", kw)) 1531 return NULL; 1532 if (!PyArg_UnpackTuple(args, "methodcaller", 1, 1, &obj)) 1533 return NULL; 1534 method = PyObject_GetAttr(obj, mc->name); 1535 if (method == NULL) 1536 return NULL; 1537 result = PyObject_Call(method, mc->args, mc->kwds); 1538 Py_DECREF(method); 1539 return result; 1540 } 1541 1542 static PyObject * 1543 methodcaller_repr(methodcallerobject *mc) 1544 { 1545 PyObject *argreprs, *repr = NULL, *sep, *joinedargreprs; 1546 Py_ssize_t numtotalargs, numposargs, numkwdargs, i; 1547 int status = Py_ReprEnter((PyObject *)mc); 1548 if (status != 0) { 1549 if (status < 0) 1550 return NULL; 1551 return PyUnicode_FromFormat("%s(...)", Py_TYPE(mc)->tp_name); 1552 } 1553 1554 numkwdargs = mc->kwds != NULL ? PyDict_GET_SIZE(mc->kwds) : 0; 1555 numposargs = PyTuple_GET_SIZE(mc->args); 1556 numtotalargs = numposargs + numkwdargs; 1557 1558 if (numtotalargs == 0) { 1559 repr = PyUnicode_FromFormat("%s(%R)", Py_TYPE(mc)->tp_name, mc->name); 1560 Py_ReprLeave((PyObject *)mc); 1561 return repr; 1562 } 1563 1564 argreprs = PyTuple_New(numtotalargs); 1565 if (argreprs == NULL) { 1566 Py_ReprLeave((PyObject *)mc); 1567 return NULL; 1568 } 1569 1570 for (i = 0; i < numposargs; ++i) { 1571 PyObject *onerepr = PyObject_Repr(PyTuple_GET_ITEM(mc->args, i)); 1572 if (onerepr == NULL) 1573 goto done; 1574 PyTuple_SET_ITEM(argreprs, i, onerepr); 1575 } 1576 1577 if (numkwdargs != 0) { 1578 PyObject *key, *value; 1579 Py_ssize_t pos = 0; 1580 while (PyDict_Next(mc->kwds, &pos, &key, &value)) { 1581 PyObject *onerepr = PyUnicode_FromFormat("%U=%R", key, value); 1582 if (onerepr == NULL) 1583 goto done; 1584 if (i >= numtotalargs) { 1585 i = -1; 1586 Py_DECREF(onerepr); 1587 break; 1588 } 1589 PyTuple_SET_ITEM(argreprs, i, onerepr); 1590 ++i; 1591 } 1592 if (i != numtotalargs) { 1593 PyErr_SetString(PyExc_RuntimeError, 1594 "keywords dict changed size during iteration"); 1595 goto done; 1596 } 1597 } 1598 1599 sep = PyUnicode_FromString(", "); 1600 if (sep == NULL) 1601 goto done; 1602 1603 joinedargreprs = PyUnicode_Join(sep, argreprs); 1604 Py_DECREF(sep); 1605 if (joinedargreprs == NULL) 1606 goto done; 1607 1608 repr = PyUnicode_FromFormat("%s(%R, %U)", Py_TYPE(mc)->tp_name, 1609 mc->name, joinedargreprs); 1610 Py_DECREF(joinedargreprs); 1611 1612 done: 1613 Py_DECREF(argreprs); 1614 Py_ReprLeave((PyObject *)mc); 1615 return repr; 1616 } 1617 1618 static PyObject * 1619 methodcaller_reduce(methodcallerobject *mc) 1620 { 1621 PyObject *newargs; 1622 if (!mc->kwds || PyDict_GET_SIZE(mc->kwds) == 0) { 1623 Py_ssize_t i; 1624 Py_ssize_t callargcount = PyTuple_GET_SIZE(mc->args); 1625 newargs = PyTuple_New(1 + callargcount); 1626 if (newargs == NULL) 1627 return NULL; 1628 Py_INCREF(mc->name); 1629 PyTuple_SET_ITEM(newargs, 0, mc->name); 1630 for (i = 0; i < callargcount; ++i) { 1631 PyObject *arg = PyTuple_GET_ITEM(mc->args, i); 1632 Py_INCREF(arg); 1633 PyTuple_SET_ITEM(newargs, i + 1, arg); 1634 } 1635 return Py_BuildValue("ON", Py_TYPE(mc), newargs); 1636 } 1637 else { 1638 PyObject *functools; 1639 PyObject *partial; 1640 PyObject *constructor; 1641 PyObject *newargs[2]; 1642 1643 _Py_IDENTIFIER(partial); 1644 functools = PyImport_ImportModule("functools"); 1645 if (!functools) 1646 return NULL; 1647 partial = _PyObject_GetAttrId(functools, &PyId_partial); 1648 Py_DECREF(functools); 1649 if (!partial) 1650 return NULL; 1651 1652 newargs[0] = (PyObject *)Py_TYPE(mc); 1653 newargs[1] = mc->name; 1654 constructor = _PyObject_FastCallDict(partial, newargs, 2, mc->kwds); 1655 1656 Py_DECREF(partial); 1657 return Py_BuildValue("NO", constructor, mc->args); 1658 } 1659 } 1660 1661 static PyMethodDef methodcaller_methods[] = { 1662 {"__reduce__", (PyCFunction)methodcaller_reduce, METH_NOARGS, 1663 reduce_doc}, 1664 {NULL} 1665 }; 1666 PyDoc_STRVAR(methodcaller_doc, 1667 "methodcaller(name, ...) --> methodcaller object\n\ 1668 \n\ 1669 Return a callable object that calls the given method on its operand.\n\ 1670 After f = methodcaller('name'), the call f(r) returns r.name().\n\ 1671 After g = methodcaller('name', 'date', foo=1), the call g(r) returns\n\ 1672 r.name('date', foo=1)."); 1673 1674 static PyTypeObject methodcaller_type = { 1675 PyVarObject_HEAD_INIT(NULL, 0) 1676 "operator.methodcaller", /* tp_name */ 1677 sizeof(methodcallerobject), /* tp_basicsize */ 1678 0, /* tp_itemsize */ 1679 /* methods */ 1680 (destructor)methodcaller_dealloc, /* tp_dealloc */ 1681 0, /* tp_print */ 1682 0, /* tp_getattr */ 1683 0, /* tp_setattr */ 1684 0, /* tp_reserved */ 1685 (reprfunc)methodcaller_repr, /* tp_repr */ 1686 0, /* tp_as_number */ 1687 0, /* tp_as_sequence */ 1688 0, /* tp_as_mapping */ 1689 0, /* tp_hash */ 1690 (ternaryfunc)methodcaller_call, /* tp_call */ 1691 0, /* tp_str */ 1692 PyObject_GenericGetAttr, /* tp_getattro */ 1693 0, /* tp_setattro */ 1694 0, /* tp_as_buffer */ 1695 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ 1696 methodcaller_doc, /* tp_doc */ 1697 (traverseproc)methodcaller_traverse, /* tp_traverse */ 1698 0, /* tp_clear */ 1699 0, /* tp_richcompare */ 1700 0, /* tp_weaklistoffset */ 1701 0, /* tp_iter */ 1702 0, /* tp_iternext */ 1703 methodcaller_methods, /* tp_methods */ 1704 0, /* tp_members */ 1705 0, /* tp_getset */ 1706 0, /* tp_base */ 1707 0, /* tp_dict */ 1708 0, /* tp_descr_get */ 1709 0, /* tp_descr_set */ 1710 0, /* tp_dictoffset */ 1711 0, /* tp_init */ 1712 0, /* tp_alloc */ 1713 methodcaller_new, /* tp_new */ 1714 0, /* tp_free */ 1715 }; 1716 1717 1718 /* Initialization function for the module (*must* be called PyInit__operator) */ 1719 1720 1721 static struct PyModuleDef operatormodule = { 1722 PyModuleDef_HEAD_INIT, 1723 "_operator", 1724 operator_doc, 1725 -1, 1726 operator_methods, 1727 NULL, 1728 NULL, 1729 NULL, 1730 NULL 1731 }; 1732 1733 PyMODINIT_FUNC 1734 PyInit__operator(void) 1735 { 1736 PyObject *m; 1737 1738 /* Create the module and add the functions */ 1739 m = PyModule_Create(&operatormodule); 1740 if (m == NULL) 1741 return NULL; 1742 1743 if (PyType_Ready(&itemgetter_type) < 0) 1744 return NULL; 1745 Py_INCREF(&itemgetter_type); 1746 PyModule_AddObject(m, "itemgetter", (PyObject *)&itemgetter_type); 1747 1748 if (PyType_Ready(&attrgetter_type) < 0) 1749 return NULL; 1750 Py_INCREF(&attrgetter_type); 1751 PyModule_AddObject(m, "attrgetter", (PyObject *)&attrgetter_type); 1752 1753 if (PyType_Ready(&methodcaller_type) < 0) 1754 return NULL; 1755 Py_INCREF(&methodcaller_type); 1756 PyModule_AddObject(m, "methodcaller", (PyObject *)&methodcaller_type); 1757 return m; 1758 } 1759