blob: 8ac88b15df79f1248c2e33512ad0dc1a73c91c20 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Function object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005#include "code.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00006#include "structmember.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00007
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008PyObject *
Antoine Pitrou86a36b52011-11-25 18:56:07 +01009PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000010{
Victor Stinner4d1f5d62013-07-22 23:02:05 +020011 PyFunctionObject *op;
12 PyObject *doc, *consts, *module;
13 static PyObject *__name__ = NULL;
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +000014
Victor Stinner34f96b82013-07-22 23:04:55 +020015 if (__name__ == NULL) {
16 __name__ = PyUnicode_InternFromString("__name__");
17 if (__name__ == NULL)
18 return NULL;
19 }
20
Victor Stinner4d1f5d62013-07-22 23:02:05 +020021 op = PyObject_GC_New(PyFunctionObject, &PyFunction_Type);
22 if (op == NULL)
23 return NULL;
24
25 op->func_weakreflist = NULL;
26 Py_INCREF(code);
27 op->func_code = code;
28 Py_INCREF(globals);
29 op->func_globals = globals;
30 op->func_name = ((PyCodeObject *)code)->co_name;
31 Py_INCREF(op->func_name);
32 op->func_defaults = NULL; /* No default arguments */
33 op->func_kwdefaults = NULL; /* No keyword only defaults */
34 op->func_closure = NULL;
Victor Stinner34f96b82013-07-22 23:04:55 +020035
Victor Stinner4d1f5d62013-07-22 23:02:05 +020036 consts = ((PyCodeObject *)code)->co_consts;
37 if (PyTuple_Size(consts) >= 1) {
38 doc = PyTuple_GetItem(consts, 0);
39 if (!PyUnicode_Check(doc))
40 doc = Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000041 }
42 else
Victor Stinner4d1f5d62013-07-22 23:02:05 +020043 doc = Py_None;
44 Py_INCREF(doc);
45 op->func_doc = doc;
Victor Stinner34f96b82013-07-22 23:04:55 +020046
Victor Stinner4d1f5d62013-07-22 23:02:05 +020047 op->func_dict = NULL;
48 op->func_module = NULL;
49 op->func_annotations = NULL;
50
51 /* __module__: If module name is in globals, use it.
Victor Stinner34f96b82013-07-22 23:04:55 +020052 Otherwise, use None. */
Victor Stinner4d1f5d62013-07-22 23:02:05 +020053 module = PyDict_GetItem(globals, __name__);
54 if (module) {
55 Py_INCREF(module);
56 op->func_module = module;
57 }
58 if (qualname)
59 op->func_qualname = qualname;
60 else
61 op->func_qualname = op->func_name;
62 Py_INCREF(op->func_qualname);
63
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 _PyObject_GC_TRACK(op);
65 return (PyObject *)op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066}
67
Guido van Rossumc0b618a1997-05-02 03:12:38 +000068PyObject *
Antoine Pitrou86a36b52011-11-25 18:56:07 +010069PyFunction_New(PyObject *code, PyObject *globals)
70{
71 return PyFunction_NewWithQualName(code, globals, NULL);
72}
73
74PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000075PyFunction_GetCode(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000077 if (!PyFunction_Check(op)) {
78 PyErr_BadInternalCall();
79 return NULL;
80 }
81 return ((PyFunctionObject *) op) -> func_code;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082}
83
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000085PyFunction_GetGlobals(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 if (!PyFunction_Check(op)) {
88 PyErr_BadInternalCall();
89 return NULL;
90 }
91 return ((PyFunctionObject *) op) -> func_globals;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092}
93
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094PyObject *
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +000095PyFunction_GetModule(PyObject *op)
96{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000097 if (!PyFunction_Check(op)) {
98 PyErr_BadInternalCall();
99 return NULL;
100 }
101 return ((PyFunctionObject *) op) -> func_module;
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000102}
103
104PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000105PyFunction_GetDefaults(PyObject *op)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000106{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 if (!PyFunction_Check(op)) {
108 PyErr_BadInternalCall();
109 return NULL;
110 }
111 return ((PyFunctionObject *) op) -> func_defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000112}
113
114int
Fred Drakeee238b92000-07-09 06:03:25 +0000115PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000117 if (!PyFunction_Check(op)) {
118 PyErr_BadInternalCall();
119 return -1;
120 }
121 if (defaults == Py_None)
122 defaults = NULL;
123 else if (defaults && PyTuple_Check(defaults)) {
124 Py_INCREF(defaults);
125 }
126 else {
127 PyErr_SetString(PyExc_SystemError, "non-tuple default args");
128 return -1;
129 }
Serhiy Storchaka48842712016-04-06 09:45:48 +0300130 Py_XSETREF(((PyFunctionObject *)op)->func_defaults, defaults);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 return 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000132}
133
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000134PyObject *
Guido van Rossum4f72a782006-10-27 23:31:49 +0000135PyFunction_GetKwDefaults(PyObject *op)
136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 if (!PyFunction_Check(op)) {
138 PyErr_BadInternalCall();
139 return NULL;
140 }
141 return ((PyFunctionObject *) op) -> func_kwdefaults;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000142}
143
144int
145PyFunction_SetKwDefaults(PyObject *op, PyObject *defaults)
146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 if (!PyFunction_Check(op)) {
148 PyErr_BadInternalCall();
149 return -1;
150 }
151 if (defaults == Py_None)
152 defaults = NULL;
153 else if (defaults && PyDict_Check(defaults)) {
154 Py_INCREF(defaults);
155 }
156 else {
157 PyErr_SetString(PyExc_SystemError,
158 "non-dict keyword only default args");
159 return -1;
160 }
Serhiy Storchaka48842712016-04-06 09:45:48 +0300161 Py_XSETREF(((PyFunctionObject *)op)->func_kwdefaults, defaults);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000163}
164
165PyObject *
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000166PyFunction_GetClosure(PyObject *op)
167{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000168 if (!PyFunction_Check(op)) {
169 PyErr_BadInternalCall();
170 return NULL;
171 }
172 return ((PyFunctionObject *) op) -> func_closure;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000173}
174
175int
176PyFunction_SetClosure(PyObject *op, PyObject *closure)
177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000178 if (!PyFunction_Check(op)) {
179 PyErr_BadInternalCall();
180 return -1;
181 }
182 if (closure == Py_None)
183 closure = NULL;
184 else if (PyTuple_Check(closure)) {
185 Py_INCREF(closure);
186 }
187 else {
188 PyErr_Format(PyExc_SystemError,
189 "expected tuple for closure, got '%.100s'",
190 closure->ob_type->tp_name);
191 return -1;
192 }
Serhiy Storchaka48842712016-04-06 09:45:48 +0300193 Py_XSETREF(((PyFunctionObject *)op)->func_closure, closure);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000195}
196
Neal Norwitzc1505362006-12-28 06:47:50 +0000197PyObject *
198PyFunction_GetAnnotations(PyObject *op)
199{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 if (!PyFunction_Check(op)) {
201 PyErr_BadInternalCall();
202 return NULL;
203 }
204 return ((PyFunctionObject *) op) -> func_annotations;
Neal Norwitzc1505362006-12-28 06:47:50 +0000205}
206
207int
208PyFunction_SetAnnotations(PyObject *op, PyObject *annotations)
209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 if (!PyFunction_Check(op)) {
211 PyErr_BadInternalCall();
212 return -1;
213 }
214 if (annotations == Py_None)
215 annotations = NULL;
216 else if (annotations && PyDict_Check(annotations)) {
217 Py_INCREF(annotations);
218 }
219 else {
220 PyErr_SetString(PyExc_SystemError,
221 "non-dict annotations");
222 return -1;
223 }
Serhiy Storchaka48842712016-04-06 09:45:48 +0300224 Py_XSETREF(((PyFunctionObject *)op)->func_annotations, annotations);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000225 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +0000226}
227
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228/* Methods */
229
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230#define OFF(x) offsetof(PyFunctionObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000231
Guido van Rossum6f799372001-09-20 20:46:19 +0000232static PyMemberDef func_memberlist[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 {"__closure__", T_OBJECT, OFF(func_closure),
234 RESTRICTED|READONLY},
235 {"__doc__", T_OBJECT, OFF(func_doc), PY_WRITE_RESTRICTED},
236 {"__globals__", T_OBJECT, OFF(func_globals),
237 RESTRICTED|READONLY},
238 {"__module__", T_OBJECT, OFF(func_module), PY_WRITE_RESTRICTED},
239 {NULL} /* Sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000240};
241
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000242static PyObject *
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000243func_get_code(PyFunctionObject *op)
244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 Py_INCREF(op->func_code);
246 return op->func_code;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000247}
248
249static int
250func_set_code(PyFunctionObject *op, PyObject *value)
251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000252 Py_ssize_t nfree, nclosure;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 /* Not legal to del f.func_code or to set it to anything
255 * other than a code object. */
256 if (value == NULL || !PyCode_Check(value)) {
257 PyErr_SetString(PyExc_TypeError,
258 "__code__ must be set to a code object");
259 return -1;
260 }
261 nfree = PyCode_GetNumFree((PyCodeObject *)value);
262 nclosure = (op->func_closure == NULL ? 0 :
263 PyTuple_GET_SIZE(op->func_closure));
264 if (nclosure != nfree) {
265 PyErr_Format(PyExc_ValueError,
266 "%U() requires a code object with %zd free vars,"
267 " not %zd",
268 op->func_name,
269 nclosure, nfree);
270 return -1;
271 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 Py_INCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +0300273 Py_XSETREF(op->func_code, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274 return 0;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000275}
276
277static PyObject *
Michael W. Hudson5e897952004-08-12 18:12:44 +0000278func_get_name(PyFunctionObject *op)
279{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 Py_INCREF(op->func_name);
281 return op->func_name;
Michael W. Hudson5e897952004-08-12 18:12:44 +0000282}
283
284static int
285func_set_name(PyFunctionObject *op, PyObject *value)
286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 /* Not legal to del f.func_name or to set it to anything
288 * other than a string object. */
289 if (value == NULL || !PyUnicode_Check(value)) {
290 PyErr_SetString(PyExc_TypeError,
291 "__name__ must be set to a string object");
292 return -1;
293 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 Py_INCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +0300295 Py_XSETREF(op->func_name, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 return 0;
Michael W. Hudson5e897952004-08-12 18:12:44 +0000297}
298
299static PyObject *
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100300func_get_qualname(PyFunctionObject *op)
301{
302 Py_INCREF(op->func_qualname);
303 return op->func_qualname;
304}
305
306static int
307func_set_qualname(PyFunctionObject *op, PyObject *value)
308{
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100309 /* Not legal to del f.__qualname__ or to set it to anything
310 * other than a string object. */
311 if (value == NULL || !PyUnicode_Check(value)) {
312 PyErr_SetString(PyExc_TypeError,
313 "__qualname__ must be set to a string object");
314 return -1;
315 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100316 Py_INCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +0300317 Py_XSETREF(op->func_qualname, value);
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100318 return 0;
319}
320
321static PyObject *
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000322func_get_defaults(PyFunctionObject *op)
323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 if (op->func_defaults == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200325 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 }
327 Py_INCREF(op->func_defaults);
328 return op->func_defaults;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000329}
330
331static int
332func_set_defaults(PyFunctionObject *op, PyObject *value)
333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 /* Legal to del f.func_defaults.
335 * Can only set func_defaults to NULL or a tuple. */
336 if (value == Py_None)
337 value = NULL;
338 if (value != NULL && !PyTuple_Check(value)) {
339 PyErr_SetString(PyExc_TypeError,
340 "__defaults__ must be set to a tuple object");
341 return -1;
342 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 Py_XINCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +0300344 Py_XSETREF(op->func_defaults, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 return 0;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000346}
347
Guido van Rossum4f72a782006-10-27 23:31:49 +0000348static PyObject *
349func_get_kwdefaults(PyFunctionObject *op)
350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 if (op->func_kwdefaults == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200352 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 }
354 Py_INCREF(op->func_kwdefaults);
355 return op->func_kwdefaults;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000356}
357
358static int
359func_set_kwdefaults(PyFunctionObject *op, PyObject *value)
360{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 if (value == Py_None)
362 value = NULL;
363 /* Legal to del f.func_kwdefaults.
364 * Can only set func_kwdefaults to NULL or a dict. */
365 if (value != NULL && !PyDict_Check(value)) {
366 PyErr_SetString(PyExc_TypeError,
367 "__kwdefaults__ must be set to a dict object");
368 return -1;
369 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 Py_XINCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +0300371 Py_XSETREF(op->func_kwdefaults, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000373}
374
Neal Norwitzc1505362006-12-28 06:47:50 +0000375static PyObject *
376func_get_annotations(PyFunctionObject *op)
377{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 if (op->func_annotations == NULL) {
379 op->func_annotations = PyDict_New();
380 if (op->func_annotations == NULL)
381 return NULL;
382 }
383 Py_INCREF(op->func_annotations);
384 return op->func_annotations;
Neal Norwitzc1505362006-12-28 06:47:50 +0000385}
386
387static int
388func_set_annotations(PyFunctionObject *op, PyObject *value)
389{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 if (value == Py_None)
391 value = NULL;
392 /* Legal to del f.func_annotations.
393 * Can only set func_annotations to NULL (through C api)
394 * or a dict. */
395 if (value != NULL && !PyDict_Check(value)) {
396 PyErr_SetString(PyExc_TypeError,
397 "__annotations__ must be set to a dict object");
398 return -1;
399 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 Py_XINCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +0300401 Py_XSETREF(op->func_annotations, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +0000403}
404
Guido van Rossum32d34c82001-09-20 21:45:26 +0000405static PyGetSetDef func_getsetlist[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 {"__code__", (getter)func_get_code, (setter)func_set_code},
407 {"__defaults__", (getter)func_get_defaults,
408 (setter)func_set_defaults},
409 {"__kwdefaults__", (getter)func_get_kwdefaults,
410 (setter)func_set_kwdefaults},
411 {"__annotations__", (getter)func_get_annotations,
412 (setter)func_set_annotations},
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500413 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 {"__name__", (getter)func_get_name, (setter)func_set_name},
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100415 {"__qualname__", (getter)func_get_qualname, (setter)func_set_qualname},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 {NULL} /* Sentinel */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000417};
418
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000419PyDoc_STRVAR(func_doc,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000420"function(code, globals[, name[, argdefs[, closure]]])\n\
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000421\n\
422Create a function object from a code object and a dictionary.\n\
423The optional name string overrides the name from the code object.\n\
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000424The optional argdefs tuple specifies the default argument values.\n\
425The optional closure tuple supplies the bindings for free variables.");
426
427/* func_new() maintains the following invariants for closures. The
428 closure must correspond to the free variables of the code object.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429
430 if len(code.co_freevars) == 0:
431 closure = NULL
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000432 else:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 len(closure) == len(code.co_freevars)
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000434 for every elt in closure, type(elt) == cell
435*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000436
437static PyObject *
438func_new(PyTypeObject* type, PyObject* args, PyObject* kw)
439{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000440 PyCodeObject *code;
441 PyObject *globals;
442 PyObject *name = Py_None;
443 PyObject *defaults = Py_None;
444 PyObject *closure = Py_None;
445 PyFunctionObject *newfunc;
446 Py_ssize_t nfree, nclosure;
447 static char *kwlist[] = {"code", "globals", "name",
448 "argdefs", "closure", 0};
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!|OOO:function",
451 kwlist,
452 &PyCode_Type, &code,
453 &PyDict_Type, &globals,
454 &name, &defaults, &closure))
455 return NULL;
456 if (name != Py_None && !PyUnicode_Check(name)) {
457 PyErr_SetString(PyExc_TypeError,
458 "arg 3 (name) must be None or string");
459 return NULL;
460 }
461 if (defaults != Py_None && !PyTuple_Check(defaults)) {
462 PyErr_SetString(PyExc_TypeError,
463 "arg 4 (defaults) must be None or tuple");
464 return NULL;
465 }
466 nfree = PyTuple_GET_SIZE(code->co_freevars);
467 if (!PyTuple_Check(closure)) {
468 if (nfree && closure == Py_None) {
469 PyErr_SetString(PyExc_TypeError,
470 "arg 5 (closure) must be tuple");
471 return NULL;
472 }
473 else if (closure != Py_None) {
474 PyErr_SetString(PyExc_TypeError,
475 "arg 5 (closure) must be None or tuple");
476 return NULL;
477 }
478 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 /* check that the closure is well-formed */
481 nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure);
482 if (nfree != nclosure)
483 return PyErr_Format(PyExc_ValueError,
484 "%U requires closure of length %zd, not %zd",
485 code->co_name, nfree, nclosure);
486 if (nclosure) {
487 Py_ssize_t i;
488 for (i = 0; i < nclosure; i++) {
489 PyObject *o = PyTuple_GET_ITEM(closure, i);
490 if (!PyCell_Check(o)) {
491 return PyErr_Format(PyExc_TypeError,
492 "arg 5 (closure) expected cell, found %s",
493 o->ob_type->tp_name);
494 }
495 }
496 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code,
499 globals);
500 if (newfunc == NULL)
501 return NULL;
502
503 if (name != Py_None) {
504 Py_INCREF(name);
Serhiy Storchaka57a01d32016-04-10 18:05:40 +0300505 Py_SETREF(newfunc->func_name, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 }
507 if (defaults != Py_None) {
508 Py_INCREF(defaults);
509 newfunc->func_defaults = defaults;
510 }
511 if (closure != Py_None) {
512 Py_INCREF(closure);
513 newfunc->func_closure = closure;
514 }
515
516 return (PyObject *)newfunc;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000517}
518
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000519static void
Fred Drakeee238b92000-07-09 06:03:25 +0000520func_dealloc(PyFunctionObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000521{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 _PyObject_GC_UNTRACK(op);
523 if (op->func_weakreflist != NULL)
524 PyObject_ClearWeakRefs((PyObject *) op);
525 Py_DECREF(op->func_code);
526 Py_DECREF(op->func_globals);
527 Py_XDECREF(op->func_module);
528 Py_DECREF(op->func_name);
529 Py_XDECREF(op->func_defaults);
530 Py_XDECREF(op->func_kwdefaults);
531 Py_XDECREF(op->func_doc);
532 Py_XDECREF(op->func_dict);
533 Py_XDECREF(op->func_closure);
534 Py_XDECREF(op->func_annotations);
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100535 Py_XDECREF(op->func_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000537}
538
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539static PyObject*
Fred Drakeee238b92000-07-09 06:03:25 +0000540func_repr(PyFunctionObject *op)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000541{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 return PyUnicode_FromFormat("<function %U at %p>",
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100543 op->func_qualname, op);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000544}
545
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000546static int
Jeremy Hylton8caad492000-06-23 14:18:11 +0000547func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
548{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 Py_VISIT(f->func_code);
550 Py_VISIT(f->func_globals);
551 Py_VISIT(f->func_module);
552 Py_VISIT(f->func_defaults);
553 Py_VISIT(f->func_kwdefaults);
554 Py_VISIT(f->func_doc);
555 Py_VISIT(f->func_name);
556 Py_VISIT(f->func_dict);
557 Py_VISIT(f->func_closure);
558 Py_VISIT(f->func_annotations);
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100559 Py_VISIT(f->func_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000561}
562
Tim Peters6d6c1a32001-08-02 04:15:00 +0000563static PyObject *
Victor Stinner6f7c0ae2017-01-03 01:58:17 +0100564function_call(PyObject *func, PyObject *args, PyObject *kwargs)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000565{
Victor Stinner6f7c0ae2017-01-03 01:58:17 +0100566 PyObject **stack;
567 Py_ssize_t nargs;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000568
Victor Stinner6f7c0ae2017-01-03 01:58:17 +0100569 stack = &PyTuple_GET_ITEM(args, 0);
570 nargs = PyTuple_GET_SIZE(args);
571 return _PyFunction_FastCallDict(func, stack, nargs, kwargs);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000572}
573
574/* Bind a function to an object */
575static PyObject *
576func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
577{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 if (obj == Py_None || obj == NULL) {
579 Py_INCREF(func);
580 return func;
581 }
582 return PyMethod_New(func, obj);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000583}
584
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585PyTypeObject PyFunction_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 PyVarObject_HEAD_INIT(&PyType_Type, 0)
587 "function",
588 sizeof(PyFunctionObject),
589 0,
590 (destructor)func_dealloc, /* tp_dealloc */
591 0, /* tp_print */
592 0, /* tp_getattr */
593 0, /* tp_setattr */
594 0, /* tp_reserved */
595 (reprfunc)func_repr, /* tp_repr */
596 0, /* tp_as_number */
597 0, /* tp_as_sequence */
598 0, /* tp_as_mapping */
599 0, /* tp_hash */
600 function_call, /* tp_call */
601 0, /* tp_str */
Benjamin Peterson2cf936f2012-02-19 01:16:13 -0500602 0, /* tp_getattro */
603 0, /* tp_setattro */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 0, /* tp_as_buffer */
605 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
606 func_doc, /* tp_doc */
607 (traverseproc)func_traverse, /* tp_traverse */
608 0, /* tp_clear */
609 0, /* tp_richcompare */
610 offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */
611 0, /* tp_iter */
612 0, /* tp_iternext */
613 0, /* tp_methods */
614 func_memberlist, /* tp_members */
615 func_getsetlist, /* tp_getset */
616 0, /* tp_base */
617 0, /* tp_dict */
618 func_descr_get, /* tp_descr_get */
619 0, /* tp_descr_set */
620 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */
621 0, /* tp_init */
622 0, /* tp_alloc */
623 func_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000624};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000625
626
627/* Class method object */
628
629/* A class method receives the class as implicit first argument,
630 just like an instance method receives the instance.
631 To declare a class method, use this idiom:
632
633 class C:
Martin Panter6d57fe12016-09-17 03:26:16 +0000634 @classmethod
635 def f(cls, arg1, arg2, ...):
636 ...
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637
Tim Peters6d6c1a32001-08-02 04:15:00 +0000638 It can be called either on the class (e.g. C.f()) or on an instance
639 (e.g. C().f()); the instance is ignored except for its class.
640 If a class method is called for a derived class, the derived class
641 object is passed as the implied first argument.
642
643 Class methods are different than C++ or Java static methods.
644 If you want those, see static methods below.
645*/
646
647typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 PyObject_HEAD
649 PyObject *cm_callable;
Benjamin Peterson01d7eba2012-02-19 01:10:25 -0500650 PyObject *cm_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000651} classmethod;
652
653static void
654cm_dealloc(classmethod *cm)
655{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 _PyObject_GC_UNTRACK((PyObject *)cm);
657 Py_XDECREF(cm->cm_callable);
Benjamin Peterson01d7eba2012-02-19 01:10:25 -0500658 Py_XDECREF(cm->cm_dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 Py_TYPE(cm)->tp_free((PyObject *)cm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000660}
661
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000662static int
663cm_traverse(classmethod *cm, visitproc visit, void *arg)
664{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 Py_VISIT(cm->cm_callable);
Benjamin Peterson01d7eba2012-02-19 01:10:25 -0500666 Py_VISIT(cm->cm_dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 return 0;
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000668}
669
670static int
671cm_clear(classmethod *cm)
672{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 Py_CLEAR(cm->cm_callable);
Benjamin Peterson01d7eba2012-02-19 01:10:25 -0500674 Py_CLEAR(cm->cm_dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 return 0;
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000676}
677
678
Tim Peters6d6c1a32001-08-02 04:15:00 +0000679static PyObject *
680cm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
681{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 classmethod *cm = (classmethod *)self;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 if (cm->cm_callable == NULL) {
685 PyErr_SetString(PyExc_RuntimeError,
686 "uninitialized classmethod object");
687 return NULL;
688 }
689 if (type == NULL)
690 type = (PyObject *)(Py_TYPE(obj));
691 return PyMethod_New(cm->cm_callable, type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000692}
693
694static int
695cm_init(PyObject *self, PyObject *args, PyObject *kwds)
696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 classmethod *cm = (classmethod *)self;
698 PyObject *callable;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable))
701 return -1;
702 if (!_PyArg_NoKeywords("classmethod", kwds))
703 return -1;
704 Py_INCREF(callable);
705 cm->cm_callable = callable;
706 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000707}
708
Raymond Hettinger2bcde142009-05-29 04:52:27 +0000709static PyMemberDef cm_memberlist[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 {"__func__", T_OBJECT, offsetof(classmethod, cm_callable), READONLY},
711 {NULL} /* Sentinel */
Raymond Hettinger2bcde142009-05-29 04:52:27 +0000712};
713
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500714static PyObject *
715cm_get___isabstractmethod__(classmethod *cm, void *closure)
716{
717 int res = _PyObject_IsAbstract(cm->cm_callable);
718 if (res == -1) {
719 return NULL;
720 }
721 else if (res) {
722 Py_RETURN_TRUE;
723 }
724 Py_RETURN_FALSE;
725}
726
727static PyGetSetDef cm_getsetlist[] = {
728 {"__isabstractmethod__",
729 (getter)cm_get___isabstractmethod__, NULL,
730 NULL,
731 NULL},
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500732 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict, NULL, NULL},
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500733 {NULL} /* Sentinel */
734};
735
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000736PyDoc_STRVAR(classmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000737"classmethod(function) -> method\n\
738\n\
739Convert a function to be a class method.\n\
740\n\
741A class method receives the class as implicit first argument,\n\
742just like an instance method receives the instance.\n\
743To declare a class method, use this idiom:\n\
744\n\
745 class C:\n\
Martin Panter6d57fe12016-09-17 03:26:16 +0000746 @classmethod\n\
747 def f(cls, arg1, arg2, ...):\n\
748 ...\n\
Guido van Rossum33c1a882001-12-17 02:53:53 +0000749\n\
750It can be called either on the class (e.g. C.f()) or on an instance\n\
751(e.g. C().f()). The instance is ignored except for its class.\n\
752If a class method is called for a derived class, the derived class\n\
753object is passed as the implied first argument.\n\
Sjoerd Mullender564980b2001-12-17 11:39:56 +0000754\n\
Guido van Rossum33c1a882001-12-17 02:53:53 +0000755Class methods are different than C++ or Java static methods.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000756If you want those, see the staticmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000757
Tim Peters6d6c1a32001-08-02 04:15:00 +0000758PyTypeObject PyClassMethod_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 PyVarObject_HEAD_INIT(&PyType_Type, 0)
760 "classmethod",
761 sizeof(classmethod),
762 0,
763 (destructor)cm_dealloc, /* tp_dealloc */
764 0, /* tp_print */
765 0, /* tp_getattr */
766 0, /* tp_setattr */
767 0, /* tp_reserved */
768 0, /* tp_repr */
769 0, /* tp_as_number */
770 0, /* tp_as_sequence */
771 0, /* tp_as_mapping */
772 0, /* tp_hash */
773 0, /* tp_call */
774 0, /* tp_str */
Benjamin Peterson2cf936f2012-02-19 01:16:13 -0500775 0, /* tp_getattro */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 0, /* tp_setattro */
777 0, /* tp_as_buffer */
778 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
779 classmethod_doc, /* tp_doc */
780 (traverseproc)cm_traverse, /* tp_traverse */
781 (inquiry)cm_clear, /* tp_clear */
782 0, /* tp_richcompare */
783 0, /* tp_weaklistoffset */
784 0, /* tp_iter */
785 0, /* tp_iternext */
786 0, /* tp_methods */
787 cm_memberlist, /* tp_members */
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500788 cm_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 0, /* tp_base */
790 0, /* tp_dict */
791 cm_descr_get, /* tp_descr_get */
792 0, /* tp_descr_set */
Benjamin Peterson01d7eba2012-02-19 01:10:25 -0500793 offsetof(classmethod, cm_dict), /* tp_dictoffset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 cm_init, /* tp_init */
795 PyType_GenericAlloc, /* tp_alloc */
796 PyType_GenericNew, /* tp_new */
797 PyObject_GC_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000798};
799
800PyObject *
801PyClassMethod_New(PyObject *callable)
802{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 classmethod *cm = (classmethod *)
804 PyType_GenericAlloc(&PyClassMethod_Type, 0);
805 if (cm != NULL) {
806 Py_INCREF(callable);
807 cm->cm_callable = callable;
808 }
809 return (PyObject *)cm;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000810}
811
812
813/* Static method object */
814
815/* A static method does not receive an implicit first argument.
816 To declare a static method, use this idiom:
817
818 class C:
Martin Panter6d57fe12016-09-17 03:26:16 +0000819 @staticmethod
820 def f(arg1, arg2, ...):
821 ...
Tim Peters6d6c1a32001-08-02 04:15:00 +0000822
823 It can be called either on the class (e.g. C.f()) or on an instance
824 (e.g. C().f()); the instance is ignored except for its class.
825
826 Static methods in Python are similar to those found in Java or C++.
827 For a more advanced concept, see class methods above.
828*/
829
830typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 PyObject_HEAD
832 PyObject *sm_callable;
Benjamin Peterson01d7eba2012-02-19 01:10:25 -0500833 PyObject *sm_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000834} staticmethod;
835
836static void
837sm_dealloc(staticmethod *sm)
838{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 _PyObject_GC_UNTRACK((PyObject *)sm);
840 Py_XDECREF(sm->sm_callable);
Benjamin Peterson01d7eba2012-02-19 01:10:25 -0500841 Py_XDECREF(sm->sm_dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 Py_TYPE(sm)->tp_free((PyObject *)sm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000843}
844
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000845static int
846sm_traverse(staticmethod *sm, visitproc visit, void *arg)
847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 Py_VISIT(sm->sm_callable);
Benjamin Peterson01d7eba2012-02-19 01:10:25 -0500849 Py_VISIT(sm->sm_dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 return 0;
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000851}
852
853static int
854sm_clear(staticmethod *sm)
855{
Benjamin Peterson496c53d2012-02-19 01:11:56 -0500856 Py_CLEAR(sm->sm_callable);
Benjamin Peterson01d7eba2012-02-19 01:10:25 -0500857 Py_CLEAR(sm->sm_dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 return 0;
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000859}
860
Tim Peters6d6c1a32001-08-02 04:15:00 +0000861static PyObject *
862sm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
863{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 staticmethod *sm = (staticmethod *)self;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 if (sm->sm_callable == NULL) {
867 PyErr_SetString(PyExc_RuntimeError,
868 "uninitialized staticmethod object");
869 return NULL;
870 }
871 Py_INCREF(sm->sm_callable);
872 return sm->sm_callable;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000873}
874
875static int
876sm_init(PyObject *self, PyObject *args, PyObject *kwds)
877{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 staticmethod *sm = (staticmethod *)self;
879 PyObject *callable;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 if (!PyArg_UnpackTuple(args, "staticmethod", 1, 1, &callable))
882 return -1;
883 if (!_PyArg_NoKeywords("staticmethod", kwds))
884 return -1;
885 Py_INCREF(callable);
886 sm->sm_callable = callable;
887 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000888}
889
Raymond Hettinger2bcde142009-05-29 04:52:27 +0000890static PyMemberDef sm_memberlist[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 {"__func__", T_OBJECT, offsetof(staticmethod, sm_callable), READONLY},
892 {NULL} /* Sentinel */
Raymond Hettinger2bcde142009-05-29 04:52:27 +0000893};
894
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500895static PyObject *
896sm_get___isabstractmethod__(staticmethod *sm, void *closure)
897{
898 int res = _PyObject_IsAbstract(sm->sm_callable);
899 if (res == -1) {
900 return NULL;
901 }
902 else if (res) {
903 Py_RETURN_TRUE;
904 }
905 Py_RETURN_FALSE;
906}
907
908static PyGetSetDef sm_getsetlist[] = {
909 {"__isabstractmethod__",
910 (getter)sm_get___isabstractmethod__, NULL,
911 NULL,
912 NULL},
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500913 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict, NULL, NULL},
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500914 {NULL} /* Sentinel */
915};
916
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000917PyDoc_STRVAR(staticmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000918"staticmethod(function) -> method\n\
919\n\
920Convert a function to be a static method.\n\
921\n\
922A static method does not receive an implicit first argument.\n\
923To declare a static method, use this idiom:\n\
924\n\
925 class C:\n\
Martin Panter6d57fe12016-09-17 03:26:16 +0000926 @staticmethod\n\
927 def f(arg1, arg2, ...):\n\
928 ...\n\
Guido van Rossum33c1a882001-12-17 02:53:53 +0000929\n\
930It can be called either on the class (e.g. C.f()) or on an instance\n\
931(e.g. C().f()). The instance is ignored except for its class.\n\
932\n\
933Static methods in Python are similar to those found in Java or C++.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000934For a more advanced concept, see the classmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000935
Tim Peters6d6c1a32001-08-02 04:15:00 +0000936PyTypeObject PyStaticMethod_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 PyVarObject_HEAD_INIT(&PyType_Type, 0)
938 "staticmethod",
939 sizeof(staticmethod),
940 0,
941 (destructor)sm_dealloc, /* tp_dealloc */
942 0, /* tp_print */
943 0, /* tp_getattr */
944 0, /* tp_setattr */
945 0, /* tp_reserved */
946 0, /* tp_repr */
947 0, /* tp_as_number */
948 0, /* tp_as_sequence */
949 0, /* tp_as_mapping */
950 0, /* tp_hash */
951 0, /* tp_call */
952 0, /* tp_str */
Benjamin Peterson01d7eba2012-02-19 01:10:25 -0500953 0, /* tp_getattro */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 0, /* tp_setattro */
955 0, /* tp_as_buffer */
956 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
957 staticmethod_doc, /* tp_doc */
958 (traverseproc)sm_traverse, /* tp_traverse */
959 (inquiry)sm_clear, /* tp_clear */
960 0, /* tp_richcompare */
961 0, /* tp_weaklistoffset */
962 0, /* tp_iter */
963 0, /* tp_iternext */
964 0, /* tp_methods */
965 sm_memberlist, /* tp_members */
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500966 sm_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 0, /* tp_base */
968 0, /* tp_dict */
969 sm_descr_get, /* tp_descr_get */
970 0, /* tp_descr_set */
Benjamin Peterson01d7eba2012-02-19 01:10:25 -0500971 offsetof(staticmethod, sm_dict), /* tp_dictoffset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 sm_init, /* tp_init */
973 PyType_GenericAlloc, /* tp_alloc */
974 PyType_GenericNew, /* tp_new */
975 PyObject_GC_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000976};
977
978PyObject *
979PyStaticMethod_New(PyObject *callable)
980{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 staticmethod *sm = (staticmethod *)
982 PyType_GenericAlloc(&PyStaticMethod_Type, 0);
983 if (sm != NULL) {
984 Py_INCREF(callable);
985 sm->sm_callable = callable;
986 }
987 return (PyObject *)sm;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000988}