Mercurial > cpython-lru_cache-weakref
annotate Objects/funcobject.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 | 9267a0b836b7 |
| children |
| rev | line source |
|---|---|
| 145 | 1 |
| 6 | 2 /* Function object implementation */ |
| 3 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
4 #include "Python.h" |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
34598
diff
changeset
|
5 #include "code.h" |
| 86 | 6 #include "structmember.h" |
| 6 | 7 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
8 PyObject * |
|
73738
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
9 PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname) |
| 6 | 10 { |
|
84797
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
11 PyFunctionObject *op; |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
12 PyObject *doc, *consts, *module; |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
13 static PyObject *__name__ = NULL; |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
14 |
|
84798
9267a0b836b7
Issue #18520: Fix PyFunction_NewWithQualName() error handling
Victor Stinner <victor.stinner@gmail.com>
parents:
84797
diff
changeset
|
15 if (__name__ == NULL) { |
|
9267a0b836b7
Issue #18520: Fix PyFunction_NewWithQualName() error handling
Victor Stinner <victor.stinner@gmail.com>
parents:
84797
diff
changeset
|
16 __name__ = PyUnicode_InternFromString("__name__"); |
|
9267a0b836b7
Issue #18520: Fix PyFunction_NewWithQualName() error handling
Victor Stinner <victor.stinner@gmail.com>
parents:
84797
diff
changeset
|
17 if (__name__ == NULL) |
|
9267a0b836b7
Issue #18520: Fix PyFunction_NewWithQualName() error handling
Victor Stinner <victor.stinner@gmail.com>
parents:
84797
diff
changeset
|
18 return NULL; |
|
9267a0b836b7
Issue #18520: Fix PyFunction_NewWithQualName() error handling
Victor Stinner <victor.stinner@gmail.com>
parents:
84797
diff
changeset
|
19 } |
|
9267a0b836b7
Issue #18520: Fix PyFunction_NewWithQualName() error handling
Victor Stinner <victor.stinner@gmail.com>
parents:
84797
diff
changeset
|
20 |
|
84797
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
21 op = PyObject_GC_New(PyFunctionObject, &PyFunction_Type); |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
22 if (op == NULL) |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
23 return NULL; |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
24 |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
25 op->func_weakreflist = NULL; |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
26 Py_INCREF(code); |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
27 op->func_code = code; |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
28 Py_INCREF(globals); |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
29 op->func_globals = globals; |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
30 op->func_name = ((PyCodeObject *)code)->co_name; |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
31 Py_INCREF(op->func_name); |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
32 op->func_defaults = NULL; /* No default arguments */ |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
33 op->func_kwdefaults = NULL; /* No keyword only defaults */ |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
34 op->func_closure = NULL; |
|
84798
9267a0b836b7
Issue #18520: Fix PyFunction_NewWithQualName() error handling
Victor Stinner <victor.stinner@gmail.com>
parents:
84797
diff
changeset
|
35 |
|
84797
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
36 consts = ((PyCodeObject *)code)->co_consts; |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
37 if (PyTuple_Size(consts) >= 1) { |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
38 doc = PyTuple_GetItem(consts, 0); |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
39 if (!PyUnicode_Check(doc)) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
40 doc = Py_None; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
41 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
42 else |
|
84797
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
43 doc = Py_None; |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
44 Py_INCREF(doc); |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
45 op->func_doc = doc; |
|
84798
9267a0b836b7
Issue #18520: Fix PyFunction_NewWithQualName() error handling
Victor Stinner <victor.stinner@gmail.com>
parents:
84797
diff
changeset
|
46 |
|
84797
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
47 op->func_dict = NULL; |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
48 op->func_module = NULL; |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
49 op->func_annotations = NULL; |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
50 |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
51 /* __module__: If module name is in globals, use it. |
|
84798
9267a0b836b7
Issue #18520: Fix PyFunction_NewWithQualName() error handling
Victor Stinner <victor.stinner@gmail.com>
parents:
84797
diff
changeset
|
52 Otherwise, use None. */ |
|
84797
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
53 module = PyDict_GetItem(globals, __name__); |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
54 if (module) { |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
55 Py_INCREF(module); |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
56 op->func_module = module; |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
57 } |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
58 if (qualname) |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
59 op->func_qualname = qualname; |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
60 else |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
61 op->func_qualname = op->func_name; |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
62 Py_INCREF(op->func_qualname); |
|
b20bc1aa5686
Reindent PyFunction_NewWithQualName()
Victor Stinner <victor.stinner@gmail.com>
parents:
75051
diff
changeset
|
63 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
64 _PyObject_GC_TRACK(op); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
65 return (PyObject *)op; |
| 6 | 66 } |
| 67 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
68 PyObject * |
|
73738
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
69 PyFunction_New(PyObject *code, PyObject *globals) |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
70 { |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
71 return PyFunction_NewWithQualName(code, globals, NULL); |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
72 } |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
73 |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
74 PyObject * |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
75 PyFunction_GetCode(PyObject *op) |
| 6 | 76 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
77 if (!PyFunction_Check(op)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
78 PyErr_BadInternalCall(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
79 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
80 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
81 return ((PyFunctionObject *) op) -> func_code; |
| 6 | 82 } |
| 83 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
84 PyObject * |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
85 PyFunction_GetGlobals(PyObject *op) |
| 6 | 86 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
87 if (!PyFunction_Check(op)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
88 PyErr_BadInternalCall(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
89 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
90 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
91 return ((PyFunctionObject *) op) -> func_globals; |
| 6 | 92 } |
| 93 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
94 PyObject * |
|
27559
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
95 PyFunction_GetModule(PyObject *op) |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
96 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
97 if (!PyFunction_Check(op)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
98 PyErr_BadInternalCall(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
99 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
100 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
101 return ((PyFunctionObject *) op) -> func_module; |
|
27559
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
102 } |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
103 |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
104 PyObject * |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
105 PyFunction_GetDefaults(PyObject *op) |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
106 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
107 if (!PyFunction_Check(op)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
108 PyErr_BadInternalCall(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
109 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
110 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
111 return ((PyFunctionObject *) op) -> func_defaults; |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
112 } |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
113 |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
114 int |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
115 PyFunction_SetDefaults(PyObject *op, PyObject *defaults) |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
116 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
117 if (!PyFunction_Check(op)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
118 PyErr_BadInternalCall(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
119 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
120 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
121 if (defaults == Py_None) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
122 defaults = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
123 else if (defaults && PyTuple_Check(defaults)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
124 Py_INCREF(defaults); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
125 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
126 else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
127 PyErr_SetString(PyExc_SystemError, "non-tuple default args"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
128 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
129 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
130 Py_XDECREF(((PyFunctionObject *) op) -> func_defaults); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
131 ((PyFunctionObject *) op) -> func_defaults = defaults; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
132 return 0; |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
133 } |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
134 |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
135 PyObject * |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
136 PyFunction_GetKwDefaults(PyObject *op) |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
137 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
138 if (!PyFunction_Check(op)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
139 PyErr_BadInternalCall(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
140 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
141 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
142 return ((PyFunctionObject *) op) -> func_kwdefaults; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
143 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
144 |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
145 int |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
146 PyFunction_SetKwDefaults(PyObject *op, PyObject *defaults) |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
147 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
148 if (!PyFunction_Check(op)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
149 PyErr_BadInternalCall(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
150 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
151 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
152 if (defaults == Py_None) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
153 defaults = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
154 else if (defaults && PyDict_Check(defaults)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
155 Py_INCREF(defaults); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
156 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
157 else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
158 PyErr_SetString(PyExc_SystemError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
159 "non-dict keyword only default args"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
160 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
161 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
162 Py_XDECREF(((PyFunctionObject *)op) -> func_kwdefaults); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
163 ((PyFunctionObject *) op) -> func_kwdefaults = defaults; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
164 return 0; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
165 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
166 |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
167 PyObject * |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
168 PyFunction_GetClosure(PyObject *op) |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
169 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
170 if (!PyFunction_Check(op)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
171 PyErr_BadInternalCall(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
172 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
173 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
174 return ((PyFunctionObject *) op) -> func_closure; |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
175 } |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
176 |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
177 int |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
178 PyFunction_SetClosure(PyObject *op, PyObject *closure) |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
179 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
180 if (!PyFunction_Check(op)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
181 PyErr_BadInternalCall(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
182 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
183 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
184 if (closure == Py_None) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
185 closure = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
186 else if (PyTuple_Check(closure)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
187 Py_INCREF(closure); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
188 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
189 else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
190 PyErr_Format(PyExc_SystemError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
191 "expected tuple for closure, got '%.100s'", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
192 closure->ob_type->tp_name); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
193 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
194 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
195 Py_XDECREF(((PyFunctionObject *) op) -> func_closure); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
196 ((PyFunctionObject *) op) -> func_closure = closure; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
197 return 0; |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
198 } |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
199 |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
200 PyObject * |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
201 PyFunction_GetAnnotations(PyObject *op) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
202 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
203 if (!PyFunction_Check(op)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
204 PyErr_BadInternalCall(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
205 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
206 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
207 return ((PyFunctionObject *) op) -> func_annotations; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
208 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
209 |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
210 int |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
211 PyFunction_SetAnnotations(PyObject *op, PyObject *annotations) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
212 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
213 if (!PyFunction_Check(op)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
214 PyErr_BadInternalCall(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
215 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
216 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
217 if (annotations == Py_None) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
218 annotations = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
219 else if (annotations && PyDict_Check(annotations)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
220 Py_INCREF(annotations); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
221 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
222 else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
223 PyErr_SetString(PyExc_SystemError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
224 "non-dict annotations"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
225 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
226 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
227 Py_XDECREF(((PyFunctionObject *)op) -> func_annotations); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
228 ((PyFunctionObject *) op) -> func_annotations = annotations; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
229 return 0; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
230 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
231 |
| 6 | 232 /* Methods */ |
| 233 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
234 #define OFF(x) offsetof(PyFunctionObject, x) |
| 86 | 235 |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19948
diff
changeset
|
236 static PyMemberDef func_memberlist[] = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
237 {"__closure__", T_OBJECT, OFF(func_closure), |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
238 RESTRICTED|READONLY}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
239 {"__doc__", T_OBJECT, OFF(func_doc), PY_WRITE_RESTRICTED}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
240 {"__globals__", T_OBJECT, OFF(func_globals), |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
241 RESTRICTED|READONLY}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
242 {"__module__", T_OBJECT, OFF(func_module), PY_WRITE_RESTRICTED}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
243 {NULL} /* Sentinel */ |
| 86 | 244 }; |
| 245 | |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
246 static PyObject * |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
247 func_get_code(PyFunctionObject *op) |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
248 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
249 Py_INCREF(op->func_code); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
250 return op->func_code; |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
251 } |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
252 |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
253 static int |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
254 func_set_code(PyFunctionObject *op, PyObject *value) |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
255 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
256 PyObject *tmp; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
257 Py_ssize_t nfree, nclosure; |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
258 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
259 /* Not legal to del f.func_code or to set it to anything |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
260 * other than a code object. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
261 if (value == NULL || !PyCode_Check(value)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
262 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
263 "__code__ must be set to a code object"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
264 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
265 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
266 nfree = PyCode_GetNumFree((PyCodeObject *)value); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
267 nclosure = (op->func_closure == NULL ? 0 : |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
268 PyTuple_GET_SIZE(op->func_closure)); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
269 if (nclosure != nfree) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
270 PyErr_Format(PyExc_ValueError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
271 "%U() requires a code object with %zd free vars," |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
272 " not %zd", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
273 op->func_name, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
274 nclosure, nfree); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
275 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
276 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
277 tmp = op->func_code; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
278 Py_INCREF(value); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
279 op->func_code = value; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
280 Py_DECREF(tmp); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
281 return 0; |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
282 } |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
283 |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
284 static PyObject * |
| 33102 | 285 func_get_name(PyFunctionObject *op) |
| 286 { | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
287 Py_INCREF(op->func_name); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
288 return op->func_name; |
| 33102 | 289 } |
| 290 | |
| 291 static int | |
| 292 func_set_name(PyFunctionObject *op, PyObject *value) | |
| 293 { | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
294 PyObject *tmp; |
| 33102 | 295 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
296 /* Not legal to del f.func_name or to set it to anything |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
297 * other than a string object. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
298 if (value == NULL || !PyUnicode_Check(value)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
299 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
300 "__name__ must be set to a string object"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
301 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
302 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
303 tmp = op->func_name; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
304 Py_INCREF(value); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
305 op->func_name = value; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
306 Py_DECREF(tmp); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
307 return 0; |
| 33102 | 308 } |
| 309 | |
| 310 static PyObject * | |
|
73738
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
311 func_get_qualname(PyFunctionObject *op) |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
312 { |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
313 Py_INCREF(op->func_qualname); |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
314 return op->func_qualname; |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
315 } |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
316 |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
317 static int |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
318 func_set_qualname(PyFunctionObject *op, PyObject *value) |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
319 { |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
320 PyObject *tmp; |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
321 |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
322 /* Not legal to del f.__qualname__ or to set it to anything |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
323 * other than a string object. */ |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
324 if (value == NULL || !PyUnicode_Check(value)) { |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
325 PyErr_SetString(PyExc_TypeError, |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
326 "__qualname__ must be set to a string object"); |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
327 return -1; |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
328 } |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
329 tmp = op->func_qualname; |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
330 Py_INCREF(value); |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
331 op->func_qualname = value; |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
332 Py_DECREF(tmp); |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
333 return 0; |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
334 } |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
335 |
|
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
336 static PyObject * |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
337 func_get_defaults(PyFunctionObject *op) |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
338 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
339 if (op->func_defaults == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
340 Py_INCREF(Py_None); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
341 return Py_None; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
342 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
343 Py_INCREF(op->func_defaults); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
344 return op->func_defaults; |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
345 } |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
346 |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
347 static int |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
348 func_set_defaults(PyFunctionObject *op, PyObject *value) |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
349 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
350 PyObject *tmp; |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
351 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
352 /* Legal to del f.func_defaults. |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
353 * Can only set func_defaults to NULL or a tuple. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
354 if (value == Py_None) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
355 value = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
356 if (value != NULL && !PyTuple_Check(value)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
357 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
358 "__defaults__ must be set to a tuple object"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
359 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
360 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
361 tmp = op->func_defaults; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
362 Py_XINCREF(value); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
363 op->func_defaults = value; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
364 Py_XDECREF(tmp); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
365 return 0; |
|
8407
096857b0e4b8
Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents:
7981
diff
changeset
|
366 } |
|
096857b0e4b8
Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents:
7981
diff
changeset
|
367 |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
368 static PyObject * |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
369 func_get_kwdefaults(PyFunctionObject *op) |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
370 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
371 if (op->func_kwdefaults == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
372 Py_INCREF(Py_None); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
373 return Py_None; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
374 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
375 Py_INCREF(op->func_kwdefaults); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
376 return op->func_kwdefaults; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
377 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
378 |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
379 static int |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
380 func_set_kwdefaults(PyFunctionObject *op, PyObject *value) |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
381 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
382 PyObject *tmp; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
383 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
384 if (value == Py_None) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
385 value = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
386 /* Legal to del f.func_kwdefaults. |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
387 * Can only set func_kwdefaults to NULL or a dict. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
388 if (value != NULL && !PyDict_Check(value)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
389 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
390 "__kwdefaults__ must be set to a dict object"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
391 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
392 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
393 tmp = op->func_kwdefaults; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
394 Py_XINCREF(value); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
395 op->func_kwdefaults = value; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
396 Py_XDECREF(tmp); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
397 return 0; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
398 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
399 |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
400 static PyObject * |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
401 func_get_annotations(PyFunctionObject *op) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
402 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
403 if (op->func_annotations == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
404 op->func_annotations = PyDict_New(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
405 if (op->func_annotations == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
406 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
407 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
408 Py_INCREF(op->func_annotations); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
409 return op->func_annotations; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
410 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
411 |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
412 static int |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
413 func_set_annotations(PyFunctionObject *op, PyObject *value) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
414 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
415 PyObject *tmp; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
416 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
417 if (value == Py_None) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
418 value = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
419 /* Legal to del f.func_annotations. |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
420 * Can only set func_annotations to NULL (through C api) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
421 * or a dict. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
422 if (value != NULL && !PyDict_Check(value)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
423 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
424 "__annotations__ must be set to a dict object"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
425 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
426 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
427 tmp = op->func_annotations; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
428 Py_XINCREF(value); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
429 op->func_annotations = value; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
430 Py_XDECREF(tmp); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
431 return 0; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
432 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40215
diff
changeset
|
433 |
|
20015
ca7af2a5d915
Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents:
20012
diff
changeset
|
434 static PyGetSetDef func_getsetlist[] = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
435 {"__code__", (getter)func_get_code, (setter)func_set_code}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
436 {"__defaults__", (getter)func_get_defaults, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
437 (setter)func_set_defaults}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
438 {"__kwdefaults__", (getter)func_get_kwdefaults, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
439 (setter)func_set_kwdefaults}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
440 {"__annotations__", (getter)func_get_annotations, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
441 (setter)func_set_annotations}, |
|
75051
f029312764b4
use new generic __dict__ descriptor implementations
Benjamin Peterson <benjamin@python.org>
parents:
75038
diff
changeset
|
442 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict}, |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
443 {"__name__", (getter)func_get_name, (setter)func_set_name}, |
|
73738
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
444 {"__qualname__", (getter)func_get_qualname, (setter)func_set_qualname}, |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
445 {NULL} /* Sentinel */ |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
446 }; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
447 |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
448 PyDoc_STRVAR(func_doc, |
|
24193
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
449 "function(code, globals[, name[, argdefs[, closure]]])\n\ |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
450 \n\ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
451 Create a function object from a code object and a dictionary.\n\ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
452 The optional name string overrides the name from the code object.\n\ |
|
24193
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
453 The optional argdefs tuple specifies the default argument values.\n\ |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
454 The optional closure tuple supplies the bindings for free variables."); |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
455 |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
456 /* func_new() maintains the following invariants for closures. The |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
457 closure must correspond to the free variables of the code object. |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
458 |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
459 if len(code.co_freevars) == 0: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
460 closure = NULL |
|
24193
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
461 else: |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
462 len(closure) == len(code.co_freevars) |
|
24193
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
463 for every elt in closure, type(elt) == cell |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
464 */ |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
465 |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
466 static PyObject * |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
467 func_new(PyTypeObject* type, PyObject* args, PyObject* kw) |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
468 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
469 PyCodeObject *code; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
470 PyObject *globals; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
471 PyObject *name = Py_None; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
472 PyObject *defaults = Py_None; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
473 PyObject *closure = Py_None; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
474 PyFunctionObject *newfunc; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
475 Py_ssize_t nfree, nclosure; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
476 static char *kwlist[] = {"code", "globals", "name", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
477 "argdefs", "closure", 0}; |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
478 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
479 if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!|OOO:function", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
480 kwlist, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
481 &PyCode_Type, &code, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
482 &PyDict_Type, &globals, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
483 &name, &defaults, &closure)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
484 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
485 if (name != Py_None && !PyUnicode_Check(name)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
486 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
487 "arg 3 (name) must be None or string"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
488 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
489 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
490 if (defaults != Py_None && !PyTuple_Check(defaults)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
491 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
492 "arg 4 (defaults) must be None or tuple"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
493 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
494 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
495 nfree = PyTuple_GET_SIZE(code->co_freevars); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
496 if (!PyTuple_Check(closure)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
497 if (nfree && closure == Py_None) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
498 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
499 "arg 5 (closure) must be tuple"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
500 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
501 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
502 else if (closure != Py_None) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
503 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
504 "arg 5 (closure) must be None or tuple"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
505 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
506 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
507 } |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
508 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
509 /* check that the closure is well-formed */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
510 nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
511 if (nfree != nclosure) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
512 return PyErr_Format(PyExc_ValueError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
513 "%U requires closure of length %zd, not %zd", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
514 code->co_name, nfree, nclosure); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
515 if (nclosure) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
516 Py_ssize_t i; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
517 for (i = 0; i < nclosure; i++) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
518 PyObject *o = PyTuple_GET_ITEM(closure, i); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
519 if (!PyCell_Check(o)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
520 return PyErr_Format(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
521 "arg 5 (closure) expected cell, found %s", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
522 o->ob_type->tp_name); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
523 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
524 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
525 } |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
526 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
527 newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
528 globals); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
529 if (newfunc == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
530 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
531 |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
532 if (name != Py_None) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
533 Py_INCREF(name); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
534 Py_DECREF(newfunc->func_name); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
535 newfunc->func_name = name; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
536 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
537 if (defaults != Py_None) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
538 Py_INCREF(defaults); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
539 newfunc->func_defaults = defaults; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
540 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
541 if (closure != Py_None) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
542 Py_INCREF(closure); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
543 newfunc->func_closure = closure; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
544 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
545 |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
546 return (PyObject *)newfunc; |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
547 } |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
548 |
| 6 | 549 static void |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
550 func_dealloc(PyFunctionObject *op) |
| 6 | 551 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
552 _PyObject_GC_UNTRACK(op); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
553 if (op->func_weakreflist != NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
554 PyObject_ClearWeakRefs((PyObject *) op); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
555 Py_DECREF(op->func_code); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
556 Py_DECREF(op->func_globals); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
557 Py_XDECREF(op->func_module); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
558 Py_DECREF(op->func_name); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
559 Py_XDECREF(op->func_defaults); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
560 Py_XDECREF(op->func_kwdefaults); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
561 Py_XDECREF(op->func_doc); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
562 Py_XDECREF(op->func_dict); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
563 Py_XDECREF(op->func_closure); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
564 Py_XDECREF(op->func_annotations); |
|
73738
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
565 Py_XDECREF(op->func_qualname); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
566 PyObject_GC_Del(op); |
| 6 | 567 } |
| 568 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
569 static PyObject* |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
570 func_repr(PyFunctionObject *op) |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
571 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
572 return PyUnicode_FromFormat("<function %U at %p>", |
|
73738
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
573 op->func_qualname, op); |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
574 } |
|
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
575 |
|
1399
cc172ce05561
Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents:
1288
diff
changeset
|
576 static int |
|
12990
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
577 func_traverse(PyFunctionObject *f, visitproc visit, void *arg) |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
578 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
579 Py_VISIT(f->func_code); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
580 Py_VISIT(f->func_globals); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
581 Py_VISIT(f->func_module); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
582 Py_VISIT(f->func_defaults); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
583 Py_VISIT(f->func_kwdefaults); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
584 Py_VISIT(f->func_doc); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
585 Py_VISIT(f->func_name); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
586 Py_VISIT(f->func_dict); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
587 Py_VISIT(f->func_closure); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
588 Py_VISIT(f->func_annotations); |
|
73738
e1dbc72bd97f
PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents:
66664
diff
changeset
|
589 Py_VISIT(f->func_qualname); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
590 return 0; |
|
12990
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
591 } |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
592 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
593 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
594 function_call(PyObject *func, PyObject *arg, PyObject *kw) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
595 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
596 PyObject *result; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
597 PyObject *argdefs; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
598 PyObject *kwtuple = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
599 PyObject **d, **k; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
600 Py_ssize_t nk, nd; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
601 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
602 argdefs = PyFunction_GET_DEFAULTS(func); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
603 if (argdefs != NULL && PyTuple_Check(argdefs)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
604 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
605 nd = PyTuple_GET_SIZE(argdefs); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
606 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
607 else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
608 d = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
609 nd = 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
610 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
611 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
612 if (kw != NULL && PyDict_Check(kw)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
613 Py_ssize_t pos, i; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
614 nk = PyDict_Size(kw); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
615 kwtuple = PyTuple_New(2*nk); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
616 if (kwtuple == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
617 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
618 k = &PyTuple_GET_ITEM(kwtuple, 0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
619 pos = i = 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
620 while (PyDict_Next(kw, &pos, &k[i], &k[i+1])) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
621 Py_INCREF(k[i]); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
622 Py_INCREF(k[i+1]); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
623 i += 2; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
624 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
625 nk = i/2; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
626 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
627 else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
628 k = NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
629 nk = 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
630 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
631 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
632 result = PyEval_EvalCodeEx( |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
633 PyFunction_GET_CODE(func), |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
634 PyFunction_GET_GLOBALS(func), (PyObject *)NULL, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
635 &PyTuple_GET_ITEM(arg, 0), PyTuple_GET_SIZE(arg), |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
636 k, nk, d, nd, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
637 PyFunction_GET_KW_DEFAULTS(func), |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
638 PyFunction_GET_CLOSURE(func)); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
639 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
640 Py_XDECREF(kwtuple); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
641 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
642 return result; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
643 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
644 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
645 /* Bind a function to an object */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
646 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
647 func_descr_get(PyObject *func, PyObject *obj, PyObject *type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
648 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
649 if (obj == Py_None || obj == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
650 Py_INCREF(func); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
651 return func; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
652 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
653 return PyMethod_New(func, obj); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
654 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
655 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
656 PyTypeObject PyFunction_Type = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
657 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
658 "function", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
659 sizeof(PyFunctionObject), |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
660 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
661 (destructor)func_dealloc, /* tp_dealloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
662 0, /* tp_print */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
663 0, /* tp_getattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
664 0, /* tp_setattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
665 0, /* tp_reserved */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
666 (reprfunc)func_repr, /* tp_repr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
667 0, /* tp_as_number */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
668 0, /* tp_as_sequence */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
669 0, /* tp_as_mapping */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
670 0, /* tp_hash */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
671 function_call, /* tp_call */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
672 0, /* tp_str */ |
| 75032 | 673 0, /* tp_getattro */ |
| 674 0, /* tp_setattro */ | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
675 0, /* tp_as_buffer */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
676 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
677 func_doc, /* tp_doc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
678 (traverseproc)func_traverse, /* tp_traverse */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
679 0, /* tp_clear */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
680 0, /* tp_richcompare */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
681 offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
682 0, /* tp_iter */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
683 0, /* tp_iternext */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
684 0, /* tp_methods */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
685 func_memberlist, /* tp_members */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
686 func_getsetlist, /* tp_getset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
687 0, /* tp_base */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
688 0, /* tp_dict */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
689 func_descr_get, /* tp_descr_get */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
690 0, /* tp_descr_set */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
691 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
692 0, /* tp_init */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
693 0, /* tp_alloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
694 func_new, /* tp_new */ |
| 6 | 695 }; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
696 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
697 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
698 /* Class method object */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
699 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
700 /* A class method receives the class as implicit first argument, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
701 just like an instance method receives the instance. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
702 To declare a class method, use this idiom: |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
703 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
704 class C: |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
705 def f(cls, arg1, arg2, ...): ... |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
706 f = classmethod(f) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
707 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
708 It can be called either on the class (e.g. C.f()) or on an instance |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
709 (e.g. C().f()); the instance is ignored except for its class. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
710 If a class method is called for a derived class, the derived class |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
711 object is passed as the implied first argument. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
712 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
713 Class methods are different than C++ or Java static methods. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
714 If you want those, see static methods below. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
715 */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
716 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
717 typedef struct { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
718 PyObject_HEAD |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
719 PyObject *cm_callable; |
|
75028
f46deae68e34
allow arbitrary attributes on classmethod and staticmethod (closes #14051)
Benjamin Peterson <benjamin@python.org>
parents:
73984
diff
changeset
|
720 PyObject *cm_dict; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
721 } classmethod; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
722 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
723 static void |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
724 cm_dealloc(classmethod *cm) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
725 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
726 _PyObject_GC_UNTRACK((PyObject *)cm); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
727 Py_XDECREF(cm->cm_callable); |
|
75028
f46deae68e34
allow arbitrary attributes on classmethod and staticmethod (closes #14051)
Benjamin Peterson <benjamin@python.org>
parents:
73984
diff
changeset
|
728 Py_XDECREF(cm->cm_dict); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
729 Py_TYPE(cm)->tp_free((PyObject *)cm); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
730 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
731 |
|
28537
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
732 static int |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
733 cm_traverse(classmethod *cm, visitproc visit, void *arg) |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
734 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
735 Py_VISIT(cm->cm_callable); |
|
75028
f46deae68e34
allow arbitrary attributes on classmethod and staticmethod (closes #14051)
Benjamin Peterson <benjamin@python.org>
parents:
73984
diff
changeset
|
736 Py_VISIT(cm->cm_dict); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
737 return 0; |
|
28537
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
738 } |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
739 |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
740 static int |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
741 cm_clear(classmethod *cm) |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
742 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
743 Py_CLEAR(cm->cm_callable); |
|
75028
f46deae68e34
allow arbitrary attributes on classmethod and staticmethod (closes #14051)
Benjamin Peterson <benjamin@python.org>
parents:
73984
diff
changeset
|
744 Py_CLEAR(cm->cm_dict); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
745 return 0; |
|
28537
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
746 } |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
747 |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
748 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
749 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
750 cm_descr_get(PyObject *self, PyObject *obj, PyObject *type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
751 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
752 classmethod *cm = (classmethod *)self; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
753 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
754 if (cm->cm_callable == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
755 PyErr_SetString(PyExc_RuntimeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
756 "uninitialized classmethod object"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
757 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
758 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
759 if (type == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
760 type = (PyObject *)(Py_TYPE(obj)); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
761 return PyMethod_New(cm->cm_callable, type); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
762 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
763 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
764 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
765 cm_init(PyObject *self, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
766 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
767 classmethod *cm = (classmethod *)self; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
768 PyObject *callable; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
769 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
770 if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
771 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
772 if (!_PyArg_NoKeywords("classmethod", kwds)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
773 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
774 Py_INCREF(callable); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
775 cm->cm_callable = callable; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
776 return 0; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
777 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
778 |
|
54413
f3c871bdea57
Issue 5982: Classmethod and staticmethod expose wrapped function with __func__.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
779 static PyMemberDef cm_memberlist[] = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
780 {"__func__", T_OBJECT, offsetof(classmethod, cm_callable), READONLY}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
781 {NULL} /* Sentinel */ |
|
54413
f3c871bdea57
Issue 5982: Classmethod and staticmethod expose wrapped function with __func__.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
782 }; |
|
f3c871bdea57
Issue 5982: Classmethod and staticmethod expose wrapped function with __func__.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
783 |
|
73984
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
784 static PyObject * |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
785 cm_get___isabstractmethod__(classmethod *cm, void *closure) |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
786 { |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
787 int res = _PyObject_IsAbstract(cm->cm_callable); |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
788 if (res == -1) { |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
789 return NULL; |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
790 } |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
791 else if (res) { |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
792 Py_RETURN_TRUE; |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
793 } |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
794 Py_RETURN_FALSE; |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
795 } |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
796 |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
797 static PyGetSetDef cm_getsetlist[] = { |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
798 {"__isabstractmethod__", |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
799 (getter)cm_get___isabstractmethod__, NULL, |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
800 NULL, |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
801 NULL}, |
|
75051
f029312764b4
use new generic __dict__ descriptor implementations
Benjamin Peterson <benjamin@python.org>
parents:
75038
diff
changeset
|
802 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict, NULL, NULL}, |
|
73984
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
803 {NULL} /* Sentinel */ |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
804 }; |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
805 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
22974
diff
changeset
|
806 PyDoc_STRVAR(classmethod_doc, |
|
21444
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
807 "classmethod(function) -> method\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
808 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
809 Convert a function to be a class method.\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
810 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
811 A class method receives the class as implicit first argument,\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
812 just like an instance method receives the instance.\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
813 To declare a class method, use this idiom:\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
814 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
815 class C:\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
816 def f(cls, arg1, arg2, ...): ...\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
817 f = classmethod(f)\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
818 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
819 It can be called either on the class (e.g. C.f()) or on an instance\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
820 (e.g. C().f()). The instance is ignored except for its class.\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
821 If a class method is called for a derived class, the derived class\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
822 object is passed as the implied first argument.\n\ |
|
21446
77c7476f41bd
Portability fix: Not every compiler implements the extension of
Sjoerd Mullender <sjoerd@acm.org>
parents:
21444
diff
changeset
|
823 \n\ |
|
21444
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
824 Class methods are different than C++ or Java static methods.\n\ |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
22974
diff
changeset
|
825 If you want those, see the staticmethod builtin."); |
|
21444
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
826 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
827 PyTypeObject PyClassMethod_Type = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
828 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
829 "classmethod", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
830 sizeof(classmethod), |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
831 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
832 (destructor)cm_dealloc, /* tp_dealloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
833 0, /* tp_print */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
834 0, /* tp_getattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
835 0, /* tp_setattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
836 0, /* tp_reserved */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
837 0, /* tp_repr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
838 0, /* tp_as_number */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
839 0, /* tp_as_sequence */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
840 0, /* tp_as_mapping */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
841 0, /* tp_hash */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
842 0, /* tp_call */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
843 0, /* tp_str */ |
| 75032 | 844 0, /* tp_getattro */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
845 0, /* tp_setattro */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
846 0, /* tp_as_buffer */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
847 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
848 classmethod_doc, /* tp_doc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
849 (traverseproc)cm_traverse, /* tp_traverse */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
850 (inquiry)cm_clear, /* tp_clear */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
851 0, /* tp_richcompare */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
852 0, /* tp_weaklistoffset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
853 0, /* tp_iter */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
854 0, /* tp_iternext */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
855 0, /* tp_methods */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
856 cm_memberlist, /* tp_members */ |
|
73984
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
857 cm_getsetlist, /* tp_getset */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
858 0, /* tp_base */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
859 0, /* tp_dict */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
860 cm_descr_get, /* tp_descr_get */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
861 0, /* tp_descr_set */ |
|
75028
f46deae68e34
allow arbitrary attributes on classmethod and staticmethod (closes #14051)
Benjamin Peterson <benjamin@python.org>
parents:
73984
diff
changeset
|
862 offsetof(classmethod, cm_dict), /* tp_dictoffset */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
863 cm_init, /* tp_init */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
864 PyType_GenericAlloc, /* tp_alloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
865 PyType_GenericNew, /* tp_new */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
866 PyObject_GC_Del, /* tp_free */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
867 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
868 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
869 PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
870 PyClassMethod_New(PyObject *callable) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
871 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
872 classmethod *cm = (classmethod *) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
873 PyType_GenericAlloc(&PyClassMethod_Type, 0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
874 if (cm != NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
875 Py_INCREF(callable); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
876 cm->cm_callable = callable; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
877 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
878 return (PyObject *)cm; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
879 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
880 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
881 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
882 /* Static method object */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
883 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
884 /* A static method does not receive an implicit first argument. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
885 To declare a static method, use this idiom: |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
886 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
887 class C: |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
888 def f(arg1, arg2, ...): ... |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
889 f = staticmethod(f) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
890 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
891 It can be called either on the class (e.g. C.f()) or on an instance |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
892 (e.g. C().f()); the instance is ignored except for its class. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
893 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
894 Static methods in Python are similar to those found in Java or C++. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
895 For a more advanced concept, see class methods above. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
896 */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
897 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
898 typedef struct { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
899 PyObject_HEAD |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
900 PyObject *sm_callable; |
|
75028
f46deae68e34
allow arbitrary attributes on classmethod and staticmethod (closes #14051)
Benjamin Peterson <benjamin@python.org>
parents:
73984
diff
changeset
|
901 PyObject *sm_dict; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
902 } staticmethod; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
903 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
904 static void |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
905 sm_dealloc(staticmethod *sm) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
906 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
907 _PyObject_GC_UNTRACK((PyObject *)sm); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
908 Py_XDECREF(sm->sm_callable); |
|
75028
f46deae68e34
allow arbitrary attributes on classmethod and staticmethod (closes #14051)
Benjamin Peterson <benjamin@python.org>
parents:
73984
diff
changeset
|
909 Py_XDECREF(sm->sm_dict); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
910 Py_TYPE(sm)->tp_free((PyObject *)sm); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
911 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
912 |
|
28537
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
913 static int |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
914 sm_traverse(staticmethod *sm, visitproc visit, void *arg) |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
915 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
916 Py_VISIT(sm->sm_callable); |
|
75028
f46deae68e34
allow arbitrary attributes on classmethod and staticmethod (closes #14051)
Benjamin Peterson <benjamin@python.org>
parents:
73984
diff
changeset
|
917 Py_VISIT(sm->sm_dict); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
918 return 0; |
|
28537
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
919 } |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
920 |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
921 static int |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
922 sm_clear(staticmethod *sm) |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
923 { |
| 75029 | 924 Py_CLEAR(sm->sm_callable); |
|
75028
f46deae68e34
allow arbitrary attributes on classmethod and staticmethod (closes #14051)
Benjamin Peterson <benjamin@python.org>
parents:
73984
diff
changeset
|
925 Py_CLEAR(sm->sm_dict); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
926 return 0; |
|
28537
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
927 } |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
928 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
929 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
930 sm_descr_get(PyObject *self, PyObject *obj, PyObject *type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
931 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
932 staticmethod *sm = (staticmethod *)self; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
933 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
934 if (sm->sm_callable == NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
935 PyErr_SetString(PyExc_RuntimeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
936 "uninitialized staticmethod object"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
937 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
938 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
939 Py_INCREF(sm->sm_callable); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
940 return sm->sm_callable; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
941 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
942 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
943 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
944 sm_init(PyObject *self, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
945 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
946 staticmethod *sm = (staticmethod *)self; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
947 PyObject *callable; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
948 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
949 if (!PyArg_UnpackTuple(args, "staticmethod", 1, 1, &callable)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
950 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
951 if (!_PyArg_NoKeywords("staticmethod", kwds)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
952 return -1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
953 Py_INCREF(callable); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
954 sm->sm_callable = callable; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
955 return 0; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
956 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
957 |
|
54413
f3c871bdea57
Issue 5982: Classmethod and staticmethod expose wrapped function with __func__.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
958 static PyMemberDef sm_memberlist[] = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
959 {"__func__", T_OBJECT, offsetof(staticmethod, sm_callable), READONLY}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
960 {NULL} /* Sentinel */ |
|
54413
f3c871bdea57
Issue 5982: Classmethod and staticmethod expose wrapped function with __func__.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
961 }; |
|
f3c871bdea57
Issue 5982: Classmethod and staticmethod expose wrapped function with __func__.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
962 |
|
73984
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
963 static PyObject * |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
964 sm_get___isabstractmethod__(staticmethod *sm, void *closure) |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
965 { |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
966 int res = _PyObject_IsAbstract(sm->sm_callable); |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
967 if (res == -1) { |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
968 return NULL; |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
969 } |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
970 else if (res) { |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
971 Py_RETURN_TRUE; |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
972 } |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
973 Py_RETURN_FALSE; |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
974 } |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
975 |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
976 static PyGetSetDef sm_getsetlist[] = { |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
977 {"__isabstractmethod__", |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
978 (getter)sm_get___isabstractmethod__, NULL, |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
979 NULL, |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
980 NULL}, |
|
75051
f029312764b4
use new generic __dict__ descriptor implementations
Benjamin Peterson <benjamin@python.org>
parents:
75038
diff
changeset
|
981 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict, NULL, NULL}, |
|
73984
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
982 {NULL} /* Sentinel */ |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
983 }; |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
984 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
22974
diff
changeset
|
985 PyDoc_STRVAR(staticmethod_doc, |
|
21444
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
986 "staticmethod(function) -> method\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
987 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
988 Convert a function to be a static method.\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
989 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
990 A static method does not receive an implicit first argument.\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
991 To declare a static method, use this idiom:\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
992 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
993 class C:\n\ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
994 def f(arg1, arg2, ...): ...\n\ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
995 f = staticmethod(f)\n\ |
|
21444
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
996 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
997 It can be called either on the class (e.g. C.f()) or on an instance\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
998 (e.g. C().f()). The instance is ignored except for its class.\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
999 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
1000 Static methods in Python are similar to those found in Java or C++.\n\ |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
22974
diff
changeset
|
1001 For a more advanced concept, see the classmethod builtin."); |
|
21444
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
1002 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
1003 PyTypeObject PyStaticMethod_Type = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1004 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1005 "staticmethod", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1006 sizeof(staticmethod), |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1007 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1008 (destructor)sm_dealloc, /* tp_dealloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1009 0, /* tp_print */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1010 0, /* tp_getattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1011 0, /* tp_setattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1012 0, /* tp_reserved */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1013 0, /* tp_repr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1014 0, /* tp_as_number */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1015 0, /* tp_as_sequence */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1016 0, /* tp_as_mapping */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1017 0, /* tp_hash */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1018 0, /* tp_call */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1019 0, /* tp_str */ |
|
75028
f46deae68e34
allow arbitrary attributes on classmethod and staticmethod (closes #14051)
Benjamin Peterson <benjamin@python.org>
parents:
73984
diff
changeset
|
1020 0, /* tp_getattro */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1021 0, /* tp_setattro */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1022 0, /* tp_as_buffer */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1023 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1024 staticmethod_doc, /* tp_doc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1025 (traverseproc)sm_traverse, /* tp_traverse */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1026 (inquiry)sm_clear, /* tp_clear */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1027 0, /* tp_richcompare */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1028 0, /* tp_weaklistoffset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1029 0, /* tp_iter */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1030 0, /* tp_iternext */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1031 0, /* tp_methods */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1032 sm_memberlist, /* tp_members */ |
|
73984
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73738
diff
changeset
|
1033 sm_getsetlist, /* tp_getset */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1034 0, /* tp_base */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1035 0, /* tp_dict */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1036 sm_descr_get, /* tp_descr_get */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1037 0, /* tp_descr_set */ |
|
75028
f46deae68e34
allow arbitrary attributes on classmethod and staticmethod (closes #14051)
Benjamin Peterson <benjamin@python.org>
parents:
73984
diff
changeset
|
1038 offsetof(staticmethod, sm_dict), /* tp_dictoffset */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1039 sm_init, /* tp_init */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1040 PyType_GenericAlloc, /* tp_alloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1041 PyType_GenericNew, /* tp_new */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1042 PyObject_GC_Del, /* tp_free */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
1043 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
1044 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
1045 PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
1046 PyStaticMethod_New(PyObject *callable) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
1047 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1048 staticmethod *sm = (staticmethod *) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1049 PyType_GenericAlloc(&PyStaticMethod_Type, 0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1050 if (sm != NULL) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1051 Py_INCREF(callable); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1052 sm->sm_callable = callable; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1053 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59538
diff
changeset
|
1054 return (PyObject *)sm; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
1055 } |
