14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "Python.h" 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(operator_doc, 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Operator interface.\n\ 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThis module exports a set of functions implemented in C corresponding\n\ 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmto the intrinsic operators of Python. For example, operator.add(x, y)\n\ 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmis equivalent to the expression x+y. The function names are those\n\ 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmused for special methods; variants without leading and trailing\n\ 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm'__' are also provided for convenience."); 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define spam1(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a1) { \ 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return AOP(a1); } 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define spam2(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \ 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *a1, *a2; \ 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \ 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return AOP(a1,a2); } 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define spamoi(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \ 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *a1; int a2; \ 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if(! PyArg_ParseTuple(a,"Oi:" #OP,&a1,&a2)) return NULL; \ 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return AOP(a1,a2); } 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define spam2n(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \ 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *a1, *a2; \ 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \ 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if(-1 == AOP(a1,a2)) return NULL; \ 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); \ 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_None; } 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define spam3n(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \ 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *a1, *a2, *a3; \ 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if(! PyArg_UnpackTuple(a,#OP,3,3,&a1,&a2,&a3)) return NULL; \ 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if(-1 == AOP(a1,a2,a3)) return NULL; \ 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); \ 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_None; } 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define spami(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a1) { \ 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long r; \ 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if(-1 == (r=AOP(a1))) return NULL; \ 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(r); } 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define spami2(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \ 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *a1, *a2; long r; \ 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \ 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if(-1 == (r=AOP(a1,a2))) return NULL; \ 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyInt_FromLong(r); } 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define spamn2(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \ 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *a1, *a2; Py_ssize_t r; \ 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \ 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if(-1 == (r=AOP(a1,a2))) return NULL; \ 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyInt_FromSsize_t(r); } 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define spami2b(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \ 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *a1, *a2; long r; \ 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \ 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if(-1 == (r=AOP(a1,a2))) return NULL; \ 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyBool_FromLong(r); } 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define spamrc(OP,A) static PyObject *OP(PyObject *s, PyObject *a) { \ 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *a1, *a2; \ 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \ 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyObject_RichCompare(a1,a2,A); } 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Deprecated operators that need warnings. */ 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmop_isCallable(PyObject *x) 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_WarnPy3k("operator.isCallable() is not supported in 3.x. " 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Use hasattr(obj, '__call__').", 1) < 0) 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyCallable_Check(x); 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmop_sequenceIncludes(PyObject *seq, PyObject* ob) 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_WarnPy3k("operator.sequenceIncludes() is not supported " 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "in 3.x. Use operator.contains().", 1) < 0) 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PySequence_Contains(seq, ob); 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspami(isCallable , op_isCallable) 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspami(isNumberType , PyNumber_Check) 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspami(truth , PyObject_IsTrue) 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_add , PyNumber_Add) 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_sub , PyNumber_Subtract) 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_mul , PyNumber_Multiply) 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_div , PyNumber_Divide) 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_floordiv , PyNumber_FloorDivide) 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_truediv , PyNumber_TrueDivide) 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_mod , PyNumber_Remainder) 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam1(op_neg , PyNumber_Negative) 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam1(op_pos , PyNumber_Positive) 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam1(op_abs , PyNumber_Absolute) 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam1(op_inv , PyNumber_Invert) 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam1(op_invert , PyNumber_Invert) 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_lshift , PyNumber_Lshift) 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_rshift , PyNumber_Rshift) 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspami(op_not_ , PyObject_Not) 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_and_ , PyNumber_And) 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_xor , PyNumber_Xor) 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_or_ , PyNumber_Or) 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_iadd , PyNumber_InPlaceAdd) 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_isub , PyNumber_InPlaceSubtract) 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_imul , PyNumber_InPlaceMultiply) 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_idiv , PyNumber_InPlaceDivide) 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_ifloordiv , PyNumber_InPlaceFloorDivide) 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_itruediv , PyNumber_InPlaceTrueDivide) 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_imod , PyNumber_InPlaceRemainder) 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_ilshift , PyNumber_InPlaceLshift) 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_irshift , PyNumber_InPlaceRshift) 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_iand , PyNumber_InPlaceAnd) 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_ixor , PyNumber_InPlaceXor) 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_ior , PyNumber_InPlaceOr) 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspami(isSequenceType , PySequence_Check) 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_concat , PySequence_Concat) 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspamoi(op_repeat , PySequence_Repeat) 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_iconcat , PySequence_InPlaceConcat) 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspamoi(op_irepeat , PySequence_InPlaceRepeat) 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspami2b(op_contains , PySequence_Contains) 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspami2b(sequenceIncludes, op_sequenceIncludes) 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspamn2(indexOf , PySequence_Index) 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspamn2(countOf , PySequence_Count) 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspami(isMappingType , PyMapping_Check) 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(op_getitem , PyObject_GetItem) 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2n(op_delitem , PyObject_DelItem) 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam3n(op_setitem , PyObject_SetItem) 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspamrc(op_lt , Py_LT) 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspamrc(op_le , Py_LE) 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspamrc(op_eq , Py_EQ) 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspamrc(op_ne , Py_NE) 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspamrc(op_gt , Py_GT) 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspamrc(op_ge , Py_GE) 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmop_pow(PyObject *s, PyObject *a) 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *a1, *a2; 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyArg_UnpackTuple(a,"pow", 2, 2, &a1, &a2)) 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyNumber_Power(a1, a2, Py_None); 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmop_ipow(PyObject *s, PyObject *a) 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *a1, *a2; 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyArg_UnpackTuple(a,"ipow", 2, 2, &a1, &a2)) 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyNumber_InPlacePower(a1, a2, Py_None); 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmop_index(PyObject *s, PyObject *a) 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyNumber_Index(a); 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmis_(PyObject *s, PyObject *a) 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *a1, *a2, *result = NULL; 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyArg_UnpackTuple(a,"is_", 2, 2, &a1, &a2)) { 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = (a1 == a2) ? Py_True : Py_False; 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(result); 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmis_not(PyObject *s, PyObject *a) 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *a1, *a2, *result = NULL; 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyArg_UnpackTuple(a,"is_not", 2, 2, &a1, &a2)) { 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = (a1 != a2) ? Py_True : Py_False; 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(result); 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmop_getslice(PyObject *s, PyObject *a) 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *a1; 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t a2, a3; 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(a, "Onn:getslice", &a1, &a2, &a3)) 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PySequence_GetSlice(a1, a2, a3); 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmop_setslice(PyObject *s, PyObject *a) 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *a1, *a4; 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t a2, a3; 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(a, "OnnO:setslice", &a1, &a2, &a3, &a4)) 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (-1 == PySequence_SetSlice(a1, a2, a3, a4)) 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_RETURN_NONE; 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmop_delslice(PyObject *s, PyObject *a) 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *a1; 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t a2, a3; 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(a, "Onn:delslice", &a1, &a2, &a3)) 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (-1 == PySequence_DelSlice(a1, a2, a3)) 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_RETURN_NONE; 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef spam1 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef spam2 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef spam1o 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef spam1o 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define spam1(OP,DOC) {#OP, OP, METH_VARARGS, PyDoc_STR(DOC)}, 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define spam2(OP,ALTOP,DOC) {#OP, op_##OP, METH_VARARGS, PyDoc_STR(DOC)}, \ 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {#ALTOP, op_##OP, METH_VARARGS, PyDoc_STR(DOC)}, 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define spam1o(OP,DOC) {#OP, OP, METH_O, PyDoc_STR(DOC)}, 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define spam2o(OP,ALTOP,DOC) {#OP, op_##OP, METH_O, PyDoc_STR(DOC)}, \ 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {#ALTOP, op_##OP, METH_O, PyDoc_STR(DOC)}, 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic struct PyMethodDef operator_methods[] = { 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam1o(isCallable, 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "isCallable(a) -- Same as callable(a).") 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam1o(isNumberType, 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "isNumberType(a) -- Return True if a has a numeric type, False otherwise.") 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam1o(isSequenceType, 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "isSequenceType(a) -- Return True if a has a sequence type, False otherwise.") 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam1o(truth, 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "truth(a) -- Return True if a is true, False otherwise.") 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(contains,__contains__, 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "contains(a, b) -- Same as b in a (note reversed operands).") 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam1(sequenceIncludes, 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "sequenceIncludes(a, b) -- Same as b in a (note reversed operands; deprecated).") 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam1(indexOf, 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "indexOf(a, b) -- Return the first index of b in a.") 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam1(countOf, 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "countOf(a, b) -- Return the number of times b occurs in a.") 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam1o(isMappingType, 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "isMappingType(a) -- Return True if a has a mapping type, False otherwise.") 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam1(is_, "is_(a, b) -- Same as a is b.") 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam1(is_not, "is_not(a, b) -- Same as a is not b.") 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2o(index, __index__, "index(a) -- Same as a.__index__()") 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(add,__add__, "add(a, b) -- Same as a + b.") 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(sub,__sub__, "sub(a, b) -- Same as a - b.") 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(mul,__mul__, "mul(a, b) -- Same as a * b.") 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(div,__div__, "div(a, b) -- Same as a / b when __future__.division is not in effect.") 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(floordiv,__floordiv__, "floordiv(a, b) -- Same as a // b.") 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(truediv,__truediv__, "truediv(a, b) -- Same as a / b when __future__.division is in effect.") 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(mod,__mod__, "mod(a, b) -- Same as a % b.") 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2o(neg,__neg__, "neg(a) -- Same as -a.") 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2o(pos,__pos__, "pos(a) -- Same as +a.") 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2o(abs,__abs__, "abs(a) -- Same as abs(a).") 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2o(inv,__inv__, "inv(a) -- Same as ~a.") 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2o(invert,__invert__, "invert(a) -- Same as ~a.") 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(lshift,__lshift__, "lshift(a, b) -- Same as a << b.") 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(rshift,__rshift__, "rshift(a, b) -- Same as a >> b.") 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2o(not_,__not__, "not_(a) -- Same as not a.") 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(and_,__and__, "and_(a, b) -- Same as a & b.") 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(xor,__xor__, "xor(a, b) -- Same as a ^ b.") 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(or_,__or__, "or_(a, b) -- Same as a | b.") 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(iadd,__iadd__, "a = iadd(a, b) -- Same as a += b.") 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(isub,__isub__, "a = isub(a, b) -- Same as a -= b.") 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(imul,__imul__, "a = imul(a, b) -- Same as a *= b.") 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(idiv,__idiv__, "a = idiv(a, b) -- Same as a /= b when __future__.division is not in effect.") 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(ifloordiv,__ifloordiv__, "a = ifloordiv(a, b) -- Same as a //= b.") 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(itruediv,__itruediv__, "a = itruediv(a, b) -- Same as a /= b when __future__.division is in effect.") 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(imod,__imod__, "a = imod(a, b) -- Same as a %= b.") 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(ilshift,__ilshift__, "a = ilshift(a, b) -- Same as a <<= b.") 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(irshift,__irshift__, "a = irshift(a, b) -- Same as a >>= b.") 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(iand,__iand__, "a = iand(a, b) -- Same as a &= b.") 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(ixor,__ixor__, "a = ixor(a, b) -- Same as a ^= b.") 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(ior,__ior__, "a = ior(a, b) -- Same as a |= b.") 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(concat,__concat__, 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "concat(a, b) -- Same as a + b, for a and b sequences.") 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(repeat,__repeat__, 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "repeat(a, b) -- Return a * b, where a is a sequence, and b is an integer.") 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(iconcat,__iconcat__, 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "a = iconcat(a, b) -- Same as a += b, for a and b sequences.") 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(irepeat,__irepeat__, 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "a = irepeat(a, b) -- Same as a *= b, where a is a sequence, and b is an integer.") 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(getitem,__getitem__, 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "getitem(a, b) -- Same as a[b].") 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(setitem,__setitem__, 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "setitem(a, b, c) -- Same as a[b] = c.") 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(delitem,__delitem__, 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "delitem(a, b) -- Same as del a[b].") 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(pow,__pow__, "pow(a, b) -- Same as a ** b.") 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(ipow,__ipow__, "a = ipow(a, b) -- Same as a **= b.") 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(getslice,__getslice__, 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "getslice(a, b, c) -- Same as a[b:c].") 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(setslice,__setslice__, 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"setslice(a, b, c, d) -- Same as a[b:c] = d.") 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(delslice,__delslice__, 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"delslice(a, b, c) -- Same as del a[b:c].") 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(lt,__lt__, "lt(a, b) -- Same as a<b.") 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(le,__le__, "le(a, b) -- Same as a<=b.") 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(eq,__eq__, "eq(a, b) -- Same as a==b.") 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(ne,__ne__, "ne(a, b) -- Same as a!=b.") 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(gt,__gt__, "gt(a, b) -- Same as a>b.") 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmspam2(ge,__ge__, "ge(a, b) -- Same as a>=b.") 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {NULL, NULL} /* sentinel */ 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* itemgetter object **********************************************************/ 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct { 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_HEAD 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t nitems; 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *item; 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} itemgetterobject; 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject itemgetter_type; 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmitemgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm itemgetterobject *ig; 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *item; 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t nitems; 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!_PyArg_NoKeywords("itemgetter()", kwds)) 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nitems = PyTuple_GET_SIZE(args); 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (nitems <= 1) { 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_UnpackTuple(args, "itemgetter", 1, 1, &item)) 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm item = args; 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* create itemgetterobject structure */ 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ig = PyObject_GC_New(itemgetterobject, &itemgetter_type); 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ig == NULL) 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(item); 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ig->item = item; 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ig->nitems = nitems; 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GC_Track(ig); 3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *)ig; 3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmitemgetter_dealloc(itemgetterobject *ig) 3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GC_UnTrack(ig); 3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(ig->item); 3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GC_Del(ig); 3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmitemgetter_traverse(itemgetterobject *ig, visitproc visit, void *arg) 3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(ig->item); 3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmitemgetter_call(itemgetterobject *ig, PyObject *args, PyObject *kw) 3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *obj, *result; 3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i, nitems=ig->nitems; 3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_UnpackTuple(args, "itemgetter", 1, 1, &obj)) 3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (nitems == 1) 3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyObject_GetItem(obj, ig->item); 3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(PyTuple_Check(ig->item)); 3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(PyTuple_GET_SIZE(ig->item) == nitems); 3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = PyTuple_New(nitems); 3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == NULL) 3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i=0 ; i < nitems ; i++) { 3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *item, *val; 4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm item = PyTuple_GET_ITEM(ig->item, i); 4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm val = PyObject_GetItem(obj, item); 4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (val == NULL) { 4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(result); 4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(result, i, val); 4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(itemgetter_doc, 4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"itemgetter(item, ...) --> itemgetter object\n\ 4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a callable object that fetches the given item(s) from its operand.\n\ 4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAfter, f=itemgetter(2), the call f(r) returns r[2].\n\ 4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAfter, g=itemgetter(2,5,3), the call g(r) returns (r[2], r[5], r[3])"); 4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject itemgetter_type = { 4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyVarObject_HEAD_INIT(NULL, 0) 4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "operator.itemgetter", /* tp_name */ 4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sizeof(itemgetterobject), /* tp_basicsize */ 4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_itemsize */ 4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* methods */ 4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (destructor)itemgetter_dealloc, /* tp_dealloc */ 4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_print */ 4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_getattr */ 4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_setattr */ 4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_compare */ 4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_repr */ 4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_number */ 4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_sequence */ 4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_mapping */ 4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_hash */ 4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (ternaryfunc)itemgetter_call, /* tp_call */ 4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_str */ 4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GenericGetAttr, /* tp_getattro */ 4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_setattro */ 4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_buffer */ 4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ 4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm itemgetter_doc, /* tp_doc */ 4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (traverseproc)itemgetter_traverse, /* tp_traverse */ 4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_clear */ 4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_richcompare */ 4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_weaklistoffset */ 4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_iter */ 4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_iternext */ 4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_methods */ 4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_members */ 4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_getset */ 4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_base */ 4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_dict */ 4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_descr_get */ 4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_descr_set */ 4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_dictoffset */ 4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_init */ 4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_alloc */ 4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm itemgetter_new, /* tp_new */ 4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_free */ 4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* attrgetter object **********************************************************/ 4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct { 4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_HEAD 4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t nattrs; 4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *attr; 4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} attrgetterobject; 4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject attrgetter_type; 4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmattrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm attrgetterobject *ag; 4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *attr; 4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t nattrs; 4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!_PyArg_NoKeywords("attrgetter()", kwds)) 4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nattrs = PyTuple_GET_SIZE(args); 4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (nattrs <= 1) { 4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_UnpackTuple(args, "attrgetter", 1, 1, &attr)) 4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else 4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm attr = args; 4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* create attrgetterobject structure */ 4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ag = PyObject_GC_New(attrgetterobject, &attrgetter_type); 4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ag == NULL) 4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(attr); 4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ag->attr = attr; 4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ag->nattrs = nattrs; 4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GC_Track(ag); 4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *)ag; 5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmattrgetter_dealloc(attrgetterobject *ag) 5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GC_UnTrack(ag); 5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(ag->attr); 5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GC_Del(ag); 5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmattrgetter_traverse(attrgetterobject *ag, visitproc visit, void *arg) 5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(ag->attr); 5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdotted_getattr(PyObject *obj, PyObject *attr) 5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s, *p; 5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyUnicode_Check(attr)) { 5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm attr = _PyUnicode_AsDefaultEncodedString(attr, NULL); 5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (attr == NULL) 5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyString_Check(attr)) { 5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, 5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "attribute name must be a string"); 5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = PyString_AS_STRING(attr); 5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(obj); 5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (;;) { 5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *newobj, *str; 5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = strchr(s, '.'); 5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm str = p ? PyString_FromStringAndSize(s, (p-s)) : 5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromString(s); 5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (str == NULL) { 5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(obj); 5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newobj = PyObject_GetAttr(obj, str); 5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(str); 5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(obj); 5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (newobj == NULL) 5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj = newobj; 5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (p == NULL) break; 5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = p+1; 5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return obj; 5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmattrgetter_call(attrgetterobject *ag, PyObject *args, PyObject *kw) 5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *obj, *result; 5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t i, nattrs=ag->nattrs; 5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_UnpackTuple(args, "attrgetter", 1, 1, &obj)) 5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ag->nattrs == 1) 5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return dotted_getattr(obj, ag->attr); 5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(PyTuple_Check(ag->attr)); 5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert(PyTuple_GET_SIZE(ag->attr) == nattrs); 5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = PyTuple_New(nattrs); 5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == NULL) 5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i=0 ; i < nattrs ; i++) { 5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *attr, *val; 5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm attr = PyTuple_GET_ITEM(ag->attr, i); 5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm val = dotted_getattr(obj, attr); 5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (val == NULL) { 5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(result); 5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(result, i, val); 5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(attrgetter_doc, 5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"attrgetter(attr, ...) --> attrgetter object\n\ 5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a callable object that fetches the given attribute(s) from its operand.\n\ 5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAfter, f=attrgetter('name'), the call f(r) returns r.name.\n\ 5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAfter, g=attrgetter('name', 'date'), the call g(r) returns (r.name, r.date).\n\ 5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAfter, h=attrgetter('name.first', 'name.last'), the call h(r) returns\n\ 5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm(r.name.first, r.name.last)."); 5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject attrgetter_type = { 6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyVarObject_HEAD_INIT(NULL, 0) 6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "operator.attrgetter", /* tp_name */ 6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sizeof(attrgetterobject), /* tp_basicsize */ 6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_itemsize */ 6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* methods */ 6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (destructor)attrgetter_dealloc, /* tp_dealloc */ 6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_print */ 6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_getattr */ 6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_setattr */ 6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_compare */ 6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_repr */ 6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_number */ 6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_sequence */ 6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_mapping */ 6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_hash */ 6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (ternaryfunc)attrgetter_call, /* tp_call */ 6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_str */ 6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GenericGetAttr, /* tp_getattro */ 6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_setattro */ 6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_buffer */ 6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ 6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm attrgetter_doc, /* tp_doc */ 6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (traverseproc)attrgetter_traverse, /* tp_traverse */ 6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_clear */ 6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_richcompare */ 6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_weaklistoffset */ 6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_iter */ 6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_iternext */ 6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_methods */ 6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_members */ 6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_getset */ 6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_base */ 6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_dict */ 6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_descr_get */ 6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_descr_set */ 6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_dictoffset */ 6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_init */ 6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_alloc */ 6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm attrgetter_new, /* tp_new */ 6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_free */ 6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* methodcaller object **********************************************************/ 6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct { 6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_HEAD 6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *name; 6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *args; 6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *kwds; 6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} methodcallerobject; 6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject methodcaller_type; 6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmethodcaller_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm methodcallerobject *mc; 6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *name, *newargs; 6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyTuple_GET_SIZE(args) < 1) { 6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_TypeError, "methodcaller needs at least " 6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "one argument, the method name"); 6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* create methodcallerobject structure */ 6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mc = PyObject_GC_New(methodcallerobject, &methodcaller_type); 6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (mc == NULL) 6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm newargs = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args)); 6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (newargs == NULL) { 6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(mc); 6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mc->args = newargs; 6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm name = PyTuple_GET_ITEM(args, 0); 6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(name); 6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mc->name = name; 6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XINCREF(kwds); 6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mc->kwds = kwds; 6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GC_Track(mc); 6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *)mc; 6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmethodcaller_dealloc(methodcallerobject *mc) 6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GC_UnTrack(mc); 6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(mc->name); 6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(mc->args); 6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(mc->kwds); 6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GC_Del(mc); 6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmethodcaller_traverse(methodcallerobject *mc, visitproc visit, void *arg) 7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(mc->args); 7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VISIT(mc->kwds); 7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmethodcaller_call(methodcallerobject *mc, PyObject *args, PyObject *kw) 7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *method, *obj, *result; 7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_UnpackTuple(args, "methodcaller", 1, 1, &obj)) 7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm method = PyObject_GetAttr(obj, mc->name); 7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (method == NULL) 7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = PyObject_Call(method, mc->args, mc->kwds); 7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(method); 7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(methodcaller_doc, 7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"methodcaller(name, ...) --> methodcaller object\n\ 7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a callable object that calls the given method on its operand.\n\ 7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAfter, f = methodcaller('name'), the call f(r) returns r.name().\n\ 7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAfter, g = methodcaller('name', 'date', foo=1), the call g(r) returns\n\ 7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmr.name('date', foo=1)."); 7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject methodcaller_type = { 7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyVarObject_HEAD_INIT(NULL, 0) 7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "operator.methodcaller", /* tp_name */ 7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sizeof(methodcallerobject), /* tp_basicsize */ 7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_itemsize */ 7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* methods */ 7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (destructor)methodcaller_dealloc, /* tp_dealloc */ 7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_print */ 7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_getattr */ 7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_setattr */ 7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_compare */ 7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_repr */ 7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_number */ 7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_sequence */ 7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_mapping */ 7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_hash */ 7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (ternaryfunc)methodcaller_call, /* tp_call */ 7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_str */ 7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_GenericGetAttr, /* tp_getattro */ 7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_setattro */ 7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_as_buffer */ 7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ 7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm methodcaller_doc, /* tp_doc */ 7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (traverseproc)methodcaller_traverse, /* tp_traverse */ 7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_clear */ 7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_richcompare */ 7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_weaklistoffset */ 7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_iter */ 7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_iternext */ 7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_methods */ 7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_members */ 7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_getset */ 7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_base */ 7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_dict */ 7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_descr_get */ 7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_descr_set */ 7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_dictoffset */ 7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_init */ 7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_alloc */ 7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm methodcaller_new, /* tp_new */ 7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 0, /* tp_free */ 7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Initialization function for the module (*must* be called initoperator) */ 7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyMODINIT_FUNC 7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminitoperator(void) 7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *m; 7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Create the module and add the functions */ 7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m = Py_InitModule4("operator", operator_methods, operator_doc, 7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (PyObject*)NULL, PYTHON_API_VERSION); 7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (m == NULL) 7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyType_Ready(&itemgetter_type) < 0) 7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(&itemgetter_type); 7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyModule_AddObject(m, "itemgetter", (PyObject *)&itemgetter_type); 7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyType_Ready(&attrgetter_type) < 0) 7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(&attrgetter_type); 7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyModule_AddObject(m, "attrgetter", (PyObject *)&attrgetter_type); 7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyType_Ready(&methodcaller_type) < 0) 7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(&methodcaller_type); 8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyModule_AddObject(m, "methodcaller", (PyObject *)&methodcaller_type); 8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 803