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