Mercurial > cpython-lru_cache-weakref
annotate Objects/funcobject.c @ 33073:bfcc4e39fc45 legacy-trunk
Edward's latest checkins somehow managed to wipe out my previous latest
checkins. Reapplying the latter changes.
| author | Tim Peters <tim.peters@gmail.com> |
|---|---|
| date | Mon, 09 Aug 2004 16:43:36 +0000 |
| parents | 87d196e1c2d0 |
| children | f27935b46985 |
| 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" |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
5 #include "compile.h" |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
6 #include "eval.h" |
| 86 | 7 #include "structmember.h" |
| 6 | 8 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
9 PyObject * |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
10 PyFunction_New(PyObject *code, PyObject *globals) |
| 6 | 11 { |
|
19581
fd48a55ac364
Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19476
diff
changeset
|
12 PyFunctionObject *op = PyObject_GC_New(PyFunctionObject, |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
13 &PyFunction_Type); |
| 31780 | 14 static PyObject *__name__ = 0; |
| 6 | 15 if (op != NULL) { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
16 PyObject *doc; |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
17 PyObject *consts; |
|
27559
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
18 PyObject *module; |
|
17170
962196ce7231
Add support for weak references to the function and method types.
Fred Drake <fdrake@acm.org>
parents:
16891
diff
changeset
|
19 op->func_weakreflist = NULL; |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
20 Py_INCREF(code); |
|
84
a79cbb2655ba
Function objects no longer contain a parse tree node, but intermediate
Guido van Rossum <guido@python.org>
parents:
27
diff
changeset
|
21 op->func_code = code; |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
22 Py_INCREF(globals); |
| 6 | 23 op->func_globals = globals; |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
24 op->func_name = ((PyCodeObject *)code)->co_name; |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
25 Py_INCREF(op->func_name); |
|
2842
420874f7d8bd
changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents:
2205
diff
changeset
|
26 op->func_defaults = NULL; /* No default arguments */ |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
27 op->func_closure = NULL; |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
28 consts = ((PyCodeObject *)code)->co_consts; |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
29 if (PyTuple_Size(consts) >= 1) { |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
30 doc = PyTuple_GetItem(consts, 0); |
| 12512 | 31 if (!PyString_Check(doc) && !PyUnicode_Check(doc)) |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
32 doc = Py_None; |
|
2082
4afa7eb4734b
Added __doc__ attribute (alias func_doc), initialized from first
Guido van Rossum <guido@python.org>
parents:
2059
diff
changeset
|
33 } |
|
4afa7eb4734b
Added __doc__ attribute (alias func_doc), initialized from first
Guido van Rossum <guido@python.org>
parents:
2059
diff
changeset
|
34 else |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
35 doc = Py_None; |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
36 Py_INCREF(doc); |
|
2082
4afa7eb4734b
Added __doc__ attribute (alias func_doc), initialized from first
Guido van Rossum <guido@python.org>
parents:
2059
diff
changeset
|
37 op->func_doc = doc; |
|
15894
1c6b0d3a58ea
Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents:
14375
diff
changeset
|
38 op->func_dict = NULL; |
|
27559
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
39 op->func_module = NULL; |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
40 |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
41 /* __module__: If module name is in globals, use it. |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
42 Otherwise, use None. |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
43 */ |
| 31780 | 44 if (!__name__) { |
| 45 __name__ = PyString_InternFromString("__name__"); | |
| 46 if (!__name__) { | |
| 47 Py_DECREF(op); | |
| 48 return NULL; | |
| 49 } | |
| 50 } | |
| 51 module = PyDict_GetItem(globals, __name__); | |
|
27559
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
52 if (module) { |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
53 Py_INCREF(module); |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
54 op->func_module = module; |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
55 } |
| 6 | 56 } |
|
15894
1c6b0d3a58ea
Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents:
14375
diff
changeset
|
57 else |
|
1c6b0d3a58ea
Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents:
14375
diff
changeset
|
58 return NULL; |
|
19581
fd48a55ac364
Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19476
diff
changeset
|
59 _PyObject_GC_TRACK(op); |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
60 return (PyObject *)op; |
| 6 | 61 } |
| 62 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
63 PyObject * |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
64 PyFunction_GetCode(PyObject *op) |
| 6 | 65 { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
66 if (!PyFunction_Check(op)) { |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
67 PyErr_BadInternalCall(); |
| 6 | 68 return NULL; |
| 69 } | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
70 return ((PyFunctionObject *) op) -> func_code; |
| 6 | 71 } |
| 72 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
73 PyObject * |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
74 PyFunction_GetGlobals(PyObject *op) |
| 6 | 75 { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
76 if (!PyFunction_Check(op)) { |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
77 PyErr_BadInternalCall(); |
| 6 | 78 return NULL; |
| 79 } | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
80 return ((PyFunctionObject *) op) -> func_globals; |
| 6 | 81 } |
| 82 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
83 PyObject * |
|
27559
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
84 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
|
85 { |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
86 if (!PyFunction_Check(op)) { |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
87 PyErr_BadInternalCall(); |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
88 return NULL; |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
89 } |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
90 return ((PyFunctionObject *) op) -> func_module; |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
91 } |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
92 |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
93 PyObject * |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
94 PyFunction_GetDefaults(PyObject *op) |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
95 { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
96 if (!PyFunction_Check(op)) { |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
97 PyErr_BadInternalCall(); |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
98 return NULL; |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
99 } |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
100 return ((PyFunctionObject *) op) -> func_defaults; |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
101 } |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
102 |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
103 int |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
104 PyFunction_SetDefaults(PyObject *op, PyObject *defaults) |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
105 { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
106 if (!PyFunction_Check(op)) { |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
107 PyErr_BadInternalCall(); |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
108 return -1; |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
109 } |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
110 if (defaults == Py_None) |
|
2842
420874f7d8bd
changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents:
2205
diff
changeset
|
111 defaults = NULL; |
|
7981
09963a2a24db
Make new gcc -Wall happy
Guido van Rossum <guido@python.org>
parents:
5945
diff
changeset
|
112 else if (PyTuple_Check(defaults)) { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
113 Py_XINCREF(defaults); |
|
7981
09963a2a24db
Make new gcc -Wall happy
Guido van Rossum <guido@python.org>
parents:
5945
diff
changeset
|
114 } |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
115 else { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
116 PyErr_SetString(PyExc_SystemError, "non-tuple default args"); |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
117 return -1; |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
118 } |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
119 Py_XDECREF(((PyFunctionObject *) op) -> func_defaults); |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
120 ((PyFunctionObject *) op) -> func_defaults = defaults; |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
121 return 0; |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
122 } |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1415
diff
changeset
|
123 |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
124 PyObject * |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
125 PyFunction_GetClosure(PyObject *op) |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
126 { |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
127 if (!PyFunction_Check(op)) { |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
128 PyErr_BadInternalCall(); |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
129 return NULL; |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
130 } |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
131 return ((PyFunctionObject *) op) -> func_closure; |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
132 } |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
133 |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
134 int |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
135 PyFunction_SetClosure(PyObject *op, PyObject *closure) |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
136 { |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
137 if (!PyFunction_Check(op)) { |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
138 PyErr_BadInternalCall(); |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
139 return -1; |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
140 } |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
141 if (closure == Py_None) |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
142 closure = NULL; |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
143 else if (PyTuple_Check(closure)) { |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
144 Py_XINCREF(closure); |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
145 } |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
146 else { |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
147 PyErr_SetString(PyExc_SystemError, "non-tuple closure"); |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
148 return -1; |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
149 } |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
150 Py_XDECREF(((PyFunctionObject *) op) -> func_closure); |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
151 ((PyFunctionObject *) op) -> func_closure = closure; |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
152 return 0; |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
153 } |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16042
diff
changeset
|
154 |
| 6 | 155 /* Methods */ |
| 156 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
157 #define OFF(x) offsetof(PyFunctionObject, x) |
| 86 | 158 |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19948
diff
changeset
|
159 static PyMemberDef func_memberlist[] = { |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
160 {"func_closure", T_OBJECT, OFF(func_closure), |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
161 RESTRICTED|READONLY}, |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
162 {"func_doc", T_OBJECT, OFF(func_doc), WRITE_RESTRICTED}, |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
163 {"__doc__", T_OBJECT, OFF(func_doc), WRITE_RESTRICTED}, |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
164 {"func_globals", T_OBJECT, OFF(func_globals), |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
165 RESTRICTED|READONLY}, |
|
16042
78bd97d8413c
Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents:
15894
diff
changeset
|
166 {"func_name", T_OBJECT, OFF(func_name), READONLY}, |
|
78bd97d8413c
Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents:
15894
diff
changeset
|
167 {"__name__", T_OBJECT, OFF(func_name), READONLY}, |
|
27941
14451dd3acb0
Make __module__ writable except in restricted mode (like for classic classes).
Guido van Rossum <guido@python.org>
parents:
27940
diff
changeset
|
168 {"__module__", T_OBJECT, OFF(func_module), WRITE_RESTRICTED}, |
|
16042
78bd97d8413c
Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents:
15894
diff
changeset
|
169 {NULL} /* Sentinel */ |
| 86 | 170 }; |
| 171 | |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
172 static int |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
173 restricted(void) |
| 86 | 174 { |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
175 if (!PyEval_GetRestricted()) |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
176 return 0; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
177 PyErr_SetString(PyExc_RuntimeError, |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
178 "function attributes not accessible in restricted mode"); |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
179 return 1; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
180 } |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
181 |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
182 static PyObject * |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
183 func_get_dict(PyFunctionObject *op) |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
184 { |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
185 if (restricted()) |
|
2105
ea7b2bf0b521
add restrictions in restricted mode
Guido van Rossum <guido@python.org>
parents:
2082
diff
changeset
|
186 return NULL; |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
187 if (op->func_dict == NULL) { |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
188 op->func_dict = PyDict_New(); |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
189 if (op->func_dict == NULL) |
|
19244
fbe2074c5fa5
func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents:
18933
diff
changeset
|
190 return NULL; |
|
fbe2074c5fa5
func_getattro(), func_setattro(): Implement the new semantics for
Barry Warsaw <barry@python.org>
parents:
18933
diff
changeset
|
191 } |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
192 Py_INCREF(op->func_dict); |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
193 return op->func_dict; |
| 86 | 194 } |
| 195 | |
|
8407
096857b0e4b8
Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents:
7981
diff
changeset
|
196 static int |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
197 func_set_dict(PyFunctionObject *op, PyObject *value) |
|
8407
096857b0e4b8
Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents:
7981
diff
changeset
|
198 { |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
199 PyObject *tmp; |
|
15894
1c6b0d3a58ea
Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents:
14375
diff
changeset
|
200 |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
201 if (restricted()) |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
202 return -1; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
203 /* It is illegal to del f.func_dict */ |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
204 if (value == NULL) { |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
205 PyErr_SetString(PyExc_TypeError, |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
206 "function's dictionary may not be deleted"); |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
207 return -1; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
208 } |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
209 /* Can only set func_dict to a dictionary */ |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
210 if (!PyDict_Check(value)) { |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
211 PyErr_SetString(PyExc_TypeError, |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
212 "setting function's dictionary to a non-dict"); |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
213 return -1; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
214 } |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
215 tmp = op->func_dict; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
216 Py_INCREF(value); |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
217 op->func_dict = value; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
218 Py_XDECREF(tmp); |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
219 return 0; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
220 } |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
221 |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
222 static PyObject * |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
223 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
|
224 { |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
225 if (restricted()) |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
226 return NULL; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
227 Py_INCREF(op->func_code); |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
228 return op->func_code; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
229 } |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
230 |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
231 static int |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
232 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
|
233 { |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
234 PyObject *tmp; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
235 |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
236 if (restricted()) |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
237 return -1; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
238 /* Not legal to del f.func_code or to set it to anything |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
239 * other than a code object. */ |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
240 if (value == NULL || !PyCode_Check(value)) { |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
241 PyErr_SetString(PyExc_TypeError, |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
242 "func_code must be set to a code object"); |
|
8407
096857b0e4b8
Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents:
7981
diff
changeset
|
243 return -1; |
|
096857b0e4b8
Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents:
7981
diff
changeset
|
244 } |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
245 tmp = op->func_code; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
246 Py_INCREF(value); |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
247 op->func_code = value; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
248 Py_DECREF(tmp); |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
249 return 0; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
250 } |
|
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 static PyObject * |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
253 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
|
254 { |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
255 if (restricted()) |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
256 return NULL; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
257 if (op->func_defaults == NULL) { |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
258 Py_INCREF(Py_None); |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
259 return Py_None; |
|
8407
096857b0e4b8
Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents:
7981
diff
changeset
|
260 } |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
261 Py_INCREF(op->func_defaults); |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
262 return op->func_defaults; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
263 } |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
264 |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
265 static int |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
266 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
|
267 { |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
268 PyObject *tmp; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
269 |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
270 if (restricted()) |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
271 return -1; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
272 /* Legal to del f.func_defaults. |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
273 * Can only set func_defaults to NULL or a tuple. */ |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
274 if (value == Py_None) |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
275 value = NULL; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
276 if (value != NULL && !PyTuple_Check(value)) { |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
277 PyErr_SetString(PyExc_TypeError, |
|
8407
096857b0e4b8
Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents:
7981
diff
changeset
|
278 "func_defaults must be set to a tuple object"); |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
279 return -1; |
|
16042
78bd97d8413c
Application and elaboration of patch #103305 to fix core dumps when
Barry Warsaw <barry@python.org>
parents:
15894
diff
changeset
|
280 } |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
281 tmp = op->func_defaults; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
282 Py_XINCREF(value); |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
283 op->func_defaults = value; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
284 Py_XDECREF(tmp); |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
285 return 0; |
|
8407
096857b0e4b8
Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents:
7981
diff
changeset
|
286 } |
|
096857b0e4b8
Make function objects somewhat mutable -- the members func_code,
Guido van Rossum <guido@python.org>
parents:
7981
diff
changeset
|
287 |
|
20015
ca7af2a5d915
Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents:
20012
diff
changeset
|
288 static PyGetSetDef func_getsetlist[] = { |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
289 {"func_code", (getter)func_get_code, (setter)func_set_code}, |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
290 {"func_defaults", (getter)func_get_defaults, |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
291 (setter)func_set_defaults}, |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
292 {"func_dict", (getter)func_get_dict, (setter)func_set_dict}, |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
293 {"__dict__", (getter)func_get_dict, (setter)func_set_dict}, |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
294 {NULL} /* Sentinel */ |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
295 }; |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
296 |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
297 PyDoc_STRVAR(func_doc, |
|
24193
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
298 "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
|
299 \n\ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
300 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
|
301 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
|
302 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
|
303 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
|
304 |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
305 /* 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
|
306 closure must correspond to the free variables of the code object. |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
307 |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
308 if len(code.co_freevars) == 0: |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
309 closure = NULL |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
310 else: |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
311 len(closure) == len(code.co_freevars) |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
312 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
|
313 */ |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
314 |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
315 static PyObject * |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
316 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
|
317 { |
|
24193
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
318 PyCodeObject *code; |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
319 PyObject *globals; |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
320 PyObject *name = Py_None; |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
321 PyObject *defaults = Py_None; |
|
24193
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
322 PyObject *closure = Py_None; |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
323 PyFunctionObject *newfunc; |
|
24193
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
324 int nfree, nclosure; |
|
28986
41388e84261b
SF bug #692959: new.function ignores keyword arguments
Raymond Hettinger <python@rcn.com>
parents:
28537
diff
changeset
|
325 static char *kwlist[] = {"code", "globals", "name", |
|
41388e84261b
SF bug #692959: new.function ignores keyword arguments
Raymond Hettinger <python@rcn.com>
parents:
28537
diff
changeset
|
326 "argdefs", "closure", 0}; |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
327 |
|
28986
41388e84261b
SF bug #692959: new.function ignores keyword arguments
Raymond Hettinger <python@rcn.com>
parents:
28537
diff
changeset
|
328 if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!|OOO:function", |
|
41388e84261b
SF bug #692959: new.function ignores keyword arguments
Raymond Hettinger <python@rcn.com>
parents:
28537
diff
changeset
|
329 kwlist, |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
330 &PyCode_Type, &code, |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
331 &PyDict_Type, &globals, |
|
24193
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
332 &name, &defaults, &closure)) |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
333 return NULL; |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
334 if (name != Py_None && !PyString_Check(name)) { |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
335 PyErr_SetString(PyExc_TypeError, |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
336 "arg 3 (name) must be None or string"); |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
337 return NULL; |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
338 } |
|
24193
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
339 if (defaults != Py_None && !PyTuple_Check(defaults)) { |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
340 PyErr_SetString(PyExc_TypeError, |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
341 "arg 4 (defaults) must be None or tuple"); |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
342 return NULL; |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
343 } |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
344 nfree = PyTuple_GET_SIZE(code->co_freevars); |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
345 if (!PyTuple_Check(closure)) { |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
346 if (nfree && closure == Py_None) { |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
347 PyErr_SetString(PyExc_TypeError, |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
348 "arg 5 (closure) must be tuple"); |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
349 return NULL; |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
350 } |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
351 else if (closure != Py_None) { |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
352 PyErr_SetString(PyExc_TypeError, |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
353 "arg 5 (closure) must be None or tuple"); |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
354 return NULL; |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
355 } |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
356 } |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
357 |
|
24193
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
358 /* check that the closure is well-formed */ |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
359 nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure); |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
360 if (nfree != nclosure) |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
361 return PyErr_Format(PyExc_ValueError, |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
362 "%s requires closure of length %d, not %d", |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
363 PyString_AS_STRING(code->co_name), |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
364 nfree, nclosure); |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
365 if (nclosure) { |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
366 int i; |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
367 for (i = 0; i < nclosure; i++) { |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
368 PyObject *o = PyTuple_GET_ITEM(closure, i); |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
369 if (!PyCell_Check(o)) { |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
370 return PyErr_Format(PyExc_TypeError, |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
371 "arg 5 (closure) expected cell, found %s", |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
372 o->ob_type->tp_name); |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
373 } |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
374 } |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
375 } |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
376 |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
377 newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code, |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
378 globals); |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
379 if (newfunc == NULL) |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
380 return NULL; |
|
24193
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
381 |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
382 if (name != Py_None) { |
|
24193
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
383 Py_INCREF(name); |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
384 Py_DECREF(newfunc->func_name); |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
385 newfunc->func_name = name; |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
386 } |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
387 if (defaults != Py_None) { |
|
24193
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
388 Py_INCREF(defaults); |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
389 newfunc->func_defaults = defaults; |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
390 } |
|
24193
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
391 if (closure != Py_None) { |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
392 Py_INCREF(closure); |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
393 newfunc->func_closure = closure; |
|
6eb74e83a6f1
Extend function() to support an optional closure argument.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23868
diff
changeset
|
394 } |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
395 |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
396 return (PyObject *)newfunc; |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
397 } |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
398 |
| 6 | 399 static void |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
400 func_dealloc(PyFunctionObject *op) |
| 6 | 401 { |
|
19581
fd48a55ac364
Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19476
diff
changeset
|
402 _PyObject_GC_UNTRACK(op); |
|
20698
b229208a2a72
Be smarter about clearing the weakref lists for instances, instance methods,
Fred Drake <fdrake@acm.org>
parents:
20277
diff
changeset
|
403 if (op->func_weakreflist != NULL) |
|
b229208a2a72
Be smarter about clearing the weakref lists for instances, instance methods,
Fred Drake <fdrake@acm.org>
parents:
20277
diff
changeset
|
404 PyObject_ClearWeakRefs((PyObject *) op); |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
405 Py_DECREF(op->func_code); |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
406 Py_DECREF(op->func_globals); |
|
27559
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
407 Py_XDECREF(op->func_module); |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
408 Py_DECREF(op->func_name); |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
409 Py_XDECREF(op->func_defaults); |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
410 Py_XDECREF(op->func_doc); |
|
15894
1c6b0d3a58ea
Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents:
14375
diff
changeset
|
411 Py_XDECREF(op->func_dict); |
|
16891
806c6ae23103
Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16825
diff
changeset
|
412 Py_XDECREF(op->func_closure); |
|
19581
fd48a55ac364
Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19476
diff
changeset
|
413 PyObject_GC_Del(op); |
| 6 | 414 } |
| 415 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
416 static PyObject* |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
417 func_repr(PyFunctionObject *op) |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
418 { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
419 if (op->func_name == Py_None) |
|
19476
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19244
diff
changeset
|
420 return PyString_FromFormat("<anonymous function at %p>", op); |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19244
diff
changeset
|
421 return PyString_FromFormat("<function %s at %p>", |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19244
diff
changeset
|
422 PyString_AsString(op->func_name), |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19244
diff
changeset
|
423 op); |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
424 } |
|
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
425 |
|
1399
cc172ce05561
Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents:
1288
diff
changeset
|
426 static int |
|
12990
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
427 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
|
428 { |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
429 int err; |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
430 if (f->func_code) { |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
431 err = visit(f->func_code, arg); |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
432 if (err) |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
433 return err; |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
434 } |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
435 if (f->func_globals) { |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
436 err = visit(f->func_globals, arg); |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
437 if (err) |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
438 return err; |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
439 } |
|
27559
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
440 if (f->func_module) { |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
441 err = visit(f->func_module, arg); |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
442 if (err) |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
443 return err; |
|
faabd9867fb8
Provide __module__ attributes for functions defined in C and Python.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
26818
diff
changeset
|
444 } |
|
12990
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
445 if (f->func_defaults) { |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
446 err = visit(f->func_defaults, arg); |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
447 if (err) |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
448 return err; |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
449 } |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
450 if (f->func_doc) { |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
451 err = visit(f->func_doc, arg); |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
452 if (err) |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
453 return err; |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
454 } |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
455 if (f->func_name) { |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
456 err = visit(f->func_name, arg); |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
457 if (err) |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
458 return err; |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
459 } |
|
15894
1c6b0d3a58ea
Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents:
14375
diff
changeset
|
460 if (f->func_dict) { |
|
1c6b0d3a58ea
Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents:
14375
diff
changeset
|
461 err = visit(f->func_dict, arg); |
|
1c6b0d3a58ea
Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents:
14375
diff
changeset
|
462 if (err) |
|
1c6b0d3a58ea
Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents:
14375
diff
changeset
|
463 return err; |
|
1c6b0d3a58ea
Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents:
14375
diff
changeset
|
464 } |
|
16891
806c6ae23103
Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16825
diff
changeset
|
465 if (f->func_closure) { |
|
806c6ae23103
Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16825
diff
changeset
|
466 err = visit(f->func_closure, arg); |
|
806c6ae23103
Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16825
diff
changeset
|
467 if (err) |
|
806c6ae23103
Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16825
diff
changeset
|
468 return err; |
|
806c6ae23103
Visit the closure during traversal and XDECREF it on during deallocation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16825
diff
changeset
|
469 } |
|
12990
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
470 return 0; |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
471 } |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
472 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
473 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
474 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
|
475 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
476 PyObject *result; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
477 PyObject *argdefs; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
478 PyObject **d, **k; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
479 int nk, nd; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
480 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
481 argdefs = PyFunction_GET_DEFAULTS(func); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
482 if (argdefs != NULL && PyTuple_Check(argdefs)) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
483 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
484 nd = PyTuple_Size(argdefs); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
485 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
486 else { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
487 d = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
488 nd = 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
489 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
490 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
491 if (kw != NULL && PyDict_Check(kw)) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
492 int pos, i; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
493 nk = PyDict_Size(kw); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
494 k = PyMem_NEW(PyObject *, 2*nk); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
495 if (k == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
496 PyErr_NoMemory(); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
497 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
498 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
499 pos = i = 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
500 while (PyDict_Next(kw, &pos, &k[i], &k[i+1])) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
501 i += 2; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
502 nk = i/2; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
503 /* XXX This is broken if the caller deletes dict items! */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
504 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
505 else { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
506 k = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
507 nk = 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
508 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
509 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
510 result = PyEval_EvalCodeEx( |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
511 (PyCodeObject *)PyFunction_GET_CODE(func), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
512 PyFunction_GET_GLOBALS(func), (PyObject *)NULL, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
513 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
514 k, nk, d, nd, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
515 PyFunction_GET_CLOSURE(func)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
516 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
517 if (k != NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
518 PyMem_DEL(k); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
519 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
520 return result; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
521 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
522 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
523 /* Bind a function to an object */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
524 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
525 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
|
526 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
527 if (obj == Py_None) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
528 obj = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
529 return PyMethod_New(func, obj, type); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
530 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
531 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
532 PyTypeObject PyFunction_Type = { |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
533 PyObject_HEAD_INIT(&PyType_Type) |
| 6 | 534 0, |
| 535 "function", | |
|
19581
fd48a55ac364
Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19476
diff
changeset
|
536 sizeof(PyFunctionObject), |
| 6 | 537 0, |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
538 (destructor)func_dealloc, /* tp_dealloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
539 0, /* tp_print */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
540 0, /* tp_getattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
541 0, /* tp_setattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
542 0, /* tp_compare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
543 (reprfunc)func_repr, /* tp_repr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
544 0, /* tp_as_number */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
545 0, /* tp_as_sequence */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
546 0, /* tp_as_mapping */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
547 0, /* tp_hash */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
548 function_call, /* tp_call */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
549 0, /* tp_str */ |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
550 PyObject_GenericGetAttr, /* tp_getattro */ |
|
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
551 PyObject_GenericSetAttr, /* tp_setattro */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
552 0, /* tp_as_buffer */ |
|
19581
fd48a55ac364
Use new GC API.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
19476
diff
changeset
|
553 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
554 func_doc, /* tp_doc */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
555 (traverseproc)func_traverse, /* tp_traverse */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
556 0, /* tp_clear */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
557 0, /* tp_richcompare */ |
|
17170
962196ce7231
Add support for weak references to the function and method types.
Fred Drake <fdrake@acm.org>
parents:
16891
diff
changeset
|
558 offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
559 0, /* tp_iter */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
560 0, /* tp_iternext */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
561 0, /* tp_methods */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
562 func_memberlist, /* tp_members */ |
|
19948
eaf1203b85cf
Rewrite function attributes to use the generic routines properly.
Guido van Rossum <guido@python.org>
parents:
19581
diff
changeset
|
563 func_getsetlist, /* tp_getset */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
564 0, /* tp_base */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
565 0, /* tp_dict */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
566 func_descr_get, /* tp_descr_get */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
567 0, /* tp_descr_set */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
568 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */ |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
569 0, /* tp_init */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
570 0, /* tp_alloc */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
571 func_new, /* tp_new */ |
| 6 | 572 }; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
573 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
574 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
575 /* Class method object */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
576 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
577 /* 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
|
578 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
|
579 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
|
580 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
581 class C: |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
582 def f(cls, arg1, arg2, ...): ... |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
583 f = classmethod(f) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
584 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
585 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
|
586 (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
|
587 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
|
588 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
|
589 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
590 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
|
591 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
|
592 */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
593 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
594 typedef struct { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
595 PyObject_HEAD |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
596 PyObject *cm_callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
597 } classmethod; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
598 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
599 static void |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
600 cm_dealloc(classmethod *cm) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
601 { |
|
28537
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
602 _PyObject_GC_UNTRACK((PyObject *)cm); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
603 Py_XDECREF(cm->cm_callable); |
|
20277
2983b54256c7
Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents:
20015
diff
changeset
|
604 cm->ob_type->tp_free((PyObject *)cm); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
605 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
606 |
|
28537
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
607 static int |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
608 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
|
609 { |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
610 if (!cm->cm_callable) |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
611 return 0; |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
612 return visit(cm->cm_callable, arg); |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
613 } |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
614 |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
615 static int |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
616 cm_clear(classmethod *cm) |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
617 { |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
618 Py_XDECREF(cm->cm_callable); |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
619 cm->cm_callable = NULL; |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
620 |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
621 return 0; |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
622 } |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
623 |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
624 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
625 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
626 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
|
627 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
628 classmethod *cm = (classmethod *)self; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
629 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
630 if (cm->cm_callable == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
631 PyErr_SetString(PyExc_RuntimeError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
632 "uninitialized classmethod object"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
633 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
634 } |
|
22367
f2b6ccc00808
Fix for SF bug 528132 (Armin Rigo): classmethod().__get__() segfault
Guido van Rossum <guido@python.org>
parents:
21446
diff
changeset
|
635 if (type == NULL) |
|
f2b6ccc00808
Fix for SF bug 528132 (Armin Rigo): classmethod().__get__() segfault
Guido van Rossum <guido@python.org>
parents:
21446
diff
changeset
|
636 type = (PyObject *)(obj->ob_type); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
637 return PyMethod_New(cm->cm_callable, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
638 type, (PyObject *)(type->ob_type)); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
639 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
640 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
641 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
642 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
|
643 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
644 classmethod *cm = (classmethod *)self; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
645 PyObject *callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
646 |
|
26818
e094a03a80ff
SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents:
24193
diff
changeset
|
647 if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable)) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
648 return -1; |
|
29526
f6d503de45bd
SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents:
28986
diff
changeset
|
649 if (!PyCallable_Check(callable)) { |
|
f6d503de45bd
SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents:
28986
diff
changeset
|
650 PyErr_Format(PyExc_TypeError, "'%s' object is not callable", |
|
f6d503de45bd
SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents:
28986
diff
changeset
|
651 callable->ob_type->tp_name); |
|
f6d503de45bd
SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents:
28986
diff
changeset
|
652 return -1; |
|
f6d503de45bd
SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents:
28986
diff
changeset
|
653 } |
|
f6d503de45bd
SF bug #753451: classmethod abuse --> SystemError
Raymond Hettinger <python@rcn.com>
parents:
28986
diff
changeset
|
654 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
655 Py_INCREF(callable); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
656 cm->cm_callable = callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
657 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
658 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
659 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
22974
diff
changeset
|
660 PyDoc_STRVAR(classmethod_doc, |
|
21444
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
661 "classmethod(function) -> method\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
662 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
663 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
|
664 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
665 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
|
666 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
|
667 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
|
668 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
669 class C:\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
670 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
|
671 f = classmethod(f)\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
672 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
673 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
|
674 (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
|
675 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
|
676 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
|
677 \n\ |
|
21444
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
678 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
|
679 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
|
680 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
681 PyTypeObject PyClassMethod_Type = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
682 PyObject_HEAD_INIT(&PyType_Type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
683 0, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
684 "classmethod", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
685 sizeof(classmethod), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
686 0, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
687 (destructor)cm_dealloc, /* tp_dealloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
688 0, /* tp_print */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
689 0, /* tp_getattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
690 0, /* tp_setattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
691 0, /* tp_compare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
692 0, /* tp_repr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
693 0, /* tp_as_number */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
694 0, /* tp_as_sequence */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
695 0, /* tp_as_mapping */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
696 0, /* tp_hash */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
697 0, /* tp_call */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
698 0, /* tp_str */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
699 PyObject_GenericGetAttr, /* tp_getattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
700 0, /* tp_setattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
701 0, /* tp_as_buffer */ |
|
28537
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
702 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, |
|
21444
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
703 classmethod_doc, /* tp_doc */ |
|
28537
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
704 (traverseproc)cm_traverse, /* tp_traverse */ |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
705 (inquiry)cm_clear, /* tp_clear */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
706 0, /* tp_richcompare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
707 0, /* tp_weaklistoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
708 0, /* tp_iter */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
709 0, /* tp_iternext */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
710 0, /* tp_methods */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
711 0, /* tp_members */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
712 0, /* tp_getset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
713 0, /* tp_base */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
714 0, /* tp_dict */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
715 cm_descr_get, /* tp_descr_get */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
716 0, /* tp_descr_set */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
717 0, /* tp_dictoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
718 cm_init, /* tp_init */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
719 PyType_GenericAlloc, /* tp_alloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
720 PyType_GenericNew, /* tp_new */ |
|
28537
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
721 PyObject_GC_Del, /* tp_free */ |
|
18933
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 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
724 PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
725 PyClassMethod_New(PyObject *callable) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
726 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
727 classmethod *cm = (classmethod *) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
728 PyType_GenericAlloc(&PyClassMethod_Type, 0); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
729 if (cm != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
730 Py_INCREF(callable); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
731 cm->cm_callable = callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
732 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
733 return (PyObject *)cm; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
734 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
735 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
736 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
737 /* Static method object */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
738 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
739 /* 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
|
740 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
|
741 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
742 class C: |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
743 def f(arg1, arg2, ...): ... |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
744 f = staticmethod(f) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
745 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
746 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
|
747 (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
|
748 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
749 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
|
750 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
|
751 */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
752 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
753 typedef struct { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
754 PyObject_HEAD |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
755 PyObject *sm_callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
756 } staticmethod; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
757 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
758 static void |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
759 sm_dealloc(staticmethod *sm) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
760 { |
|
28537
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
761 _PyObject_GC_UNTRACK((PyObject *)sm); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
762 Py_XDECREF(sm->sm_callable); |
|
20277
2983b54256c7
Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents:
20015
diff
changeset
|
763 sm->ob_type->tp_free((PyObject *)sm); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
764 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
765 |
|
28537
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
766 static int |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
767 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
|
768 { |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
769 if (!sm->sm_callable) |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
770 return 0; |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
771 return visit(sm->sm_callable, arg); |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
772 } |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
773 |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
774 static int |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
775 sm_clear(staticmethod *sm) |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
776 { |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
777 Py_XDECREF(sm->sm_callable); |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
778 sm->sm_callable = NULL; |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
779 |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
780 return 0; |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
781 } |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
782 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
783 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
784 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
|
785 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
786 staticmethod *sm = (staticmethod *)self; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
787 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
788 if (sm->sm_callable == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
789 PyErr_SetString(PyExc_RuntimeError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
790 "uninitialized staticmethod object"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
791 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
792 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
793 Py_INCREF(sm->sm_callable); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
794 return sm->sm_callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
795 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
796 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
797 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
798 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
|
799 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
800 staticmethod *sm = (staticmethod *)self; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
801 PyObject *callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
802 |
|
26818
e094a03a80ff
SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents:
24193
diff
changeset
|
803 if (!PyArg_UnpackTuple(args, "staticmethod", 1, 1, &callable)) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
804 return -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
805 Py_INCREF(callable); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
806 sm->sm_callable = callable; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
807 return 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
808 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
809 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
22974
diff
changeset
|
810 PyDoc_STRVAR(staticmethod_doc, |
|
21444
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
811 "staticmethod(function) -> method\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
812 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
813 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
|
814 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
815 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
|
816 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
|
817 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
818 class C:\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
819 def f(arg1, arg2, ...): ...\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
820 f = staticmethod(f)\n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
821 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
822 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
|
823 (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
|
824 \n\ |
|
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
825 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
|
826 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
|
827 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
828 PyTypeObject PyStaticMethod_Type = { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
829 PyObject_HEAD_INIT(&PyType_Type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
830 0, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
831 "staticmethod", |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
832 sizeof(staticmethod), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
833 0, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
834 (destructor)sm_dealloc, /* tp_dealloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
835 0, /* tp_print */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
836 0, /* tp_getattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
837 0, /* tp_setattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
838 0, /* tp_compare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
839 0, /* tp_repr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
840 0, /* tp_as_number */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
841 0, /* tp_as_sequence */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
842 0, /* tp_as_mapping */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
843 0, /* tp_hash */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
844 0, /* tp_call */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
845 0, /* tp_str */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
846 PyObject_GenericGetAttr, /* tp_getattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
847 0, /* tp_setattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
848 0, /* tp_as_buffer */ |
|
28537
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
849 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, |
|
21444
5193290aef0a
SF patch #493452: docstrings for staticmethod/classmethod (Skip
Guido van Rossum <guido@python.org>
parents:
21167
diff
changeset
|
850 staticmethod_doc, /* tp_doc */ |
|
28537
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
851 (traverseproc)sm_traverse, /* tp_traverse */ |
|
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
852 (inquiry)sm_clear, /* tp_clear */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
853 0, /* tp_richcompare */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
854 0, /* tp_weaklistoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
855 0, /* tp_iter */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
856 0, /* tp_iternext */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
857 0, /* tp_methods */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
858 0, /* tp_members */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
859 0, /* tp_getset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
860 0, /* tp_base */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
861 0, /* tp_dict */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
862 sm_descr_get, /* tp_descr_get */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
863 0, /* tp_descr_set */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
864 0, /* tp_dictoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
865 sm_init, /* tp_init */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
866 PyType_GenericAlloc, /* tp_alloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
867 PyType_GenericNew, /* tp_new */ |
|
28537
c7bb254ab890
Make staticmethods and classmethods participate in GC.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
27941
diff
changeset
|
868 PyObject_GC_Del, /* tp_free */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
869 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
870 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
871 PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
872 PyStaticMethod_New(PyObject *callable) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
873 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
874 staticmethod *sm = (staticmethod *) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
875 PyType_GenericAlloc(&PyStaticMethod_Type, 0); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
876 if (sm != NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
877 Py_INCREF(callable); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
878 sm->sm_callable = callable; |
|
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 return (PyObject *)sm; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17669
diff
changeset
|
881 } |
