Mercurial > cpython-lru_cache-weakref
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 |
| 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 | 6 \n\ |
| 7 This module exports a set of functions implemented in C corresponding\n\ | |
| 8 to the intrinsic operators of Python. For example, operator.add(x, y)\n\ | |
| 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 | 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 | 14 return AOP(a1); } |
| 15 | |
| 13422 | 16 #define spam2(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \ |
| 3844 | 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 | 19 return AOP(a1,a2); } |
| 20 | |
| 13422 | 21 #define spamoi(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \ |
| 3844 | 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 | 24 return AOP(a1,a2); } |
| 25 | |
| 13422 | 26 #define spam2n(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \ |
| 3844 | 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 | 29 if(-1 == AOP(a1,a2)) return NULL; \ |
| 30 Py_INCREF(Py_None); \ | |
| 31 return Py_None; } | |
| 32 | |
| 13422 | 33 #define spam3n(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \ |
| 3844 | 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 | 36 if(-1 == AOP(a1,a2,a3)) return NULL; \ |
| 37 Py_INCREF(Py_None); \ | |
| 38 return Py_None; } | |
| 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 | 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 | 44 |
| 13422 | 45 #define spami2(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \ |
| 3844 | 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 | 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 | 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 | 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 | 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 | 111 |
| 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 | 158 #undef spam1 |
| 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 | 328 |
| 329 static struct PyMethodDef operator_methods[] = { | |
| 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 | 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 | 395 |
| 396 }; | |
| 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 | 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 | 569 void *data; |
| 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 | 579 if (PyUnicode_READY(item)) { |
| 580 Py_DECREF(attr); | |
| 581 return NULL; | |
| 582 } | |
| 583 item_len = PyUnicode_GET_LENGTH(item); | |
| 584 kind = PyUnicode_KIND(item); | |
| 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 | 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 | 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 | 614 attr_chain_item = PyUnicode_Substring(item, |
| 615 unibuff_from, | |
| 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 | 629 attr_chain_item = PyUnicode_Substring(item, |
| 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 | 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 | 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 | 960 } |
