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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
1
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Method object implementation */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 /* Methods (the standard built-in methods, that is) */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
340 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
422 };
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 27
diff changeset
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 }