annotate Modules/_operator.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents c2000ce25fe8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22805
diff changeset
1
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22805
diff changeset
2 #include "Python.h"
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22805
diff changeset
3
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22805
diff changeset
4 PyDoc_STRVAR(operator_doc,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22805
diff changeset
5 "Operator interface.\n\
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 \n\
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 This module exports a set of functions implemented in C corresponding\n\
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 to the intrinsic operators of Python. For example, operator.add(x, y)\n\
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 is equivalent to the expression x+y. The function names are those\n\
57210
a0951f11be3d Merged revisions 76235 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 51271
diff changeset
10 used for special methods; variants without leading and trailing\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22805
diff changeset
11 '__' are also provided for convenience.");
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
12
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 26818
diff changeset
13 #define spam1(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a1) { \
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 return AOP(a1); }
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
15
13422
aa3d3bece774 ANSI-fy the sources.
Fred Drake <fdrake@acm.org>
parents: 9588
diff changeset
16 #define spam2(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 PyObject *a1, *a2; \
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 24887
diff changeset
18 if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 return AOP(a1,a2); }
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
20
13422
aa3d3bece774 ANSI-fy the sources.
Fred Drake <fdrake@acm.org>
parents: 9588
diff changeset
21 #define spamoi(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 PyObject *a1; int a2; \
14654
0bd746bc7627 Add invert() and __invert__() as aliases for inv()/__inv__().
Fred Drake <fdrake@acm.org>
parents: 13651
diff changeset
23 if(! PyArg_ParseTuple(a,"Oi:" #OP,&a1,&a2)) return NULL; \
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 return AOP(a1,a2); }
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
25
13422
aa3d3bece774 ANSI-fy the sources.
Fred Drake <fdrake@acm.org>
parents: 9588
diff changeset
26 #define spam2n(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 PyObject *a1, *a2; \
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 24887
diff changeset
28 if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 if(-1 == AOP(a1,a2)) return NULL; \
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 Py_INCREF(Py_None); \
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 return Py_None; }
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
32
13422
aa3d3bece774 ANSI-fy the sources.
Fred Drake <fdrake@acm.org>
parents: 9588
diff changeset
33 #define spam3n(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 PyObject *a1, *a2, *a3; \
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 24887
diff changeset
35 if(! PyArg_UnpackTuple(a,#OP,3,3,&a1,&a2,&a3)) return NULL; \
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 if(-1 == AOP(a1,a2,a3)) return NULL; \
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 Py_INCREF(Py_None); \
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 return Py_None; }
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
39
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 26818
diff changeset
40 #define spami(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a1) { \
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 26818
diff changeset
41 long r; \
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 if(-1 == (r=AOP(a1))) return NULL; \
22785
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 19111
diff changeset
43 return PyBool_FromLong(r); }
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
44
13422
aa3d3bece774 ANSI-fy the sources.
Fred Drake <fdrake@acm.org>
parents: 9588
diff changeset
45 #define spami2(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 PyObject *a1, *a2; long r; \
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 24887
diff changeset
47 if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 if(-1 == (r=AOP(a1,a2))) return NULL; \
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 42334
diff changeset
49 return PyLong_FromLong(r); }
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
50
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
51 #define spamn2(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
52 PyObject *a1, *a2; Py_ssize_t r; \
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
53 if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
54 if(-1 == (r=AOP(a1,a2))) return NULL; \
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 42334
diff changeset
55 return PyLong_FromSsize_t(r); }
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
56
22785
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 19111
diff changeset
57 #define spami2b(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 19111
diff changeset
58 PyObject *a1, *a2; long r; \
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 24887
diff changeset
59 if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \
22785
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 19111
diff changeset
60 if(-1 == (r=AOP(a1,a2))) return NULL; \
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 19111
diff changeset
61 return PyBool_FromLong(r); }
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 19111
diff changeset
62
19111
6ba441507220 Add wrappers around the rich-comparison operations.
Fred Drake <fdrake@acm.org>
parents: 14654
diff changeset
63 #define spamrc(OP,A) static PyObject *OP(PyObject *s, PyObject *a) { \
6ba441507220 Add wrappers around the rich-comparison operations.
Fred Drake <fdrake@acm.org>
parents: 14654
diff changeset
64 PyObject *a1, *a2; \
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 24887
diff changeset
65 if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \
19111
6ba441507220 Add wrappers around the rich-comparison operations.
Fred Drake <fdrake@acm.org>
parents: 14654
diff changeset
66 return PyObject_RichCompare(a1,a2,A); }
6ba441507220 Add wrappers around the rich-comparison operations.
Fred Drake <fdrake@acm.org>
parents: 14654
diff changeset
67
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 spami(truth , PyObject_IsTrue)
4089
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
69 spam2(op_add , PyNumber_Add)
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
70 spam2(op_sub , PyNumber_Subtract)
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
71 spam2(op_mul , PyNumber_Multiply)
19111
6ba441507220 Add wrappers around the rich-comparison operations.
Fred Drake <fdrake@acm.org>
parents: 14654
diff changeset
72 spam2(op_floordiv , PyNumber_FloorDivide)
6ba441507220 Add wrappers around the rich-comparison operations.
Fred Drake <fdrake@acm.org>
parents: 14654
diff changeset
73 spam2(op_truediv , PyNumber_TrueDivide)
4089
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
74 spam2(op_mod , PyNumber_Remainder)
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
75 spam1(op_neg , PyNumber_Negative)
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
76 spam1(op_pos , PyNumber_Positive)
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
77 spam1(op_abs , PyNumber_Absolute)
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
78 spam1(op_inv , PyNumber_Invert)
14654
0bd746bc7627 Add invert() and __invert__() as aliases for inv()/__inv__().
Fred Drake <fdrake@acm.org>
parents: 13651
diff changeset
79 spam1(op_invert , PyNumber_Invert)
4089
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
80 spam2(op_lshift , PyNumber_Lshift)
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
81 spam2(op_rshift , PyNumber_Rshift)
7936
1f38a2b548bf Add not_ and __not__.
Guido van Rossum <guido@python.org>
parents: 6227
diff changeset
82 spami(op_not_ , PyObject_Not)
4089
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
83 spam2(op_and_ , PyNumber_And)
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
84 spam2(op_xor , PyNumber_Xor)
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
85 spam2(op_or_ , PyNumber_Or)
36152
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
86 spam2(op_iadd , PyNumber_InPlaceAdd)
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
87 spam2(op_isub , PyNumber_InPlaceSubtract)
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
88 spam2(op_imul , PyNumber_InPlaceMultiply)
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
89 spam2(op_ifloordiv , PyNumber_InPlaceFloorDivide)
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
90 spam2(op_itruediv , PyNumber_InPlaceTrueDivide)
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
91 spam2(op_imod , PyNumber_InPlaceRemainder)
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
92 spam2(op_ilshift , PyNumber_InPlaceLshift)
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
93 spam2(op_irshift , PyNumber_InPlaceRshift)
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
94 spam2(op_iand , PyNumber_InPlaceAnd)
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
95 spam2(op_ixor , PyNumber_InPlaceXor)
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
96 spam2(op_ior , PyNumber_InPlaceOr)
4089
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
97 spam2(op_concat , PySequence_Concat)
36152
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
98 spam2(op_iconcat , PySequence_InPlaceConcat)
22785
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 19111
diff changeset
99 spami2b(op_contains , PySequence_Contains)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
100 spamn2(indexOf , PySequence_Index)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
101 spamn2(countOf , PySequence_Count)
4089
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
102 spam2(op_getitem , PyObject_GetItem)
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
103 spam2n(op_delitem , PyObject_DelItem)
9f70d995d027 Added delslice and delitem.
Guido van Rossum <guido@python.org>
parents: 4033
diff changeset
104 spam3n(op_setitem , PyObject_SetItem)
19111
6ba441507220 Add wrappers around the rich-comparison operations.
Fred Drake <fdrake@acm.org>
parents: 14654
diff changeset
105 spamrc(op_lt , Py_LT)
6ba441507220 Add wrappers around the rich-comparison operations.
Fred Drake <fdrake@acm.org>
parents: 14654
diff changeset
106 spamrc(op_le , Py_LE)
6ba441507220 Add wrappers around the rich-comparison operations.
Fred Drake <fdrake@acm.org>
parents: 14654
diff changeset
107 spamrc(op_eq , Py_EQ)
6ba441507220 Add wrappers around the rich-comparison operations.
Fred Drake <fdrake@acm.org>
parents: 14654
diff changeset
108 spamrc(op_ne , Py_NE)
6ba441507220 Add wrappers around the rich-comparison operations.
Fred Drake <fdrake@acm.org>
parents: 14654
diff changeset
109 spamrc(op_gt , Py_GT)
6ba441507220 Add wrappers around the rich-comparison operations.
Fred Drake <fdrake@acm.org>
parents: 14654
diff changeset
110 spamrc(op_ge , Py_GE)
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
111
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 static PyObject*
24887
d797cfa8ca0d Added __pow__(a,b) to the operator module. Completes the pattern of
Raymond Hettinger <python@rcn.com>
parents: 24796
diff changeset
113 op_pow(PyObject *s, PyObject *a)
d797cfa8ca0d Added __pow__(a,b) to the operator module. Completes the pattern of
Raymond Hettinger <python@rcn.com>
parents: 24796
diff changeset
114 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
115 PyObject *a1, *a2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
116 if (PyArg_UnpackTuple(a,"pow", 2, 2, &a1, &a2))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
117 return PyNumber_Power(a1, a2, Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
118 return NULL;
24887
d797cfa8ca0d Added __pow__(a,b) to the operator module. Completes the pattern of
Raymond Hettinger <python@rcn.com>
parents: 24796
diff changeset
119 }
d797cfa8ca0d Added __pow__(a,b) to the operator module. Completes the pattern of
Raymond Hettinger <python@rcn.com>
parents: 24796
diff changeset
120
d797cfa8ca0d Added __pow__(a,b) to the operator module. Completes the pattern of
Raymond Hettinger <python@rcn.com>
parents: 24796
diff changeset
121 static PyObject*
36152
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
122 op_ipow(PyObject *s, PyObject *a)
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
123 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
124 PyObject *a1, *a2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
125 if (PyArg_UnpackTuple(a,"ipow", 2, 2, &a1, &a2))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
126 return PyNumber_InPlacePower(a1, a2, Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
127 return NULL;
36152
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
128 }
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
129
36882
6a9c7165b17b Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents: 36518
diff changeset
130 static PyObject *
6a9c7165b17b Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents: 36518
diff changeset
131 op_index(PyObject *s, PyObject *a)
6a9c7165b17b Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents: 36518
diff changeset
132 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
133 return PyNumber_Index(a);
36882
6a9c7165b17b Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents: 36518
diff changeset
134 }
6a9c7165b17b Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents: 36518
diff changeset
135
36152
f9281283b109 adding in-place operators to the operator module.
Armin Rigo <arigo@tunes.org>
parents: 36149
diff changeset
136 static PyObject*
27290
e83a42a90df1 SF patch #670423: Add missing identity tests to operator.c
Raymond Hettinger <python@rcn.com>
parents: 27044
diff changeset
137 is_(PyObject *s, PyObject *a)
e83a42a90df1 SF patch #670423: Add missing identity tests to operator.c
Raymond Hettinger <python@rcn.com>
parents: 27044
diff changeset
138 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
139 PyObject *a1, *a2, *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
140 if (PyArg_UnpackTuple(a,"is_", 2, 2, &a1, &a2)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
141 result = (a1 == a2) ? Py_True : Py_False;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
142 Py_INCREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
143 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
144 return result;
27290
e83a42a90df1 SF patch #670423: Add missing identity tests to operator.c
Raymond Hettinger <python@rcn.com>
parents: 27044
diff changeset
145 }
e83a42a90df1 SF patch #670423: Add missing identity tests to operator.c
Raymond Hettinger <python@rcn.com>
parents: 27044
diff changeset
146
e83a42a90df1 SF patch #670423: Add missing identity tests to operator.c
Raymond Hettinger <python@rcn.com>
parents: 27044
diff changeset
147 static PyObject*
e83a42a90df1 SF patch #670423: Add missing identity tests to operator.c
Raymond Hettinger <python@rcn.com>
parents: 27044
diff changeset
148 is_not(PyObject *s, PyObject *a)
e83a42a90df1 SF patch #670423: Add missing identity tests to operator.c
Raymond Hettinger <python@rcn.com>
parents: 27044
diff changeset
149 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
150 PyObject *a1, *a2, *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
151 if (PyArg_UnpackTuple(a,"is_not", 2, 2, &a1, &a2)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
152 result = (a1 != a2) ? Py_True : Py_False;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
153 Py_INCREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
154 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
155 return result;
27290
e83a42a90df1 SF patch #670423: Add missing identity tests to operator.c
Raymond Hettinger <python@rcn.com>
parents: 27044
diff changeset
156 }
e83a42a90df1 SF patch #670423: Add missing identity tests to operator.c
Raymond Hettinger <python@rcn.com>
parents: 27044
diff changeset
157
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 #undef spam1
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 #undef spam2
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 26818
diff changeset
160 #undef spam1o
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 26818
diff changeset
161 #undef spam1o
77702
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
162
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
163 /* compare_digest **********************************************************/
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
164
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
165 /*
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
166 * timing safe compare
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
167 *
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
168 * Returns 1 of the strings are equal.
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
169 * In case of len(a) != len(b) the function tries to keep the timing
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
170 * dependent on the length of b. CPU cache locally may still alter timing
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
171 * a bit.
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
172 */
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
173 static int
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
174 _tscmp(const unsigned char *a, const unsigned char *b,
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
175 Py_ssize_t len_a, Py_ssize_t len_b)
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
176 {
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
177 /* The volatile type declarations make sure that the compiler has no
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
178 * chance to optimize and fold the code in any way that may change
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
179 * the timing.
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
180 */
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
181 volatile Py_ssize_t length;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
182 volatile const unsigned char *left;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
183 volatile const unsigned char *right;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
184 Py_ssize_t i;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
185 unsigned char result;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
186
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
187 /* loop count depends on length of b */
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
188 length = len_b;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
189 left = NULL;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
190 right = b;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
191
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
192 /* don't use else here to keep the amount of CPU instructions constant,
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
193 * volatile forces re-evaluation
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
194 * */
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
195 if (len_a == length) {
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
196 left = *((volatile const unsigned char**)&a);
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
197 result = 0;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
198 }
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
199 if (len_a != length) {
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
200 left = b;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
201 result = 1;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
202 }
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
203
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
204 for (i=0; i < length; i++) {
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
205 result |= *left++ ^ *right++;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
206 }
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
207
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
208 return (result == 0);
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
209 }
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
210
79511
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
211 PyDoc_STRVAR(length_hint__doc__,
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
212 "length_hint(obj, default=0) -> int\n"
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
213 "Return an estimate of the number of items in obj.\n"
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
214 "This is useful for presizing containers when building from an\n"
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
215 "iterable.\n"
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
216 "\n"
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
217 "If the object supports len(), the result will be\n"
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
218 "exact. Otherwise, it may over- or under-estimate by an\n"
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
219 "arbitrary amount. The result will be an integer >= 0.");
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
220
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
221 static PyObject *length_hint(PyObject *self, PyObject *args)
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
222 {
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
223 PyObject *obj;
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
224 Py_ssize_t defaultvalue = 0, res;
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
225 if (!PyArg_ParseTuple(args, "O|n:length_hint", &obj, &defaultvalue)) {
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
226 return NULL;
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
227 }
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
228 res = PyObject_LengthHint(obj, defaultvalue);
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
229 if (res == -1 && PyErr_Occurred()) {
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
230 return NULL;
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
231 }
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
232 return PyLong_FromSsize_t(res);
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
233 }
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
234
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
235
77702
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
236 PyDoc_STRVAR(compare_digest__doc__,
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
237 "compare_digest(a, b) -> bool\n"
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
238 "\n"
77710
b0f57a2402e3 Improve hmac.compare_digest() docstring and documentation, courtesy of Larry H.
Georg Brandl <georg@python.org>
parents: 77704
diff changeset
239 "Return 'a == b'. This function uses an approach designed to prevent\n"
b0f57a2402e3 Improve hmac.compare_digest() docstring and documentation, courtesy of Larry H.
Georg Brandl <georg@python.org>
parents: 77704
diff changeset
240 "timing analysis, making it appropriate for cryptography.\n"
b0f57a2402e3 Improve hmac.compare_digest() docstring and documentation, courtesy of Larry H.
Georg Brandl <georg@python.org>
parents: 77704
diff changeset
241 "a and b must both be of the same type: either str (ASCII only),\n"
b0f57a2402e3 Improve hmac.compare_digest() docstring and documentation, courtesy of Larry H.
Georg Brandl <georg@python.org>
parents: 77704
diff changeset
242 "or any type that supports the buffer protocol (e.g. bytes).\n"
77702
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
243 "\n"
77710
b0f57a2402e3 Improve hmac.compare_digest() docstring and documentation, courtesy of Larry H.
Georg Brandl <georg@python.org>
parents: 77704
diff changeset
244 "Note: If a and b are of different lengths, or if an error occurs,\n"
77761
485a4f4ad08d Minor grammar refinement for hmac.compare_digest().
Larry Hastings <larry@hastings.org>
parents: 77714
diff changeset
245 "a timing attack could theoretically reveal information about the\n"
485a4f4ad08d Minor grammar refinement for hmac.compare_digest().
Larry Hastings <larry@hastings.org>
parents: 77714
diff changeset
246 "types and lengths of a and b--but not their values.\n");
77702
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
247
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
248 static PyObject*
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
249 compare_digest(PyObject *self, PyObject *args)
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
250 {
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
251 PyObject *a, *b;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
252 int rc;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
253
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
254 if (!PyArg_ParseTuple(args, "OO:compare_digest", &a, &b)) {
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
255 return NULL;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
256 }
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
257
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
258 /* ASCII unicode string */
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
259 if(PyUnicode_Check(a) && PyUnicode_Check(b)) {
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
260 if (PyUnicode_READY(a) == -1 || PyUnicode_READY(b) == -1) {
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
261 return NULL;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
262 }
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
263 if (!PyUnicode_IS_ASCII(a) || !PyUnicode_IS_ASCII(b)) {
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
264 PyErr_SetString(PyExc_TypeError,
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
265 "comparing strings with non-ASCII characters is "
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
266 "not supported");
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
267 return NULL;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
268 }
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
269
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
270 rc = _tscmp(PyUnicode_DATA(a),
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
271 PyUnicode_DATA(b),
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
272 PyUnicode_GET_LENGTH(a),
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
273 PyUnicode_GET_LENGTH(b));
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
274 }
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
275 /* fallback to buffer interface for bytes, bytesarray and other */
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
276 else {
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
277 Py_buffer view_a;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
278 Py_buffer view_b;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
279
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
280 if ((PyObject_CheckBuffer(a) == 0) & (PyObject_CheckBuffer(b) == 0)) {
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
281 PyErr_Format(PyExc_TypeError,
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
282 "unsupported operand types(s) or combination of types: "
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
283 "'%.100s' and '%.100s'",
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
284 Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name);
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
285 return NULL;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
286 }
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
287
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
288 if (PyObject_GetBuffer(a, &view_a, PyBUF_SIMPLE) == -1) {
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
289 return NULL;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
290 }
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
291 if (view_a.ndim > 1) {
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
292 PyErr_SetString(PyExc_BufferError,
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
293 "Buffer must be single dimension");
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
294 PyBuffer_Release(&view_a);
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
295 return NULL;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
296 }
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
297
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
298 if (PyObject_GetBuffer(b, &view_b, PyBUF_SIMPLE) == -1) {
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
299 PyBuffer_Release(&view_a);
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
300 return NULL;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
301 }
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
302 if (view_b.ndim > 1) {
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
303 PyErr_SetString(PyExc_BufferError,
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
304 "Buffer must be single dimension");
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
305 PyBuffer_Release(&view_a);
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
306 PyBuffer_Release(&view_b);
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
307 return NULL;
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
308 }
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
309
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
310 rc = _tscmp((const unsigned char*)view_a.buf,
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
311 (const unsigned char*)view_b.buf,
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
312 view_a.len,
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
313 view_b.len);
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
314
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
315 PyBuffer_Release(&view_a);
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
316 PyBuffer_Release(&view_b);
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
317 }
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
318
77703
9875deb347b8 Fix a refleak in c82451eeb595.
Georg Brandl <georg@python.org>
parents: 77702
diff changeset
319 return PyBool_FromLong(rc);
77702
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
320 }
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
321
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
322 /* operator methods **********************************************************/
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
323
24796
de71e6fe64b0 Allow more docstrings to be removed during compilation in some modules
Neal Norwitz <nnorwitz@gmail.com>
parents: 24471
diff changeset
324 #define spam1(OP,DOC) {#OP, OP, METH_VARARGS, PyDoc_STR(DOC)},
83465
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
325 #define spam2(OP,DOC) {#OP, op_##OP, METH_VARARGS, PyDoc_STR(DOC)},
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 26818
diff changeset
326 #define spam1o(OP,DOC) {#OP, OP, METH_O, PyDoc_STR(DOC)},
83465
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
327 #define spam2o(OP,DOC) {#OP, op_##OP, METH_O, PyDoc_STR(DOC)},
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
328
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
329 static struct PyMethodDef operator_methods[] = {
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
330
27044
23280a64288e SF patch 660559: Use METH_O and METH_NOARGS where possible
Raymond Hettinger <python@rcn.com>
parents: 26818
diff changeset
331 spam1o(truth,
22785
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 19111
diff changeset
332 "truth(a) -- Return True if a is true, False otherwise.")
83465
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
333 spam2(contains,
8414
4064b6729537 Add an alias (and preferred name) "contains" for "sequenceIncludes".
Guido van Rossum <guido@python.org>
parents: 8406
diff changeset
334 "contains(a, b) -- Same as b in a (note reversed operands).")
4033
5592de9656de Made it palatable for K&R preprocessors. The spam macros don't have
Guido van Rossum <guido@python.org>
parents: 3976
diff changeset
335 spam1(indexOf,
8414
4064b6729537 Add an alias (and preferred name) "contains" for "sequenceIncludes".
Guido van Rossum <guido@python.org>
parents: 8406
diff changeset
336 "indexOf(a, b) -- Return the first index of b in a.")
4033
5592de9656de Made it palatable for K&R preprocessors. The spam macros don't have
Guido van Rossum <guido@python.org>
parents: 3976
diff changeset
337 spam1(countOf,
5592de9656de Made it palatable for K&R preprocessors. The spam macros don't have
Guido van Rossum <guido@python.org>
parents: 3976
diff changeset
338 "countOf(a, b) -- Return the number of times b occurs in a.")
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
339
27290
e83a42a90df1 SF patch #670423: Add missing identity tests to operator.c
Raymond Hettinger <python@rcn.com>
parents: 27044
diff changeset
340 spam1(is_, "is_(a, b) -- Same as a is b.")
e83a42a90df1 SF patch #670423: Add missing identity tests to operator.c
Raymond Hettinger <python@rcn.com>
parents: 27044
diff changeset
341 spam1(is_not, "is_not(a, b) -- Same as a is not b.")
83465
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
342 spam2o(index, "index(a) -- Same as a.__index__()")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
343 spam2(add, "add(a, b) -- Same as a + b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
344 spam2(sub, "sub(a, b) -- Same as a - b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
345 spam2(mul, "mul(a, b) -- Same as a * b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
346 spam2(floordiv, "floordiv(a, b) -- Same as a // b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
347 spam2(truediv, "truediv(a, b) -- Same as a / b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
348 spam2(mod, "mod(a, b) -- Same as a % b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
349 spam2o(neg, "neg(a) -- Same as -a.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
350 spam2o(pos, "pos(a) -- Same as +a.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
351 spam2o(abs, "abs(a) -- Same as abs(a).")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
352 spam2o(inv, "inv(a) -- Same as ~a.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
353 spam2o(invert, "invert(a) -- Same as ~a.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
354 spam2(lshift, "lshift(a, b) -- Same as a << b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
355 spam2(rshift, "rshift(a, b) -- Same as a >> b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
356 spam2o(not_, "not_(a) -- Same as not a.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
357 spam2(and_, "and_(a, b) -- Same as a & b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
358 spam2(xor, "xor(a, b) -- Same as a ^ b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
359 spam2(or_, "or_(a, b) -- Same as a | b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
360 spam2(iadd, "a = iadd(a, b) -- Same as a += b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
361 spam2(isub, "a = isub(a, b) -- Same as a -= b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
362 spam2(imul, "a = imul(a, b) -- Same as a *= b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
363 spam2(ifloordiv, "a = ifloordiv(a, b) -- Same as a //= b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
364 spam2(itruediv, "a = itruediv(a, b) -- Same as a /= b")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
365 spam2(imod, "a = imod(a, b) -- Same as a %= b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
366 spam2(ilshift, "a = ilshift(a, b) -- Same as a <<= b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
367 spam2(irshift, "a = irshift(a, b) -- Same as a >>= b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
368 spam2(iand, "a = iand(a, b) -- Same as a &= b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
369 spam2(ixor, "a = ixor(a, b) -- Same as a ^= b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
370 spam2(ior, "a = ior(a, b) -- Same as a |= b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
371 spam2(concat,
8414
4064b6729537 Add an alias (and preferred name) "contains" for "sequenceIncludes".
Guido van Rossum <guido@python.org>
parents: 8406
diff changeset
372 "concat(a, b) -- Same as a + b, for a and b sequences.")
83465
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
373 spam2(iconcat,
57210
a0951f11be3d Merged revisions 76235 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 51271
diff changeset
374 "a = iconcat(a, b) -- Same as a += b, for a and b sequences.")
83465
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
375 spam2(getitem,
8414
4064b6729537 Add an alias (and preferred name) "contains" for "sequenceIncludes".
Guido van Rossum <guido@python.org>
parents: 8406
diff changeset
376 "getitem(a, b) -- Same as a[b].")
83465
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
377 spam2(setitem,
8414
4064b6729537 Add an alias (and preferred name) "contains" for "sequenceIncludes".
Guido van Rossum <guido@python.org>
parents: 8406
diff changeset
378 "setitem(a, b, c) -- Same as a[b] = c.")
83465
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
379 spam2(delitem,
8414
4064b6729537 Add an alias (and preferred name) "contains" for "sequenceIncludes".
Guido van Rossum <guido@python.org>
parents: 8406
diff changeset
380 "delitem(a, b) -- Same as del a[b].")
83465
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
381 spam2(pow, "pow(a, b) -- Same as a ** b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
382 spam2(ipow, "a = ipow(a, b) -- Same as a **= b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
383 spam2(lt, "lt(a, b) -- Same as a<b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
384 spam2(le, "le(a, b) -- Same as a<=b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
385 spam2(eq, "eq(a, b) -- Same as a==b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
386 spam2(ne, "ne(a, b) -- Same as a!=b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
387 spam2(gt, "gt(a, b) -- Same as a>b.")
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
388 spam2(ge, "ge(a, b) -- Same as a>=b.")
4033
5592de9656de Made it palatable for K&R preprocessors. The spam macros don't have
Guido van Rossum <guido@python.org>
parents: 3976
diff changeset
389
77702
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
390 {"_compare_digest", (PyCFunction)compare_digest, METH_VARARGS,
c82451eeb595 Issue #15061: Re-implemented hmac.compare_digest() in C
Christian Heimes <christian@cheimes.de>
parents: 72475
diff changeset
391 compare_digest__doc__},
79511
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
392 {"length_hint", (PyCFunction)length_hint, METH_VARARGS,
a7ec0a1b0f7c Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents: 77761
diff changeset
393 length_hint__doc__},
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
394 {NULL, NULL} /* sentinel */
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
395
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
396 };
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
397
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
398 /* itemgetter object **********************************************************/
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
399
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
400 typedef struct {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
401 PyObject_HEAD
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
402 Py_ssize_t nitems;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
403 PyObject *item;
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
404 } itemgetterobject;
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
405
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
406 static PyTypeObject itemgetter_type;
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
407
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
408 static PyObject *
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
409 itemgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
410 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
411 itemgetterobject *ig;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
412 PyObject *item;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
413 Py_ssize_t nitems;
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
414
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
415 if (!_PyArg_NoKeywords("itemgetter()", kwds))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
416 return NULL;
35449
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34716
diff changeset
417
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
418 nitems = PyTuple_GET_SIZE(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
419 if (nitems <= 1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
420 if (!PyArg_UnpackTuple(args, "itemgetter", 1, 1, &item))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
421 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
422 } else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
423 item = args;
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
424
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
425 /* create itemgetterobject structure */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
426 ig = PyObject_GC_New(itemgetterobject, &itemgetter_type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
427 if (ig == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
428 return NULL;
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
429
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
430 Py_INCREF(item);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
431 ig->item = item;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
432 ig->nitems = nitems;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
433
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
434 PyObject_GC_Track(ig);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
435 return (PyObject *)ig;
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
436 }
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
437
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
438 static void
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
439 itemgetter_dealloc(itemgetterobject *ig)
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
440 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
441 PyObject_GC_UnTrack(ig);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
442 Py_XDECREF(ig->item);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
443 PyObject_GC_Del(ig);
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
444 }
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
445
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
446 static int
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
447 itemgetter_traverse(itemgetterobject *ig, visitproc visit, void *arg)
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
448 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
449 Py_VISIT(ig->item);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
450 return 0;
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
451 }
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
452
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
453 static PyObject *
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
454 itemgetter_call(itemgetterobject *ig, PyObject *args, PyObject *kw)
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
455 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
456 PyObject *obj, *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
457 Py_ssize_t i, nitems=ig->nitems;
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
458
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
459 if (!PyArg_UnpackTuple(args, "itemgetter", 1, 1, &obj))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
460 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
461 if (nitems == 1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
462 return PyObject_GetItem(obj, ig->item);
34716
ddc2276c247e operator.itemgetter() and operator.attrgetter() now support extraction
Raymond Hettinger <python@rcn.com>
parents: 31110
diff changeset
463
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
464 assert(PyTuple_Check(ig->item));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
465 assert(PyTuple_GET_SIZE(ig->item) == nitems);
34716
ddc2276c247e operator.itemgetter() and operator.attrgetter() now support extraction
Raymond Hettinger <python@rcn.com>
parents: 31110
diff changeset
466
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
467 result = PyTuple_New(nitems);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
468 if (result == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
469 return NULL;
34716
ddc2276c247e operator.itemgetter() and operator.attrgetter() now support extraction
Raymond Hettinger <python@rcn.com>
parents: 31110
diff changeset
470
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
471 for (i=0 ; i < nitems ; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
472 PyObject *item, *val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
473 item = PyTuple_GET_ITEM(ig->item, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
474 val = PyObject_GetItem(obj, item);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
475 if (val == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
476 Py_DECREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
477 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
478 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
479 PyTuple_SET_ITEM(result, i, val);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
480 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
481 return result;
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
482 }
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
483
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
484 PyDoc_STRVAR(itemgetter_doc,
34716
ddc2276c247e operator.itemgetter() and operator.attrgetter() now support extraction
Raymond Hettinger <python@rcn.com>
parents: 31110
diff changeset
485 "itemgetter(item, ...) --> itemgetter object\n\
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
486 \n\
34716
ddc2276c247e operator.itemgetter() and operator.attrgetter() now support extraction
Raymond Hettinger <python@rcn.com>
parents: 31110
diff changeset
487 Return a callable object that fetches the given item(s) from its operand.\n\
83682
6f2412f12bfd #16523: improve attrgetter/itemgetter/methodcaller documentation.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 77761
diff changeset
488 After f = itemgetter(2), the call f(r) returns r[2].\n\
6f2412f12bfd #16523: improve attrgetter/itemgetter/methodcaller documentation.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 77761
diff changeset
489 After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])");
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
490
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
491 static PyTypeObject itemgetter_type = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
492 PyVarObject_HEAD_INIT(NULL, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
493 "operator.itemgetter", /* tp_name */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
494 sizeof(itemgetterobject), /* tp_basicsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
495 0, /* tp_itemsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
496 /* methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
497 (destructor)itemgetter_dealloc, /* tp_dealloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
498 0, /* tp_print */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
499 0, /* tp_getattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
500 0, /* tp_setattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
501 0, /* tp_reserved */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
502 0, /* tp_repr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
503 0, /* tp_as_number */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
504 0, /* tp_as_sequence */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
505 0, /* tp_as_mapping */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
506 0, /* tp_hash */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
507 (ternaryfunc)itemgetter_call, /* tp_call */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
508 0, /* tp_str */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
509 PyObject_GenericGetAttr, /* tp_getattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
510 0, /* tp_setattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
511 0, /* tp_as_buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
512 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
513 itemgetter_doc, /* tp_doc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
514 (traverseproc)itemgetter_traverse, /* tp_traverse */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
515 0, /* tp_clear */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
516 0, /* tp_richcompare */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
517 0, /* tp_weaklistoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
518 0, /* tp_iter */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
519 0, /* tp_iternext */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
520 0, /* tp_methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
521 0, /* tp_members */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
522 0, /* tp_getset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
523 0, /* tp_base */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
524 0, /* tp_dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
525 0, /* tp_descr_get */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
526 0, /* tp_descr_set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
527 0, /* tp_dictoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
528 0, /* tp_init */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
529 0, /* tp_alloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
530 itemgetter_new, /* tp_new */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
531 0, /* tp_free */
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
532 };
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
533
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
534
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
535 /* attrgetter object **********************************************************/
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
536
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
537 typedef struct {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
538 PyObject_HEAD
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
539 Py_ssize_t nattrs;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
540 PyObject *attr;
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
541 } attrgetterobject;
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
542
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
543 static PyTypeObject attrgetter_type;
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
544
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
545 static PyObject *
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
546 attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
547 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
548 attrgetterobject *ag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
549 PyObject *attr;
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
550 Py_ssize_t nattrs, idx, char_idx;
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
551
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
552 if (!_PyArg_NoKeywords("attrgetter()", kwds))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
553 return NULL;
35449
1fdfd0130e28 Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents: 34716
diff changeset
554
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
555 nattrs = PyTuple_GET_SIZE(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
556 if (nattrs <= 1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
557 if (!PyArg_UnpackTuple(args, "attrgetter", 1, 1, &attr))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
558 return NULL;
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
559 }
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
560
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
561 attr = PyTuple_New(nattrs);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
562 if (attr == NULL)
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
563 return NULL;
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
564
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
565 /* prepare attr while checking args */
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
566 for (idx = 0; idx < nattrs; ++idx) {
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
567 PyObject *item = PyTuple_GET_ITEM(args, idx);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
568 Py_ssize_t item_len;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 65842
diff changeset
569 void *data;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 65842
diff changeset
570 unsigned int kind;
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
571 int dot_count;
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
572
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
573 if (!PyUnicode_Check(item)) {
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
574 PyErr_SetString(PyExc_TypeError,
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
575 "attribute name must be a string");
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
576 Py_DECREF(attr);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
577 return NULL;
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
578 }
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 65842
diff changeset
579 if (PyUnicode_READY(item)) {
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 65842
diff changeset
580 Py_DECREF(attr);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 65842
diff changeset
581 return NULL;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 65842
diff changeset
582 }
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 65842
diff changeset
583 item_len = PyUnicode_GET_LENGTH(item);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 65842
diff changeset
584 kind = PyUnicode_KIND(item);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 65842
diff changeset
585 data = PyUnicode_DATA(item);
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
586
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
587 /* check whethere the string is dotted */
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
588 dot_count = 0;
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
589 for (char_idx = 0; char_idx < item_len; ++char_idx) {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 65842
diff changeset
590 if (PyUnicode_READ(kind, data, char_idx) == '.')
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
591 ++dot_count;
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
592 }
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
593
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
594 if (dot_count == 0) {
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
595 Py_INCREF(item);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
596 PyUnicode_InternInPlace(&item);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
597 PyTuple_SET_ITEM(attr, idx, item);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
598 } else { /* make it a tuple of non-dotted attrnames */
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
599 PyObject *attr_chain = PyTuple_New(dot_count + 1);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
600 PyObject *attr_chain_item;
65842
eaa50725122b No declarations in the middle of a block (fixes compile under Windows)
Antoine Pitrou <solipsis@pitrou.net>
parents: 65818
diff changeset
601 Py_ssize_t unibuff_from = 0;
eaa50725122b No declarations in the middle of a block (fixes compile under Windows)
Antoine Pitrou <solipsis@pitrou.net>
parents: 65818
diff changeset
602 Py_ssize_t unibuff_till = 0;
eaa50725122b No declarations in the middle of a block (fixes compile under Windows)
Antoine Pitrou <solipsis@pitrou.net>
parents: 65818
diff changeset
603 Py_ssize_t attr_chain_idx = 0;
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
604
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
605 if (attr_chain == NULL) {
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
606 Py_DECREF(attr);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
607 return NULL;
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
608 }
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
609
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
610 for (; dot_count > 0; --dot_count) {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 65842
diff changeset
611 while (PyUnicode_READ(kind, data, unibuff_till) != '.') {
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
612 ++unibuff_till;
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
613 }
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 65842
diff changeset
614 attr_chain_item = PyUnicode_Substring(item,
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 65842
diff changeset
615 unibuff_from,
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 65842
diff changeset
616 unibuff_till);
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
617 if (attr_chain_item == NULL) {
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
618 Py_DECREF(attr_chain);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
619 Py_DECREF(attr);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
620 return NULL;
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
621 }
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
622 PyUnicode_InternInPlace(&attr_chain_item);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
623 PyTuple_SET_ITEM(attr_chain, attr_chain_idx, attr_chain_item);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
624 ++attr_chain_idx;
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
625 unibuff_till = unibuff_from = unibuff_till + 1;
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
626 }
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
627
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
628 /* now add the last dotless name */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 65842
diff changeset
629 attr_chain_item = PyUnicode_Substring(item,
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 65842
diff changeset
630 unibuff_from, item_len);
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
631 if (attr_chain_item == NULL) {
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
632 Py_DECREF(attr_chain);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
633 Py_DECREF(attr);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
634 return NULL;
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
635 }
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
636 PyUnicode_InternInPlace(&attr_chain_item);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
637 PyTuple_SET_ITEM(attr_chain, attr_chain_idx, attr_chain_item);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
638
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
639 PyTuple_SET_ITEM(attr, idx, attr_chain);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
640 }
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
641 }
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
642
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
643 /* create attrgetterobject structure */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
644 ag = PyObject_GC_New(attrgetterobject, &attrgetter_type);
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
645 if (ag == NULL) {
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
646 Py_DECREF(attr);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
647 return NULL;
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
648 }
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
649
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
650 ag->attr = attr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
651 ag->nattrs = nattrs;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
652
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
653 PyObject_GC_Track(ag);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
654 return (PyObject *)ag;
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
655 }
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
656
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
657 static void
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
658 attrgetter_dealloc(attrgetterobject *ag)
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
659 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
660 PyObject_GC_UnTrack(ag);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
661 Py_XDECREF(ag->attr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
662 PyObject_GC_Del(ag);
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
663 }
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
664
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
665 static int
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
666 attrgetter_traverse(attrgetterobject *ag, visitproc visit, void *arg)
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
667 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
668 Py_VISIT(ag->attr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
669 return 0;
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
670 }
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
671
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
672 static PyObject *
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
673 dotted_getattr(PyObject *obj, PyObject *attr)
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
674 {
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
675 PyObject *newobj;
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
676
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
677 /* attr is either a tuple or instance of str.
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
678 Ensured by the setup code of attrgetter_new */
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
679 if (PyTuple_CheckExact(attr)) { /* chained getattr */
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
680 Py_ssize_t name_idx = 0, name_count;
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
681 PyObject *attr_name;
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
682
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
683 name_count = PyTuple_GET_SIZE(attr);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
684 Py_INCREF(obj);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
685 for (name_idx = 0; name_idx < name_count; ++name_idx) {
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
686 attr_name = PyTuple_GET_ITEM(attr, name_idx);
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
687 newobj = PyObject_GetAttr(obj, attr_name);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
688 Py_DECREF(obj);
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
689 if (newobj == NULL) {
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
690 return NULL;
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
691 }
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
692 /* here */
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
693 obj = newobj;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
694 }
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
695 } else { /* single getattr */
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
696 newobj = PyObject_GetAttr(obj, attr);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
697 if (newobj == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
698 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
699 obj = newobj;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
700 }
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
701
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
702 return obj;
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
703 }
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
704
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
705 static PyObject *
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
706 attrgetter_call(attrgetterobject *ag, PyObject *args, PyObject *kw)
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
707 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
708 PyObject *obj, *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
709 Py_ssize_t i, nattrs=ag->nattrs;
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
710
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
711 if (!PyArg_UnpackTuple(args, "attrgetter", 1, 1, &obj))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
712 return NULL;
65818
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
713 if (ag->nattrs == 1) /* ag->attr is always a tuple */
4127ab1f6338 Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
714 return dotted_getattr(obj, PyTuple_GET_ITEM(ag->attr, 0));
34716
ddc2276c247e operator.itemgetter() and operator.attrgetter() now support extraction
Raymond Hettinger <python@rcn.com>
parents: 31110
diff changeset
715
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
716 assert(PyTuple_Check(ag->attr));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
717 assert(PyTuple_GET_SIZE(ag->attr) == nattrs);
34716
ddc2276c247e operator.itemgetter() and operator.attrgetter() now support extraction
Raymond Hettinger <python@rcn.com>
parents: 31110
diff changeset
718
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
719 result = PyTuple_New(nattrs);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
720 if (result == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
721 return NULL;
34716
ddc2276c247e operator.itemgetter() and operator.attrgetter() now support extraction
Raymond Hettinger <python@rcn.com>
parents: 31110
diff changeset
722
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
723 for (i=0 ; i < nattrs ; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
724 PyObject *attr, *val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
725 attr = PyTuple_GET_ITEM(ag->attr, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
726 val = dotted_getattr(obj, attr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
727 if (val == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
728 Py_DECREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
729 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
730 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
731 PyTuple_SET_ITEM(result, i, val);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
732 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
733 return result;
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
734 }
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
735
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
736 PyDoc_STRVAR(attrgetter_doc,
34716
ddc2276c247e operator.itemgetter() and operator.attrgetter() now support extraction
Raymond Hettinger <python@rcn.com>
parents: 31110
diff changeset
737 "attrgetter(attr, ...) --> attrgetter object\n\
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
738 \n\
34716
ddc2276c247e operator.itemgetter() and operator.attrgetter() now support extraction
Raymond Hettinger <python@rcn.com>
parents: 31110
diff changeset
739 Return a callable object that fetches the given attribute(s) from its operand.\n\
83682
6f2412f12bfd #16523: improve attrgetter/itemgetter/methodcaller documentation.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 77761
diff changeset
740 After f = attrgetter('name'), the call f(r) returns r.name.\n\
6f2412f12bfd #16523: improve attrgetter/itemgetter/methodcaller documentation.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 77761
diff changeset
741 After g = attrgetter('name', 'date'), the call g(r) returns (r.name, r.date).\n\
6f2412f12bfd #16523: improve attrgetter/itemgetter/methodcaller documentation.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 77761
diff changeset
742 After h = attrgetter('name.first', 'name.last'), the call h(r) returns\n\
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
743 (r.name.first, r.name.last).");
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
744
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
745 static PyTypeObject attrgetter_type = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
746 PyVarObject_HEAD_INIT(NULL, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
747 "operator.attrgetter", /* tp_name */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
748 sizeof(attrgetterobject), /* tp_basicsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
749 0, /* tp_itemsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
750 /* methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
751 (destructor)attrgetter_dealloc, /* tp_dealloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
752 0, /* tp_print */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
753 0, /* tp_getattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
754 0, /* tp_setattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
755 0, /* tp_reserved */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
756 0, /* tp_repr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
757 0, /* tp_as_number */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
758 0, /* tp_as_sequence */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
759 0, /* tp_as_mapping */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
760 0, /* tp_hash */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
761 (ternaryfunc)attrgetter_call, /* tp_call */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
762 0, /* tp_str */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
763 PyObject_GenericGetAttr, /* tp_getattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
764 0, /* tp_setattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
765 0, /* tp_as_buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
766 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
767 attrgetter_doc, /* tp_doc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
768 (traverseproc)attrgetter_traverse, /* tp_traverse */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
769 0, /* tp_clear */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
770 0, /* tp_richcompare */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
771 0, /* tp_weaklistoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
772 0, /* tp_iter */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
773 0, /* tp_iternext */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
774 0, /* tp_methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
775 0, /* tp_members */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
776 0, /* tp_getset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
777 0, /* tp_base */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
778 0, /* tp_dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
779 0, /* tp_descr_get */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
780 0, /* tp_descr_set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
781 0, /* tp_dictoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
782 0, /* tp_init */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
783 0, /* tp_alloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
784 attrgetter_new, /* tp_new */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
785 0, /* tp_free */
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
786 };
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
787
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
788
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
789 /* methodcaller object **********************************************************/
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
790
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
791 typedef struct {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
792 PyObject_HEAD
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
793 PyObject *name;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
794 PyObject *args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
795 PyObject *kwds;
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
796 } methodcallerobject;
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
797
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
798 static PyTypeObject methodcaller_type;
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
799
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
800 static PyObject *
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
801 methodcaller_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
802 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
803 methodcallerobject *mc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
804 PyObject *name, *newargs;
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
805
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
806 if (PyTuple_GET_SIZE(args) < 1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
807 PyErr_SetString(PyExc_TypeError, "methodcaller needs at least "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
808 "one argument, the method name");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
809 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
810 }
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
811
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
812 /* create methodcallerobject structure */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
813 mc = PyObject_GC_New(methodcallerobject, &methodcaller_type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
814 if (mc == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
815 return NULL;
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
816
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
817 newargs = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
818 if (newargs == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
819 Py_DECREF(mc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
820 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
821 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
822 mc->args = newargs;
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
823
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
824 name = PyTuple_GET_ITEM(args, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
825 Py_INCREF(name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
826 mc->name = name;
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
827
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
828 Py_XINCREF(kwds);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
829 mc->kwds = kwds;
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
830
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
831 PyObject_GC_Track(mc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
832 return (PyObject *)mc;
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
833 }
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
834
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
835 static void
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
836 methodcaller_dealloc(methodcallerobject *mc)
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
837 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
838 PyObject_GC_UnTrack(mc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
839 Py_XDECREF(mc->name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
840 Py_XDECREF(mc->args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
841 Py_XDECREF(mc->kwds);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
842 PyObject_GC_Del(mc);
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
843 }
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
844
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
845 static int
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
846 methodcaller_traverse(methodcallerobject *mc, visitproc visit, void *arg)
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
847 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
848 Py_VISIT(mc->args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
849 Py_VISIT(mc->kwds);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
850 return 0;
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
851 }
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
852
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
853 static PyObject *
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
854 methodcaller_call(methodcallerobject *mc, PyObject *args, PyObject *kw)
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
855 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
856 PyObject *method, *obj, *result;
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
857
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
858 if (!PyArg_UnpackTuple(args, "methodcaller", 1, 1, &obj))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
859 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
860 method = PyObject_GetAttr(obj, mc->name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
861 if (method == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
862 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
863 result = PyObject_Call(method, mc->args, mc->kwds);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
864 Py_DECREF(method);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
865 return result;
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
866 }
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
867
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
868 PyDoc_STRVAR(methodcaller_doc,
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
869 "methodcaller(name, ...) --> methodcaller object\n\
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
870 \n\
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
871 Return a callable object that calls the given method on its operand.\n\
83465
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
872 After f = methodcaller('name'), the call f(r) returns r.name().\n\
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
873 After g = methodcaller('name', 'date', foo=1), the call g(r) returns\n\
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
874 r.name('date', foo=1).");
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
875
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
876 static PyTypeObject methodcaller_type = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
877 PyVarObject_HEAD_INIT(NULL, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
878 "operator.methodcaller", /* tp_name */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
879 sizeof(methodcallerobject), /* tp_basicsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
880 0, /* tp_itemsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
881 /* methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
882 (destructor)methodcaller_dealloc, /* tp_dealloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
883 0, /* tp_print */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
884 0, /* tp_getattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
885 0, /* tp_setattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
886 0, /* tp_reserved */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
887 0, /* tp_repr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
888 0, /* tp_as_number */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
889 0, /* tp_as_sequence */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
890 0, /* tp_as_mapping */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
891 0, /* tp_hash */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
892 (ternaryfunc)methodcaller_call, /* tp_call */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
893 0, /* tp_str */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
894 PyObject_GenericGetAttr, /* tp_getattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
895 0, /* tp_setattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
896 0, /* tp_as_buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
897 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
898 methodcaller_doc, /* tp_doc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
899 (traverseproc)methodcaller_traverse, /* tp_traverse */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
900 0, /* tp_clear */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
901 0, /* tp_richcompare */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
902 0, /* tp_weaklistoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
903 0, /* tp_iter */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
904 0, /* tp_iternext */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
905 0, /* tp_methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
906 0, /* tp_members */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
907 0, /* tp_getset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
908 0, /* tp_base */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
909 0, /* tp_dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
910 0, /* tp_descr_get */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
911 0, /* tp_descr_set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
912 0, /* tp_dictoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
913 0, /* tp_init */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
914 0, /* tp_alloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
915 methodcaller_new, /* tp_new */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
916 0, /* tp_free */
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
917 };
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
918
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
919
83465
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
920 /* Initialization function for the module (*must* be called PyInit__operator) */
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 45795
diff changeset
921
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 45795
diff changeset
922
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 45795
diff changeset
923 static struct PyModuleDef operatormodule = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
924 PyModuleDef_HEAD_INIT,
83465
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
925 "_operator",
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
926 operator_doc,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
927 -1,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
928 operator_methods,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
929 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
930 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
931 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
932 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 45795
diff changeset
933 };
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
934
24471
f66b3a3509c7 Excise DL_EXPORT/DL_IMPORT from Modules/*. Required adding a prototype
Mark Hammond <mhammond@skippinet.com.au>
parents: 23832
diff changeset
935 PyMODINIT_FUNC
83465
97834382c6cc Issue #16694: Add a pure Python implementation of the operator module.
Antoine Pitrou <solipsis@pitrou.net>
parents: 79511
diff changeset
936 PyInit__operator(void)
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
937 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
938 PyObject *m;
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
939
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
940 /* Create the module and add the functions */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
941 m = PyModule_Create(&operatormodule);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
942 if (m == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
943 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
944
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
945 if (PyType_Ready(&itemgetter_type) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
946 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
947 Py_INCREF(&itemgetter_type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
948 PyModule_AddObject(m, "itemgetter", (PyObject *)&itemgetter_type);
31052
456e274f8602 As discussed on python-dev, added two extractor functions to the
Raymond Hettinger <python@rcn.com>
parents: 27290
diff changeset
949
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
950 if (PyType_Ready(&attrgetter_type) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
951 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
952 Py_INCREF(&attrgetter_type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
953 PyModule_AddObject(m, "attrgetter", (PyObject *)&attrgetter_type);
45495
48488fa50729 Merged revisions 61003-61033 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
954
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
955 if (PyType_Ready(&methodcaller_type) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
956 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
957 Py_INCREF(&methodcaller_type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
958 PyModule_AddObject(m, "methodcaller", (PyObject *)&methodcaller_type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
959 return m;
3844
0d54a14ef0b8 Operators like __add__
Guido van Rossum <guido@python.org>
parents:
diff changeset
960 }