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