annotate Modules/_functoolsmodule.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 e0ee10f27e5f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
2 #include "Python.h"
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
3 #include "structmember.h"
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
4
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
5 /* _functools module written and maintained
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
6 by Hye-Shik Chang <perky@FreeBSD.org>
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
7 with adaptations by Raymond Hettinger <python@rcn.com>
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
8 Copyright (c) 2004, 2005, 2006 Python Software Foundation.
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
9 All rights reserved.
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
10 */
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
11
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
12 /* partial object **********************************************************/
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
13
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
14 typedef struct {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
15 PyObject_HEAD
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
16 PyObject *fn;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
17 PyObject *args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
18 PyObject *kw;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
19 PyObject *dict;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
20 PyObject *weakreflist; /* List of weak references */
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
21 } partialobject;
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
22
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
23 static PyTypeObject partial_type;
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
24
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
25 static PyObject *
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
26 partial_new(PyTypeObject *type, PyObject *args, PyObject *kw)
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
27 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
28 PyObject *func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
29 partialobject *pto;
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
30
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
31 if (PyTuple_GET_SIZE(args) < 1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
32 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
33 "type 'partial' takes at least one argument");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
34 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
35 }
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
36
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
37 func = PyTuple_GET_ITEM(args, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
38 if (!PyCallable_Check(func)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
39 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
40 "the first argument must be callable");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
41 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
42 }
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
43
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
44 /* create partialobject structure */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
45 pto = (partialobject *)type->tp_alloc(type, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
46 if (pto == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
47 return NULL;
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
48
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
49 pto->fn = func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
50 Py_INCREF(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
51 pto->args = PyTuple_GetSlice(args, 1, PY_SSIZE_T_MAX);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
52 if (pto->args == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
53 pto->kw = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
54 Py_DECREF(pto);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
55 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
56 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
57 if (kw != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
58 pto->kw = PyDict_Copy(kw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
59 if (pto->kw == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
60 Py_DECREF(pto);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
61 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
62 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
63 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
64 pto->kw = Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
65 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
66 }
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
67
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
68 pto->weakreflist = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
69 pto->dict = NULL;
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
70
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
71 return (PyObject *)pto;
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
72 }
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
73
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
74 static void
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
75 partial_dealloc(partialobject *pto)
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
76 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
77 PyObject_GC_UnTrack(pto);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
78 if (pto->weakreflist != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
79 PyObject_ClearWeakRefs((PyObject *) pto);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
80 Py_XDECREF(pto->fn);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
81 Py_XDECREF(pto->args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
82 Py_XDECREF(pto->kw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
83 Py_XDECREF(pto->dict);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
84 Py_TYPE(pto)->tp_free(pto);
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
85 }
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
86
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
87 static PyObject *
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
88 partial_call(partialobject *pto, PyObject *args, PyObject *kw)
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
89 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
90 PyObject *ret;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
91 PyObject *argappl = NULL, *kwappl = NULL;
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
92
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
93 assert (PyCallable_Check(pto->fn));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
94 assert (PyTuple_Check(pto->args));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
95 assert (pto->kw == Py_None || PyDict_Check(pto->kw));
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
96
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
97 if (PyTuple_GET_SIZE(pto->args) == 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
98 argappl = args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
99 Py_INCREF(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
100 } else if (PyTuple_GET_SIZE(args) == 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
101 argappl = pto->args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
102 Py_INCREF(pto->args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
103 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
104 argappl = PySequence_Concat(pto->args, args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
105 if (argappl == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
106 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
107 }
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
108
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
109 if (pto->kw == Py_None) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
110 kwappl = kw;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
111 Py_XINCREF(kw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
112 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
113 kwappl = PyDict_Copy(pto->kw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
114 if (kwappl == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
115 Py_DECREF(argappl);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
116 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
117 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
118 if (kw != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
119 if (PyDict_Merge(kwappl, kw, 1) != 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
120 Py_DECREF(argappl);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
121 Py_DECREF(kwappl);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
122 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
123 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
124 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
125 }
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
126
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
127 ret = PyObject_Call(pto->fn, argappl, kwappl);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
128 Py_DECREF(argappl);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
129 Py_XDECREF(kwappl);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
130 return ret;
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
131 }
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
132
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
133 static int
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
134 partial_traverse(partialobject *pto, visitproc visit, void *arg)
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
135 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
136 Py_VISIT(pto->fn);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
137 Py_VISIT(pto->args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
138 Py_VISIT(pto->kw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
139 Py_VISIT(pto->dict);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
140 return 0;
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
141 }
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
142
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
143 PyDoc_STRVAR(partial_doc,
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
144 "partial(func, *args, **keywords) - new function with partial application\n\
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
145 of the given arguments and keywords.\n");
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
146
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
147 #define OFF(x) offsetof(partialobject, x)
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
148 static PyMemberDef partial_memberlist[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
149 {"func", T_OBJECT, OFF(fn), READONLY,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
150 "function object to use in future partial calls"},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
151 {"args", T_OBJECT, OFF(args), READONLY,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
152 "tuple of arguments to future partial calls"},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
153 {"keywords", T_OBJECT, OFF(kw), READONLY,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
154 "dictionary of keyword arguments to future partial calls"},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
155 {NULL} /* Sentinel */
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
156 };
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
157
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
158 static PyGetSetDef partial_getsetlist[] = {
75051
f029312764b4 use new generic __dict__ descriptor implementations
Benjamin Peterson <benjamin@python.org>
parents: 69222
diff changeset
159 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
160 {NULL} /* Sentinel */
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
161 };
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
162
66587
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
163 static PyObject *
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
164 partial_repr(partialobject *pto)
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
165 {
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
166 PyObject *result;
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
167 PyObject *arglist;
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
168 PyObject *tmp;
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
169 Py_ssize_t i, n;
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
170
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
171 arglist = PyUnicode_FromString("");
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
172 if (arglist == NULL) {
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
173 return NULL;
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
174 }
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
175 /* Pack positional arguments */
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
176 assert (PyTuple_Check(pto->args));
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
177 n = PyTuple_GET_SIZE(pto->args);
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
178 for (i = 0; i < n; i++) {
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
179 tmp = PyUnicode_FromFormat("%U, %R", arglist,
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
180 PyTuple_GET_ITEM(pto->args, i));
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
181 Py_DECREF(arglist);
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
182 if (tmp == NULL)
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
183 return NULL;
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
184 arglist = tmp;
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
185 }
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
186 /* Pack keyword arguments */
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
187 assert (pto->kw == Py_None || PyDict_Check(pto->kw));
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
188 if (pto->kw != Py_None) {
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
189 PyObject *key, *value;
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
190 for (i = 0; PyDict_Next(pto->kw, &i, &key, &value);) {
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
191 tmp = PyUnicode_FromFormat("%U, %U=%R", arglist,
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
192 key, value);
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
193 Py_DECREF(arglist);
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
194 if (tmp == NULL)
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
195 return NULL;
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
196 arglist = tmp;
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
197 }
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
198 }
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
199 result = PyUnicode_FromFormat("%s(%R%U)", Py_TYPE(pto)->tp_name,
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
200 pto->fn, arglist);
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
201 Py_DECREF(arglist);
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
202 return result;
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
203 }
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
204
52637
ffa81bd2ec72 Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents: 51271
diff changeset
205 /* Pickle strategy:
ffa81bd2ec72 Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents: 51271
diff changeset
206 __reduce__ by itself doesn't support getting kwargs in the unpickle
ffa81bd2ec72 Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents: 51271
diff changeset
207 operation so we define a __setstate__ that replaces all the information
ffa81bd2ec72 Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents: 51271
diff changeset
208 about the partial. If we only replaced part of it someone would use
68585
bf94b6a73fc8 #11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64068
diff changeset
209 it as a hook to do strange things.
52637
ffa81bd2ec72 Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents: 51271
diff changeset
210 */
ffa81bd2ec72 Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents: 51271
diff changeset
211
54320
565413ee9c1b Make some private functions static (thanks `make smelly`)
Antoine Pitrou <solipsis@pitrou.net>
parents: 52637
diff changeset
212 static PyObject *
52637
ffa81bd2ec72 Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents: 51271
diff changeset
213 partial_reduce(partialobject *pto, PyObject *unused)
ffa81bd2ec72 Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents: 51271
diff changeset
214 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
215 return Py_BuildValue("O(O)(OOOO)", Py_TYPE(pto), pto->fn, pto->fn,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
216 pto->args, pto->kw,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
217 pto->dict ? pto->dict : Py_None);
52637
ffa81bd2ec72 Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents: 51271
diff changeset
218 }
ffa81bd2ec72 Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents: 51271
diff changeset
219
54320
565413ee9c1b Make some private functions static (thanks `make smelly`)
Antoine Pitrou <solipsis@pitrou.net>
parents: 52637
diff changeset
220 static PyObject *
81987
4bac47eb444c Issue #6083: Fix multiple segmentation faults occured when PyArg_ParseTuple
Serhiy Storchaka <storchaka@gmail.com>
parents: 68586
diff changeset
221 partial_setstate(partialobject *pto, PyObject *state)
52637
ffa81bd2ec72 Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents: 51271
diff changeset
222 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
223 PyObject *fn, *fnargs, *kw, *dict;
81987
4bac47eb444c Issue #6083: Fix multiple segmentation faults occured when PyArg_ParseTuple
Serhiy Storchaka <storchaka@gmail.com>
parents: 68586
diff changeset
224 if (!PyArg_ParseTuple(state, "OOOO",
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
225 &fn, &fnargs, &kw, &dict))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
226 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
227 Py_XDECREF(pto->fn);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
228 Py_XDECREF(pto->args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
229 Py_XDECREF(pto->kw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
230 Py_XDECREF(pto->dict);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
231 pto->fn = fn;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
232 pto->args = fnargs;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
233 pto->kw = kw;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
234 if (dict != Py_None) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
235 pto->dict = dict;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
236 Py_INCREF(dict);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
237 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
238 pto->dict = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
239 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
240 Py_INCREF(fn);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
241 Py_INCREF(fnargs);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
242 Py_INCREF(kw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
243 Py_RETURN_NONE;
52637
ffa81bd2ec72 Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents: 51271
diff changeset
244 }
ffa81bd2ec72 Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents: 51271
diff changeset
245
ffa81bd2ec72 Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents: 51271
diff changeset
246 static PyMethodDef partial_methods[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
247 {"__reduce__", (PyCFunction)partial_reduce, METH_NOARGS},
81987
4bac47eb444c Issue #6083: Fix multiple segmentation faults occured when PyArg_ParseTuple
Serhiy Storchaka <storchaka@gmail.com>
parents: 68586
diff changeset
248 {"__setstate__", (PyCFunction)partial_setstate, METH_O},
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
249 {NULL, NULL} /* sentinel */
52637
ffa81bd2ec72 Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents: 51271
diff changeset
250 };
ffa81bd2ec72 Merged revisions 70931 via svnmerge from
Jack Diederich <jackdied@gmail.com>
parents: 51271
diff changeset
251
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
252 static PyTypeObject partial_type = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
253 PyVarObject_HEAD_INIT(NULL, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
254 "functools.partial", /* tp_name */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
255 sizeof(partialobject), /* tp_basicsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
256 0, /* tp_itemsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
257 /* methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
258 (destructor)partial_dealloc, /* tp_dealloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
259 0, /* tp_print */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
260 0, /* tp_getattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
261 0, /* tp_setattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
262 0, /* tp_reserved */
66587
2baad8bd0b4f Issue #4113: Added custom __repr__ method to functools.partial.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 64068
diff changeset
263 (reprfunc)partial_repr, /* tp_repr */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
264 0, /* tp_as_number */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
265 0, /* tp_as_sequence */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
266 0, /* tp_as_mapping */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
267 0, /* tp_hash */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
268 (ternaryfunc)partial_call, /* tp_call */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
269 0, /* tp_str */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
270 PyObject_GenericGetAttr, /* tp_getattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
271 PyObject_GenericSetAttr, /* tp_setattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
272 0, /* tp_as_buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
273 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
274 Py_TPFLAGS_BASETYPE, /* tp_flags */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
275 partial_doc, /* tp_doc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
276 (traverseproc)partial_traverse, /* tp_traverse */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
277 0, /* tp_clear */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
278 0, /* tp_richcompare */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
279 offsetof(partialobject, weakreflist), /* tp_weaklistoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
280 0, /* tp_iter */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
281 0, /* tp_iternext */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
282 partial_methods, /* tp_methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
283 partial_memberlist, /* tp_members */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
284 partial_getsetlist, /* tp_getset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
285 0, /* tp_base */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
286 0, /* tp_dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
287 0, /* tp_descr_get */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
288 0, /* tp_descr_set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
289 offsetof(partialobject, dict), /* tp_dictoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
290 0, /* tp_init */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
291 0, /* tp_alloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
292 partial_new, /* tp_new */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
293 PyObject_GC_Del, /* tp_free */
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
294 };
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
295
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
296
69150
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
297 /* cmp_to_key ***************************************************************/
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
298
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
299 typedef struct {
69151
76ed6a061ebe Issue #11707: Fix compilation errors with Visual Studio
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69150
diff changeset
300 PyObject_HEAD
69150
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
301 PyObject *cmp;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
302 PyObject *object;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
303 } keyobject;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
304
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
305 static void
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
306 keyobject_dealloc(keyobject *ko)
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
307 {
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
308 Py_DECREF(ko->cmp);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
309 Py_XDECREF(ko->object);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
310 PyObject_FREE(ko);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
311 }
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
312
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
313 static int
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
314 keyobject_traverse(keyobject *ko, visitproc visit, void *arg)
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
315 {
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
316 Py_VISIT(ko->cmp);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
317 if (ko->object)
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
318 Py_VISIT(ko->object);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
319 return 0;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
320 }
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
321
69161
7b5d09343929 implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents: 69151
diff changeset
322 static int
7b5d09343929 implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents: 69151
diff changeset
323 keyobject_clear(keyobject *ko)
7b5d09343929 implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents: 69151
diff changeset
324 {
7b5d09343929 implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents: 69151
diff changeset
325 Py_CLEAR(ko->cmp);
7b5d09343929 implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents: 69151
diff changeset
326 if (ko->object)
7b5d09343929 implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents: 69151
diff changeset
327 Py_CLEAR(ko->object);
7b5d09343929 implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents: 69151
diff changeset
328 return 0;
7b5d09343929 implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents: 69151
diff changeset
329 }
7b5d09343929 implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents: 69151
diff changeset
330
69150
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
331 static PyMemberDef keyobject_members[] = {
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
332 {"obj", T_OBJECT,
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
333 offsetof(keyobject, object), 0,
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
334 PyDoc_STR("Value wrapped by a key function.")},
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
335 {NULL}
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
336 };
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
337
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
338 static PyObject *
69222
a593a1030f2c Fix nit (make spelling consistent in prototype)
Raymond Hettinger <python@rcn.com>
parents: 69161
diff changeset
339 keyobject_call(keyobject *ko, PyObject *args, PyObject *kwds);
69150
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
340
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
341 static PyObject *
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
342 keyobject_richcompare(PyObject *ko, PyObject *other, int op);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
343
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
344 static PyTypeObject keyobject_type = {
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
345 PyVarObject_HEAD_INIT(&PyType_Type, 0)
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
346 "functools.KeyWrapper", /* tp_name */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
347 sizeof(keyobject), /* tp_basicsize */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
348 0, /* tp_itemsize */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
349 /* methods */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
350 (destructor)keyobject_dealloc, /* tp_dealloc */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
351 0, /* tp_print */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
352 0, /* tp_getattr */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
353 0, /* tp_setattr */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
354 0, /* tp_reserved */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
355 0, /* tp_repr */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
356 0, /* tp_as_number */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
357 0, /* tp_as_sequence */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
358 0, /* tp_as_mapping */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
359 0, /* tp_hash */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
360 (ternaryfunc)keyobject_call, /* tp_call */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
361 0, /* tp_str */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
362 PyObject_GenericGetAttr, /* tp_getattro */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
363 0, /* tp_setattro */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
364 0, /* tp_as_buffer */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
365 Py_TPFLAGS_DEFAULT, /* tp_flags */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
366 0, /* tp_doc */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
367 (traverseproc)keyobject_traverse, /* tp_traverse */
69161
7b5d09343929 implement tp_clear
Benjamin Peterson <benjamin@python.org>
parents: 69151
diff changeset
368 (inquiry)keyobject_clear, /* tp_clear */
69150
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
369 keyobject_richcompare, /* tp_richcompare */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
370 0, /* tp_weaklistoffset */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
371 0, /* tp_iter */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
372 0, /* tp_iternext */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
373 0, /* tp_methods */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
374 keyobject_members, /* tp_members */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
375 0, /* tp_getset */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
376 };
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
377
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
378 static PyObject *
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
379 keyobject_call(keyobject *ko, PyObject *args, PyObject *kwds)
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
380 {
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
381 PyObject *object;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
382 keyobject *result;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
383 static char *kwargs[] = {"obj", NULL};
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
384
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
385 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:K", kwargs, &object))
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
386 return NULL;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
387 result = PyObject_New(keyobject, &keyobject_type);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
388 if (!result)
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
389 return NULL;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
390 Py_INCREF(ko->cmp);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
391 result->cmp = ko->cmp;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
392 Py_INCREF(object);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
393 result->object = object;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
394 return (PyObject *)result;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
395 }
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
396
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
397 static PyObject *
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
398 keyobject_richcompare(PyObject *ko, PyObject *other, int op)
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
399 {
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
400 PyObject *res;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
401 PyObject *args;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
402 PyObject *x;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
403 PyObject *y;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
404 PyObject *compare;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
405 PyObject *answer;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
406 static PyObject *zero;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
407
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
408 if (zero == NULL) {
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
409 zero = PyLong_FromLong(0);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
410 if (!zero)
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
411 return NULL;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
412 }
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
413
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
414 if (Py_TYPE(other) != &keyobject_type){
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
415 PyErr_Format(PyExc_TypeError, "other argument must be K instance");
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
416 return NULL;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
417 }
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
418 compare = ((keyobject *) ko)->cmp;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
419 assert(compare != NULL);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
420 x = ((keyobject *) ko)->object;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
421 y = ((keyobject *) other)->object;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
422 if (!x || !y){
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
423 PyErr_Format(PyExc_AttributeError, "object");
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
424 return NULL;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
425 }
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
426
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
427 /* Call the user's comparison function and translate the 3-way
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
428 * result into true or false (or error).
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
429 */
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
430 args = PyTuple_New(2);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
431 if (args == NULL)
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
432 return NULL;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
433 Py_INCREF(x);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
434 Py_INCREF(y);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
435 PyTuple_SET_ITEM(args, 0, x);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
436 PyTuple_SET_ITEM(args, 1, y);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
437 res = PyObject_Call(compare, args, NULL);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
438 Py_DECREF(args);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
439 if (res == NULL)
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
440 return NULL;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
441 answer = PyObject_RichCompare(res, zero, op);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
442 Py_DECREF(res);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
443 return answer;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
444 }
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
445
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
446 static PyObject *
69151
76ed6a061ebe Issue #11707: Fix compilation errors with Visual Studio
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69150
diff changeset
447 functools_cmp_to_key(PyObject *self, PyObject *args, PyObject *kwds)
76ed6a061ebe Issue #11707: Fix compilation errors with Visual Studio
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69150
diff changeset
448 {
76ed6a061ebe Issue #11707: Fix compilation errors with Visual Studio
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69150
diff changeset
449 PyObject *cmp;
69150
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
450 static char *kwargs[] = {"mycmp", NULL};
69151
76ed6a061ebe Issue #11707: Fix compilation errors with Visual Studio
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69150
diff changeset
451 keyobject *object;
69150
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
452
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
453 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:cmp_to_key", kwargs, &cmp))
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
454 return NULL;
69151
76ed6a061ebe Issue #11707: Fix compilation errors with Visual Studio
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69150
diff changeset
455 object = PyObject_New(keyobject, &keyobject_type);
69150
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
456 if (!object)
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
457 return NULL;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
458 Py_INCREF(cmp);
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
459 object->cmp = cmp;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
460 object->object = NULL;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
461 return (PyObject *)object;
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
462 }
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
463
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
464 PyDoc_STRVAR(functools_cmp_to_key_doc,
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
465 "Convert a cmp= function into a key= function.");
a03fb2fc3ed8 Issue #11707: Fast C version of functools.cmp_to_key()
Raymond Hettinger <python@rcn.com>
parents: 68586
diff changeset
466
39691
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
467 /* reduce (used to be a builtin) ********************************************/
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
468
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
469 static PyObject *
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
470 functools_reduce(PyObject *self, PyObject *args)
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
471 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
472 PyObject *seq, *func, *result = NULL, *it;
39691
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
473
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
474 if (!PyArg_UnpackTuple(args, "reduce", 2, 3, &func, &seq, &result))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
475 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
476 if (result != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
477 Py_INCREF(result);
39691
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
478
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
479 it = PyObject_GetIter(seq);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
480 if (it == NULL) {
64068
715c44b60ef3 Issue #665761: functools.reduce() will no longer mask exceptions other
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
481 if (PyErr_ExceptionMatches(PyExc_TypeError))
715c44b60ef3 Issue #665761: functools.reduce() will no longer mask exceptions other
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
482 PyErr_SetString(PyExc_TypeError,
715c44b60ef3 Issue #665761: functools.reduce() will no longer mask exceptions other
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61466
diff changeset
483 "reduce() arg 2 must support iteration");
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
484 Py_XDECREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
485 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
486 }
39691
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
487
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
488 if ((args = PyTuple_New(2)) == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
489 goto Fail;
39691
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
490
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
491 for (;;) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
492 PyObject *op2;
39691
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
493
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
494 if (args->ob_refcnt > 1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
495 Py_DECREF(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
496 if ((args = PyTuple_New(2)) == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
497 goto Fail;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
498 }
39691
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
499
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
500 op2 = PyIter_Next(it);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
501 if (op2 == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
502 if (PyErr_Occurred())
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
503 goto Fail;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
504 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
505 }
39691
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
506
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
507 if (result == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
508 result = op2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
509 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
510 PyTuple_SetItem(args, 0, result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
511 PyTuple_SetItem(args, 1, op2);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
512 if ((result = PyEval_CallObject(func, args)) == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
513 goto Fail;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
514 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
515 }
39691
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
516
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
517 Py_DECREF(args);
39691
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
518
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
519 if (result == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
520 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
521 "reduce() of empty sequence with no initial value");
39691
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
522
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
523 Py_DECREF(it);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
524 return result;
39691
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
525
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
526 Fail:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
527 Py_XDECREF(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
528 Py_XDECREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
529 Py_DECREF(it);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
530 return NULL;
39691
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
531 }
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
532
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
533 PyDoc_STRVAR(functools_reduce_doc,
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
534 "reduce(function, sequence[, initial]) -> value\n\
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
535 \n\
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
536 Apply a function of two arguments cumulatively to the items of a sequence,\n\
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
537 from left to right, so as to reduce the sequence to a single value.\n\
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
538 For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
539 ((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
540 of the sequence in the calculation, and serves as a default when the\n\
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
541 sequence is empty.");
c4d8c054616c Part of SF patch #1513870 (the still relevant part) -- add reduce() to
Guido van Rossum <guido@python.org>
parents: 39222
diff changeset
542
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
543 /* module level code ********************************************************/
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
544
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
545 PyDoc_STRVAR(module_doc,
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
546 "Tools that operate on functions.");
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
547
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
548 static PyMethodDef module_methods[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
549 {"reduce", functools_reduce, METH_VARARGS, functools_reduce_doc},
69151
76ed6a061ebe Issue #11707: Fix compilation errors with Visual Studio
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69150
diff changeset
550 {"cmp_to_key", (PyCFunction)functools_cmp_to_key,
76ed6a061ebe Issue #11707: Fix compilation errors with Visual Studio
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69150
diff changeset
551 METH_VARARGS | METH_KEYWORDS, functools_cmp_to_key_doc},
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
552 {NULL, NULL} /* sentinel */
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
553 };
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
554
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
555
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
556 static struct PyModuleDef _functoolsmodule = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
557 PyModuleDef_HEAD_INIT,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
558 "_functools",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
559 module_doc,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
560 -1,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
561 module_methods,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
562 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
563 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
564 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
565 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
566 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
567
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
568 PyMODINIT_FUNC
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
569 PyInit__functools(void)
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
570 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
571 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
572 PyObject *m;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
573 char *name;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
574 PyTypeObject *typelist[] = {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
575 &partial_type,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
576 NULL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
577 };
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
578
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
579 m = PyModule_Create(&_functoolsmodule);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
580 if (m == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
581 return NULL;
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
582
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
583 for (i=0 ; typelist[i] != NULL ; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
584 if (PyType_Ready(typelist[i]) < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
585 Py_DECREF(m);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
586 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
587 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
588 name = strchr(typelist[i]->tp_name, '.');
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
589 assert (name != NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
590 Py_INCREF(typelist[i]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
591 PyModule_AddObject(m, name+1, (PyObject *)typelist[i]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
592 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54320
diff changeset
593 return m;
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
diff changeset
594 }