_operator.c 49 KB

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