Mercurial > cpython-lru_cache-weakref
annotate Objects/methodobject.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 | 24c84d00cf1f |
| children |
| rev | line source |
|---|---|
| 145 | 1 |
| 6 | 2 /* Method object implementation */ |
| 3 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
4 #include "Python.h" |
|
27559
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27093
diff
changeset
|
5 #include "structmember.h" |
| 6 | 6 |
|
45192
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43893
diff
changeset
|
7 /* Free list for method objects to safe malloc/free overhead |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43893
diff
changeset
|
8 * The m_self element is used to chain the objects. |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43893
diff
changeset
|
9 */ |
|
5934
0369d63b100b
Added separate free list for cfunction (builtin method) objects, for a
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
10 static PyCFunctionObject *free_list = NULL; |
|
45192
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43893
diff
changeset
|
11 static int numfree = 0; |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43893
diff
changeset
|
12 #ifndef PyCFunction_MAXFREELIST |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43893
diff
changeset
|
13 #define PyCFunction_MAXFREELIST 256 |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43893
diff
changeset
|
14 #endif |
|
5934
0369d63b100b
Added separate free list for cfunction (builtin method) objects, for a
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
15 |
|
81074
70ea05f762a1
Fix compilation error for #15422
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
81031
diff
changeset
|
16 /* undefine macro trampoline to PyCFunction_NewEx */ |
|
70ea05f762a1
Fix compilation error for #15422
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
81031
diff
changeset
|
17 #undef PyCFunction_New |
|
70ea05f762a1
Fix compilation error for #15422
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
81031
diff
changeset
|
18 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
19 PyObject * |
|
81031
3a86a3f1d89a
Issue #15422: get rid of PyCFunction_New macro
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
77577
diff
changeset
|
20 PyCFunction_New(PyMethodDef *ml, PyObject *self) |
|
3a86a3f1d89a
Issue #15422: get rid of PyCFunction_New macro
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
77577
diff
changeset
|
21 { |
|
3a86a3f1d89a
Issue #15422: get rid of PyCFunction_New macro
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
77577
diff
changeset
|
22 return PyCFunction_NewEx(ml, self, NULL); |
|
3a86a3f1d89a
Issue #15422: get rid of PyCFunction_New macro
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
77577
diff
changeset
|
23 } |
|
3a86a3f1d89a
Issue #15422: get rid of PyCFunction_New macro
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
77577
diff
changeset
|
24 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
25 PyObject * |
|
27559
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27093
diff
changeset
|
26 PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) |
| 6 | 27 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
28 PyCFunctionObject *op; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
29 op = free_list; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
30 if (op != NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
31 free_list = (PyCFunctionObject *)(op->m_self); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
32 PyObject_INIT(op, &PyCFunction_Type); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
33 numfree--; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
34 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
35 else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
36 op = PyObject_GC_New(PyCFunctionObject, &PyCFunction_Type); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
37 if (op == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
38 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
39 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
40 op->m_ml = ml; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
41 Py_XINCREF(self); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
42 op->m_self = self; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
43 Py_XINCREF(module); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
44 op->m_module = module; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
45 _PyObject_GC_TRACK(op); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
46 return (PyObject *)op; |
| 6 | 47 } |
| 48 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
49 PyCFunction |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
50 PyCFunction_GetFunction(PyObject *op) |
| 6 | 51 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
52 if (!PyCFunction_Check(op)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
53 PyErr_BadInternalCall(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
54 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
55 } |
|
74141
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
56 return PyCFunction_GET_FUNCTION(op); |
| 6 | 57 } |
| 58 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
59 PyObject * |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
60 PyCFunction_GetSelf(PyObject *op) |
| 6 | 61 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
62 if (!PyCFunction_Check(op)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
63 PyErr_BadInternalCall(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
64 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
65 } |
|
74141
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
66 return PyCFunction_GET_SELF(op); |
| 6 | 67 } |
| 68 | |
|
488
90f35fcf8ea0
Add "varargs" attribute.
Guido van Rossum <guido@python.org>
parents:
472
diff
changeset
|
69 int |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
70 PyCFunction_GetFlags(PyObject *op) |
|
488
90f35fcf8ea0
Add "varargs" attribute.
Guido van Rossum <guido@python.org>
parents:
472
diff
changeset
|
71 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
72 if (!PyCFunction_Check(op)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
73 PyErr_BadInternalCall(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
74 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
75 } |
|
74141
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
76 return PyCFunction_GET_FLAGS(op); |
|
488
90f35fcf8ea0
Add "varargs" attribute.
Guido van Rossum <guido@python.org>
parents:
472
diff
changeset
|
77 } |
|
90f35fcf8ea0
Add "varargs" attribute.
Guido van Rossum <guido@python.org>
parents:
472
diff
changeset
|
78 |
|
19198
3c1c9948ff65
Remove much dead code from ceval.c
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
18933
diff
changeset
|
79 PyObject * |
|
3c1c9948ff65
Remove much dead code from ceval.c
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
18933
diff
changeset
|
80 PyCFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) |
|
3c1c9948ff65
Remove much dead code from ceval.c
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
18933
diff
changeset
|
81 { |
|
84570
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
82 #define CHECK_RESULT(res) assert(res != NULL || PyErr_Occurred()) |
|
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
83 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
84 PyCFunctionObject* f = (PyCFunctionObject*)func; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
85 PyCFunction meth = PyCFunction_GET_FUNCTION(func); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
86 PyObject *self = PyCFunction_GET_SELF(func); |
|
84570
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
87 PyObject *res; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
88 Py_ssize_t size; |
|
19198
3c1c9948ff65
Remove much dead code from ceval.c
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
18933
diff
changeset
|
89 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
90 switch (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
91 case METH_VARARGS: |
|
84570
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
92 if (kw == NULL || PyDict_Size(kw) == 0) { |
|
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
93 res = (*meth)(self, arg); |
|
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
94 CHECK_RESULT(res); |
|
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
95 return res; |
|
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
96 } |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
97 break; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
98 case METH_VARARGS | METH_KEYWORDS: |
|
84570
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
99 res = (*(PyCFunctionWithKeywords)meth)(self, arg, kw); |
|
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
100 CHECK_RESULT(res); |
|
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
101 return res; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
102 case METH_NOARGS: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
103 if (kw == NULL || PyDict_Size(kw) == 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
104 size = PyTuple_GET_SIZE(arg); |
|
84570
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
105 if (size == 0) { |
|
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
106 res = (*meth)(self, NULL); |
|
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
107 CHECK_RESULT(res); |
|
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
108 return res; |
|
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
109 } |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
110 PyErr_Format(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
111 "%.200s() takes no arguments (%zd given)", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
112 f->m_ml->ml_name, size); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
113 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
114 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
115 break; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
116 case METH_O: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
117 if (kw == NULL || PyDict_Size(kw) == 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
118 size = PyTuple_GET_SIZE(arg); |
|
84570
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
119 if (size == 1) { |
|
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
120 res = (*meth)(self, PyTuple_GET_ITEM(arg, 0)); |
|
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
121 CHECK_RESULT(res); |
|
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
122 return res; |
|
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
123 } |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
124 PyErr_Format(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
125 "%.200s() takes exactly one argument (%zd given)", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
126 f->m_ml->ml_name, size); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
127 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
128 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
129 break; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
130 default: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
131 PyErr_SetString(PyExc_SystemError, "Bad call flags in " |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
132 "PyCFunction_Call. METH_OLDARGS is no " |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
133 "longer supported!"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
134 |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
135 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
136 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
137 PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
138 f->m_ml->ml_name); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
139 return NULL; |
|
84570
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
140 |
|
5e50f1a0c985
Issue #18408: In debug mode, PyCFunction_Call() now checks if an exception was
Victor Stinner <victor.stinner@gmail.com>
parents:
83253
diff
changeset
|
141 #undef CHECK_RESULT |
|
19198
3c1c9948ff65
Remove much dead code from ceval.c
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
18933
diff
changeset
|
142 } |
|
3c1c9948ff65
Remove much dead code from ceval.c
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
18933
diff
changeset
|
143 |
| 6 | 144 /* Methods (the standard built-in methods, that is) */ |
| 145 | |
| 146 static void | |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
147 meth_dealloc(PyCFunctionObject *m) |
| 6 | 148 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
149 _PyObject_GC_UNTRACK(m); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
150 Py_XDECREF(m->m_self); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
151 Py_XDECREF(m->m_module); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
152 if (numfree < PyCFunction_MAXFREELIST) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
153 m->m_self = (PyObject *)free_list; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
154 free_list = m; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
155 numfree++; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
156 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
157 else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
158 PyObject_GC_Del(m); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
159 } |
| 6 | 160 } |
| 161 | |
|
87493
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
162 static PyObject * |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
163 meth_reduce(PyCFunctionObject *m) |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
164 { |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
165 PyObject *builtins; |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
166 PyObject *getattr; |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
167 _Py_IDENTIFIER(getattr); |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
168 |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
169 if (m->m_self == NULL || PyModule_Check(m->m_self)) |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
170 return PyUnicode_FromString(m->m_ml->ml_name); |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
171 |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
172 builtins = PyEval_GetBuiltins(); |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
173 getattr = _PyDict_GetItemId(builtins, &PyId_getattr); |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
174 return Py_BuildValue("O(Os)", getattr, m->m_self, m->m_ml->ml_name); |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
175 } |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
176 |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
177 static PyMethodDef meth_methods[] = { |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
178 {"__reduce__", (PyCFunction)meth_reduce, METH_NOARGS, NULL}, |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
179 {NULL, NULL} |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
180 }; |
|
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
181 |
|
87470
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
182 /* |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
183 * finds the docstring's introspection signature. |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
184 * if present, returns a pointer pointing to the first '('. |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
185 * otherwise returns NULL. |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
186 */ |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
187 static const char *find_signature(PyCFunctionObject *m) |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
188 { |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
189 const char *trace = m->m_ml->ml_doc; |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
190 const char *name = m->m_ml->ml_name; |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
191 size_t length; |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
192 if (!trace || !name) |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
193 return NULL; |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
194 length = strlen(name); |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
195 if (strncmp(trace, name, length)) |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
196 return NULL; |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
197 trace += length; |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
198 if (*trace != '(') |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
199 return NULL; |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
200 return trace; |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
201 } |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
202 |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
203 /* |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
204 * skips to the end of the docstring's instrospection signature. |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
205 */ |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
206 static const char *skip_signature(const char *trace) |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
207 { |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
208 while (*trace && *trace != '\n') |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
209 trace++; |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
210 return trace; |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
211 } |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
212 |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
213 static const char *skip_eols(const char *trace) |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
214 { |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
215 while (*trace == '\n') |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
216 trace++; |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
217 return trace; |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
218 } |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
219 |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
220 static PyObject * |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
221 meth_get__text_signature__(PyCFunctionObject *m, void *closure) |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
222 { |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
223 const char *start = find_signature(m); |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
224 const char *trace; |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
225 |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
226 if (!start) { |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
227 Py_INCREF(Py_None); |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
228 return Py_None; |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
229 } |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
230 |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
231 trace = skip_signature(start); |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
232 return PyUnicode_FromStringAndSize(start, trace - start); |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
233 } |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
234 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18512
diff
changeset
|
235 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18512
diff
changeset
|
236 meth_get__doc__(PyCFunctionObject *m, void *closure) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18512
diff
changeset
|
237 { |
|
87470
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
238 const char *doc = find_signature(m); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18512
diff
changeset
|
239 |
|
87470
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
240 if (doc) |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
241 doc = skip_eols(skip_signature(doc)); |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
242 else |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
243 doc = m->m_ml->ml_doc; |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
244 |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
245 if (!doc) { |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
246 Py_INCREF(Py_None); |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
247 return Py_None; |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
248 } |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
249 |
|
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
250 return PyUnicode_FromString(doc); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18512
diff
changeset
|
251 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18512
diff
changeset
|
252 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18512
diff
changeset
|
253 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18512
diff
changeset
|
254 meth_get__name__(PyCFunctionObject *m, void *closure) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18512
diff
changeset
|
255 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
256 return PyUnicode_FromString(m->m_ml->ml_name); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18512
diff
changeset
|
257 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18512
diff
changeset
|
258 |
|
74141
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
259 static PyObject * |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
260 meth_get__qualname__(PyCFunctionObject *m, void *closure) |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
261 { |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
262 /* If __self__ is a module or NULL, return m.__name__ |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
263 (e.g. len.__qualname__ == 'len') |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
264 |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
265 If __self__ is a type, return m.__self__.__qualname__ + '.' + m.__name__ |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
266 (e.g. dict.fromkeys.__qualname__ == 'dict.fromkeys') |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
267 |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
268 Otherwise return type(m.__self__).__qualname__ + '.' + m.__name__ |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
269 (e.g. [].append.__qualname__ == 'list.append') */ |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
270 PyObject *type, *type_qualname, *res; |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
271 _Py_IDENTIFIER(__qualname__); |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
272 |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
273 if (m->m_self == NULL || PyModule_Check(m->m_self)) |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
274 return PyUnicode_FromString(m->m_ml->ml_name); |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
275 |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
276 type = PyType_Check(m->m_self) ? m->m_self : (PyObject*)Py_TYPE(m->m_self); |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
277 |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
278 type_qualname = _PyObject_GetAttrId(type, &PyId___qualname__); |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
279 if (type_qualname == NULL) |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
280 return NULL; |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
281 |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
282 if (!PyUnicode_Check(type_qualname)) { |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
283 PyErr_SetString(PyExc_TypeError, "<method>.__class__." |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
284 "__qualname__ is not a unicode object"); |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
285 Py_XDECREF(type_qualname); |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
286 return NULL; |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
287 } |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
288 |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
289 res = PyUnicode_FromFormat("%S.%s", type_qualname, m->m_ml->ml_name); |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
290 Py_DECREF(type_qualname); |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
291 return res; |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
292 } |
|
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
293 |
|
18512
b2bf88e06fc5
GC for method objects.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
14375
diff
changeset
|
294 static int |
|
b2bf88e06fc5
GC for method objects.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
14375
diff
changeset
|
295 meth_traverse(PyCFunctionObject *m, visitproc visit, void *arg) |
|
b2bf88e06fc5
GC for method objects.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
14375
diff
changeset
|
296 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
297 Py_VISIT(m->m_self); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
298 Py_VISIT(m->m_module); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
299 return 0; |
|
18512
b2bf88e06fc5
GC for method objects.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
14375
diff
changeset
|
300 } |
|
b2bf88e06fc5
GC for method objects.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
14375
diff
changeset
|
301 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
302 static PyObject * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18512
diff
changeset
|
303 meth_get__self__(PyCFunctionObject *m, void *closure) |
|
2083
f2d267edbfd6
* Objects/methodobject.c: changed drastically, the object now
Guido van Rossum <guido@python.org>
parents:
2059
diff
changeset
|
304 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
305 PyObject *self; |
|
41715
f60c877d52c8
Merged revisions 55270-55324 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
306 |
|
74141
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
307 self = PyCFunction_GET_SELF(m); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
308 if (self == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
309 self = Py_None; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
310 Py_INCREF(self); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
311 return self; |
|
2083
f2d267edbfd6
* Objects/methodobject.c: changed drastically, the object now
Guido van Rossum <guido@python.org>
parents:
2059
diff
changeset
|
312 } |
|
f2d267edbfd6
* Objects/methodobject.c: changed drastically, the object now
Guido van Rossum <guido@python.org>
parents:
2059
diff
changeset
|
313 |
|
20015
ca7af2a5d915
Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents:
19599
diff
changeset
|
314 static PyGetSetDef meth_getsets [] = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
315 {"__doc__", (getter)meth_get__doc__, NULL, NULL}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
316 {"__name__", (getter)meth_get__name__, NULL, NULL}, |
|
74141
7a7b698f6f21
Issue #13577: Built-in methods and functions now have a __qualname__.
Antoine Pitrou <solipsis@pitrou.net>
parents:
71810
diff
changeset
|
317 {"__qualname__", (getter)meth_get__qualname__, NULL, NULL}, |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
318 {"__self__", (getter)meth_get__self__, NULL, NULL}, |
|
87470
78ec18f5cb45
Issue #19674: inspect.signature() now produces a correct signature
Larry Hastings <larry@hastings.org>
parents:
84570
diff
changeset
|
319 {"__text_signature__", (getter)meth_get__text_signature__, NULL, NULL}, |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
320 {0} |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18512
diff
changeset
|
321 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18512
diff
changeset
|
322 |
|
27559
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27093
diff
changeset
|
323 #define OFF(x) offsetof(PyCFunctionObject, x) |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27093
diff
changeset
|
324 |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27093
diff
changeset
|
325 static PyMemberDef meth_members[] = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
326 {"__module__", T_OBJECT, OFF(m_module), PY_WRITE_RESTRICTED}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
327 {NULL} |
|
27559
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27093
diff
changeset
|
328 }; |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27093
diff
changeset
|
329 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
330 static PyObject * |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
331 meth_repr(PyCFunctionObject *m) |
| 6 | 332 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
333 if (m->m_self == NULL || PyModule_Check(m->m_self)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
334 return PyUnicode_FromFormat("<built-in function %s>", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
335 m->m_ml->ml_name); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
336 return PyUnicode_FromFormat("<built-in method %s of %s object at %p>", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
337 m->m_ml->ml_name, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
338 m->m_self->ob_type->tp_name, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
339 m->m_self); |
| 6 | 340 } |
| 341 | |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
37756
diff
changeset
|
342 static PyObject * |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
37756
diff
changeset
|
343 meth_richcompare(PyObject *self, PyObject *other, int op) |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1051
diff
changeset
|
344 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
345 PyCFunctionObject *a, *b; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
346 PyObject *res; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
347 int eq; |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
37756
diff
changeset
|
348 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
349 if ((op != Py_EQ && op != Py_NE) || |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
350 !PyCFunction_Check(self) || |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
351 !PyCFunction_Check(other)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
352 { |
|
71810
d0b0fcbb40db
Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents:
65494
diff
changeset
|
353 Py_RETURN_NOTIMPLEMENTED; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
354 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
355 a = (PyCFunctionObject *)self; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
356 b = (PyCFunctionObject *)other; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
357 eq = a->m_self == b->m_self; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
358 if (eq) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
359 eq = a->m_ml->ml_meth == b->m_ml->ml_meth; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
360 if (op == Py_EQ) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
361 res = eq ? Py_True : Py_False; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
362 else |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
363 res = eq ? Py_False : Py_True; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
364 Py_INCREF(res); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
365 return res; |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1051
diff
changeset
|
366 } |
|
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1051
diff
changeset
|
367 |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
61466
diff
changeset
|
368 static Py_hash_t |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
369 meth_hash(PyCFunctionObject *a) |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1051
diff
changeset
|
370 { |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
61466
diff
changeset
|
371 Py_hash_t x, y; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
372 if (a->m_self == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
373 x = 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
374 else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
375 x = PyObject_Hash(a->m_self); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
376 if (x == -1) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
377 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
378 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
379 y = _Py_HashPointer((void*)(a->m_ml->ml_meth)); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
380 if (y == -1) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
381 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
382 x ^= y; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
383 if (x == -1) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
384 x = -2; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
385 return x; |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1051
diff
changeset
|
386 } |
|
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1051
diff
changeset
|
387 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18512
diff
changeset
|
388 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
389 PyTypeObject PyCFunction_Type = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
390 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
391 "builtin_function_or_method", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
392 sizeof(PyCFunctionObject), |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
393 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
394 (destructor)meth_dealloc, /* tp_dealloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
395 0, /* tp_print */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
396 0, /* tp_getattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
397 0, /* tp_setattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
398 0, /* tp_reserved */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
399 (reprfunc)meth_repr, /* tp_repr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
400 0, /* tp_as_number */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
401 0, /* tp_as_sequence */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
402 0, /* tp_as_mapping */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
403 (hashfunc)meth_hash, /* tp_hash */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
404 PyCFunction_Call, /* tp_call */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
405 0, /* tp_str */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
406 PyObject_GenericGetAttr, /* tp_getattro */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
407 0, /* tp_setattro */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
408 0, /* tp_as_buffer */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
409 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
410 0, /* tp_doc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
411 (traverseproc)meth_traverse, /* tp_traverse */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
412 0, /* tp_clear */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
413 meth_richcompare, /* tp_richcompare */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
414 0, /* tp_weaklistoffset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
415 0, /* tp_iter */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
416 0, /* tp_iternext */ |
|
87493
24c84d00cf1f
Make built-in methods picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87470
diff
changeset
|
417 meth_methods, /* tp_methods */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
418 meth_members, /* tp_members */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
419 meth_getsets, /* tp_getset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
420 0, /* tp_base */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
421 0, /* tp_dict */ |
| 6 | 422 }; |
| 86 | 423 |
|
5934
0369d63b100b
Added separate free list for cfunction (builtin method) objects, for a
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
424 /* Clear out the free list */ |
|
0369d63b100b
Added separate free list for cfunction (builtin method) objects, for a
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
425 |
|
45371
7c4c46342137
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
426 int |
|
7c4c46342137
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
427 PyCFunction_ClearFreeList(void) |
|
5934
0369d63b100b
Added separate free list for cfunction (builtin method) objects, for a
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
428 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
429 int freelist_size = numfree; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
430 |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
431 while (free_list) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
432 PyCFunctionObject *v = free_list; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
433 free_list = (PyCFunctionObject *)(v->m_self); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
434 PyObject_GC_Del(v); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
435 numfree--; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
436 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
437 assert(numfree == 0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
438 return freelist_size; |
|
45371
7c4c46342137
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
439 } |
|
7c4c46342137
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
440 |
|
7c4c46342137
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
441 void |
|
7c4c46342137
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
442 PyCFunction_Fini(void) |
|
7c4c46342137
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
443 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
444 (void)PyCFunction_ClearFreeList(); |
|
5934
0369d63b100b
Added separate free list for cfunction (builtin method) objects, for a
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
445 } |
|
27559
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27093
diff
changeset
|
446 |
|
77577
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
74141
diff
changeset
|
447 /* Print summary info about the state of the optimized allocator */ |
|
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
74141
diff
changeset
|
448 void |
|
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
74141
diff
changeset
|
449 _PyCFunction_DebugMallocStats(FILE *out) |
|
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
74141
diff
changeset
|
450 { |
|
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
74141
diff
changeset
|
451 _PyDebugAllocatorStats(out, |
|
83252
bc514cc5d65b
Fix supernumerary 's' in sys._debugmallocstats() output.
Antoine Pitrou <solipsis@pitrou.net>
parents:
81159
diff
changeset
|
452 "free PyCFunctionObject", |
|
81159
9e6ead98762e
Fix the advertised size of PyCFunctionObjects in sys._debugmallocstats().
Antoine Pitrou <solipsis@pitrou.net>
parents:
77577
diff
changeset
|
453 numfree, sizeof(PyCFunctionObject)); |
|
77577
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
74141
diff
changeset
|
454 } |
