blob: 1456810057ada17a948bbe901def2f49a823bbdf [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"
Tim Peters6d6c1a32001-08-02 04:15:00 +00006#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00007#include "structmember.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00008
Guido van Rossumc0b618a1997-05-02 03:12:38 +00009PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000010PyFunction_New(PyObject *code, PyObject *globals)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011{
Neil Schemenauere83c00e2001-08-29 23:54:21 +000012 PyFunctionObject *op = PyObject_GC_New(PyFunctionObject,
Guido van Rossumc0b618a1997-05-02 03:12:38 +000013 &PyFunction_Type);
Martin v. Löwis321c9ab2004-03-23 18:40:15 +000014 static PyObject *__name__ = 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000015 if (op != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000016 PyObject *doc;
17 PyObject *consts;
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +000018 PyObject *module;
Fred Drakedb81e8d2001-03-23 04:19:27 +000019 op->func_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000020 Py_INCREF(code);
Guido van Rossum846e4311990-11-18 17:44:06 +000021 op->func_code = code;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000022 Py_INCREF(globals);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000023 op->func_globals = globals;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000024 op->func_name = ((PyCodeObject *)code)->co_name;
25 Py_INCREF(op->func_name);
Guido van Rossum2271bf71995-07-18 14:30:34 +000026 op->func_defaults = NULL; /* No default arguments */
Guido van Rossum4f72a782006-10-27 23:31:49 +000027 op->func_kwdefaults = NULL; /* No keyword only defaults */
Jeremy Hylton64949cb2001-01-25 20:06:59 +000028 op->func_closure = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000029 consts = ((PyCodeObject *)code)->co_consts;
30 if (PyTuple_Size(consts) >= 1) {
31 doc = PyTuple_GetItem(consts, 0);
Neal Norwitz7e95bef2007-08-26 03:56:04 +000032 if (!PyUnicode_Check(doc))
Guido van Rossumc0b618a1997-05-02 03:12:38 +000033 doc = Py_None;
Guido van Rossum5bd38051995-01-07 12:01:30 +000034 }
35 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000036 doc = Py_None;
37 Py_INCREF(doc);
Guido van Rossum5bd38051995-01-07 12:01:30 +000038 op->func_doc = doc;
Barry Warsawd6a9e842001-01-15 20:40:19 +000039 op->func_dict = NULL;
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +000040 op->func_module = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +000041 op->func_annotations = NULL;
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +000042
43 /* __module__: If module name is in globals, use it.
44 Otherwise, use None.
45 */
Martin v. Löwis321c9ab2004-03-23 18:40:15 +000046 if (!__name__) {
Neal Norwitz7e95bef2007-08-26 03:56:04 +000047 __name__ = PyUnicode_InternFromString("__name__");
Martin v. Löwis321c9ab2004-03-23 18:40:15 +000048 if (!__name__) {
49 Py_DECREF(op);
50 return NULL;
51 }
52 }
53 module = PyDict_GetItem(globals, __name__);
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +000054 if (module) {
55 Py_INCREF(module);
56 op->func_module = module;
57 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058 }
Barry Warsawd6a9e842001-01-15 20:40:19 +000059 else
60 return NULL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +000061 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062 return (PyObject *)op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063}
64
Guido van Rossumc0b618a1997-05-02 03:12:38 +000065PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000066PyFunction_GetCode(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000068 if (!PyFunction_Check(op)) {
69 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070 return NULL;
71 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000072 return ((PyFunctionObject *) op) -> func_code;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073}
74
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000076PyFunction_GetGlobals(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000077{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000078 if (!PyFunction_Check(op)) {
79 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000080 return NULL;
81 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000082 return ((PyFunctionObject *) op) -> func_globals;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000083}
84
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085PyObject *
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +000086PyFunction_GetModule(PyObject *op)
87{
88 if (!PyFunction_Check(op)) {
89 PyErr_BadInternalCall();
90 return NULL;
91 }
92 return ((PyFunctionObject *) op) -> func_module;
93}
94
95PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000096PyFunction_GetDefaults(PyObject *op)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000097{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000098 if (!PyFunction_Check(op)) {
99 PyErr_BadInternalCall();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000100 return NULL;
101 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102 return ((PyFunctionObject *) op) -> func_defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000103}
104
105int
Fred Drakeee238b92000-07-09 06:03:25 +0000106PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000107{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000108 if (!PyFunction_Check(op)) {
109 PyErr_BadInternalCall();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000110 return -1;
111 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112 if (defaults == Py_None)
Guido van Rossum2271bf71995-07-18 14:30:34 +0000113 defaults = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000114 else if (defaults && PyTuple_Check(defaults)) {
115 Py_INCREF(defaults);
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000116 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000117 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118 PyErr_SetString(PyExc_SystemError, "non-tuple default args");
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000119 return -1;
120 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 Py_XDECREF(((PyFunctionObject *) op) -> func_defaults);
122 ((PyFunctionObject *) op) -> func_defaults = defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000123 return 0;
124}
125
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000126PyObject *
Guido van Rossum4f72a782006-10-27 23:31:49 +0000127PyFunction_GetKwDefaults(PyObject *op)
128{
129 if (!PyFunction_Check(op)) {
130 PyErr_BadInternalCall();
131 return NULL;
132 }
133 return ((PyFunctionObject *) op) -> func_kwdefaults;
134}
135
136int
137PyFunction_SetKwDefaults(PyObject *op, PyObject *defaults)
138{
139 if (!PyFunction_Check(op)) {
140 PyErr_BadInternalCall();
141 return -1;
142 }
143 if (defaults == Py_None)
144 defaults = NULL;
145 else if (defaults && PyDict_Check(defaults)) {
146 Py_INCREF(defaults);
147 }
148 else {
149 PyErr_SetString(PyExc_SystemError,
150 "non-dict keyword only default args");
151 return -1;
152 }
153 Py_XDECREF(((PyFunctionObject *)op) -> func_kwdefaults);
154 ((PyFunctionObject *) op) -> func_kwdefaults = defaults;
155 return 0;
156}
157
158PyObject *
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000159PyFunction_GetClosure(PyObject *op)
160{
161 if (!PyFunction_Check(op)) {
162 PyErr_BadInternalCall();
163 return NULL;
164 }
165 return ((PyFunctionObject *) op) -> func_closure;
166}
167
168int
169PyFunction_SetClosure(PyObject *op, PyObject *closure)
170{
171 if (!PyFunction_Check(op)) {
172 PyErr_BadInternalCall();
173 return -1;
174 }
175 if (closure == Py_None)
176 closure = NULL;
177 else if (PyTuple_Check(closure)) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000178 Py_INCREF(closure);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000179 }
180 else {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000181 PyErr_Format(PyExc_SystemError,
182 "expected tuple for closure, got '%.100s'",
183 closure->ob_type->tp_name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000184 return -1;
185 }
186 Py_XDECREF(((PyFunctionObject *) op) -> func_closure);
187 ((PyFunctionObject *) op) -> func_closure = closure;
188 return 0;
189}
190
Neal Norwitzc1505362006-12-28 06:47:50 +0000191PyObject *
192PyFunction_GetAnnotations(PyObject *op)
193{
194 if (!PyFunction_Check(op)) {
195 PyErr_BadInternalCall();
196 return NULL;
197 }
198 return ((PyFunctionObject *) op) -> func_annotations;
199}
200
201int
202PyFunction_SetAnnotations(PyObject *op, PyObject *annotations)
203{
204 if (!PyFunction_Check(op)) {
205 PyErr_BadInternalCall();
206 return -1;
207 }
208 if (annotations == Py_None)
209 annotations = NULL;
210 else if (annotations && PyDict_Check(annotations)) {
211 Py_INCREF(annotations);
212 }
213 else {
214 PyErr_SetString(PyExc_SystemError,
215 "non-dict annotations");
216 return -1;
217 }
218 Py_XDECREF(((PyFunctionObject *)op) -> func_annotations);
219 ((PyFunctionObject *) op) -> func_annotations = annotations;
220 return 0;
221}
222
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223/* Methods */
224
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225#define OFF(x) offsetof(PyFunctionObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000226
Guido van Rossum6f799372001-09-20 20:46:19 +0000227static PyMemberDef func_memberlist[] = {
Neal Norwitz221085d2007-02-25 20:55:47 +0000228 {"__closure__", T_OBJECT, OFF(func_closure),
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000229 RESTRICTED|READONLY},
Christian Heimesbce52be2007-11-17 19:08:41 +0000230 {"__doc__", T_OBJECT, OFF(func_doc), PY_WRITE_RESTRICTED},
Neal Norwitz221085d2007-02-25 20:55:47 +0000231 {"__globals__", T_OBJECT, OFF(func_globals),
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000232 RESTRICTED|READONLY},
Christian Heimesbce52be2007-11-17 19:08:41 +0000233 {"__module__", T_OBJECT, OFF(func_module), PY_WRITE_RESTRICTED},
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000234 {NULL} /* Sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000235};
236
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000237static PyObject *
238func_get_dict(PyFunctionObject *op)
239{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000240 if (op->func_dict == NULL) {
241 op->func_dict = PyDict_New();
242 if (op->func_dict == NULL)
Barry Warsaw142865c2001-08-14 18:23:58 +0000243 return NULL;
244 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000245 Py_INCREF(op->func_dict);
246 return op->func_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000247}
248
Guido van Rossum0dabace1998-05-22 00:55:34 +0000249static int
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000250func_set_dict(PyFunctionObject *op, PyObject *value)
Guido van Rossum0dabace1998-05-22 00:55:34 +0000251{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000252 PyObject *tmp;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000253
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000254 /* It is illegal to del f.func_dict */
255 if (value == NULL) {
256 PyErr_SetString(PyExc_TypeError,
257 "function's dictionary may not be deleted");
Guido van Rossum0dabace1998-05-22 00:55:34 +0000258 return -1;
259 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000260 /* Can only set func_dict to a dictionary */
261 if (!PyDict_Check(value)) {
262 PyErr_SetString(PyExc_TypeError,
Barry Warsaw142865c2001-08-14 18:23:58 +0000263 "setting function's dictionary to a non-dict");
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000264 return -1;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000265 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000266 tmp = op->func_dict;
267 Py_INCREF(value);
268 op->func_dict = value;
269 Py_XDECREF(tmp);
270 return 0;
Guido van Rossum0dabace1998-05-22 00:55:34 +0000271}
272
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000273static PyObject *
274func_get_code(PyFunctionObject *op)
275{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000276 Py_INCREF(op->func_code);
277 return op->func_code;
278}
279
280static int
281func_set_code(PyFunctionObject *op, PyObject *value)
282{
283 PyObject *tmp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000284 Py_ssize_t nfree, nclosure;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000285
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000286 /* Not legal to del f.func_code or to set it to anything
287 * other than a code object. */
288 if (value == NULL || !PyCode_Check(value)) {
289 PyErr_SetString(PyExc_TypeError,
Neal Norwitz221085d2007-02-25 20:55:47 +0000290 "__code__ must be set to a code object");
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000291 return -1;
292 }
Armin Rigo89a39462004-10-28 16:32:00 +0000293 nfree = PyCode_GetNumFree((PyCodeObject *)value);
294 nclosure = (op->func_closure == NULL ? 0 :
295 PyTuple_GET_SIZE(op->func_closure));
296 if (nclosure != nfree) {
297 PyErr_Format(PyExc_ValueError,
Martin v. Löwis2c95cc62006-02-16 06:54:25 +0000298 "%s() requires a code object with %zd free vars,"
299 " not %zd",
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +0000300 _PyUnicode_AsString(op->func_name),
Martin v. Löwise0e89f72006-02-16 06:59:22 +0000301 nclosure, nfree);
Armin Rigo89a39462004-10-28 16:32:00 +0000302 return -1;
303 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000304 tmp = op->func_code;
305 Py_INCREF(value);
306 op->func_code = value;
307 Py_DECREF(tmp);
308 return 0;
309}
310
311static PyObject *
Michael W. Hudson5e897952004-08-12 18:12:44 +0000312func_get_name(PyFunctionObject *op)
313{
Michael W. Hudson5e897952004-08-12 18:12:44 +0000314 Py_INCREF(op->func_name);
315 return op->func_name;
316}
317
318static int
319func_set_name(PyFunctionObject *op, PyObject *value)
320{
321 PyObject *tmp;
322
Michael W. Hudson5e897952004-08-12 18:12:44 +0000323 /* Not legal to del f.func_name or to set it to anything
324 * other than a string object. */
Neal Norwitz7e95bef2007-08-26 03:56:04 +0000325 if (value == NULL || !PyUnicode_Check(value)) {
Michael W. Hudson5e897952004-08-12 18:12:44 +0000326 PyErr_SetString(PyExc_TypeError,
Neal Norwitz221085d2007-02-25 20:55:47 +0000327 "__name__ must be set to a string object");
Michael W. Hudson5e897952004-08-12 18:12:44 +0000328 return -1;
329 }
330 tmp = op->func_name;
331 Py_INCREF(value);
332 op->func_name = value;
333 Py_DECREF(tmp);
334 return 0;
335}
336
337static PyObject *
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000338func_get_defaults(PyFunctionObject *op)
339{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000340 if (op->func_defaults == NULL) {
341 Py_INCREF(Py_None);
342 return Py_None;
343 }
344 Py_INCREF(op->func_defaults);
345 return op->func_defaults;
346}
347
348static int
349func_set_defaults(PyFunctionObject *op, PyObject *value)
350{
351 PyObject *tmp;
352
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000353 /* Legal to del f.func_defaults.
354 * Can only set func_defaults to NULL or a tuple. */
355 if (value == Py_None)
356 value = NULL;
357 if (value != NULL && !PyTuple_Check(value)) {
358 PyErr_SetString(PyExc_TypeError,
Neal Norwitz221085d2007-02-25 20:55:47 +0000359 "__defaults__ must be set to a tuple object");
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000360 return -1;
361 }
362 tmp = op->func_defaults;
363 Py_XINCREF(value);
364 op->func_defaults = value;
365 Py_XDECREF(tmp);
366 return 0;
367}
368
Guido van Rossum4f72a782006-10-27 23:31:49 +0000369static PyObject *
370func_get_kwdefaults(PyFunctionObject *op)
371{
Guido van Rossum4f72a782006-10-27 23:31:49 +0000372 if (op->func_kwdefaults == NULL) {
373 Py_INCREF(Py_None);
374 return Py_None;
375 }
376 Py_INCREF(op->func_kwdefaults);
377 return op->func_kwdefaults;
378}
379
380static int
381func_set_kwdefaults(PyFunctionObject *op, PyObject *value)
382{
383 PyObject *tmp;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000384
385 if (value == Py_None)
386 value = NULL;
Georg Brandl80b331c2007-02-26 12:28:57 +0000387 /* Legal to del f.func_kwdefaults.
Guido van Rossum4f72a782006-10-27 23:31:49 +0000388 * Can only set func_kwdefaults to NULL or a dict. */
389 if (value != NULL && !PyDict_Check(value)) {
390 PyErr_SetString(PyExc_TypeError,
Neal Norwitz221085d2007-02-25 20:55:47 +0000391 "__kwdefaults__ must be set to a dict object");
Guido van Rossum4f72a782006-10-27 23:31:49 +0000392 return -1;
393 }
394 tmp = op->func_kwdefaults;
395 Py_XINCREF(value);
396 op->func_kwdefaults = value;
397 Py_XDECREF(tmp);
398 return 0;
399}
400
Neal Norwitzc1505362006-12-28 06:47:50 +0000401static PyObject *
402func_get_annotations(PyFunctionObject *op)
403{
404 if (op->func_annotations == NULL) {
405 op->func_annotations = PyDict_New();
406 if (op->func_annotations == NULL)
407 return NULL;
408 }
409 Py_INCREF(op->func_annotations);
410 return op->func_annotations;
411}
412
413static int
414func_set_annotations(PyFunctionObject *op, PyObject *value)
415{
416 PyObject *tmp;
417
418 if (value == Py_None)
419 value = NULL;
420 /* Legal to del f.func_annotations.
421 * Can only set func_annotations to NULL (through C api)
422 * or a dict. */
423 if (value != NULL && !PyDict_Check(value)) {
424 PyErr_SetString(PyExc_TypeError,
Neal Norwitz221085d2007-02-25 20:55:47 +0000425 "__annotations__ must be set to a dict object");
Neal Norwitzc1505362006-12-28 06:47:50 +0000426 return -1;
427 }
428 tmp = op->func_annotations;
429 Py_XINCREF(value);
430 op->func_annotations = value;
431 Py_XDECREF(tmp);
432 return 0;
433}
434
Guido van Rossum32d34c82001-09-20 21:45:26 +0000435static PyGetSetDef func_getsetlist[] = {
Neal Norwitz221085d2007-02-25 20:55:47 +0000436 {"__code__", (getter)func_get_code, (setter)func_set_code},
437 {"__defaults__", (getter)func_get_defaults,
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000438 (setter)func_set_defaults},
Neal Norwitz221085d2007-02-25 20:55:47 +0000439 {"__kwdefaults__", (getter)func_get_kwdefaults,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000440 (setter)func_set_kwdefaults},
Neal Norwitz221085d2007-02-25 20:55:47 +0000441 {"__annotations__", (getter)func_get_annotations,
Neal Norwitzc1505362006-12-28 06:47:50 +0000442 (setter)func_set_annotations},
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000443 {"__dict__", (getter)func_get_dict, (setter)func_set_dict},
Michael W. Hudson5e897952004-08-12 18:12:44 +0000444 {"__name__", (getter)func_get_name, (setter)func_set_name},
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000445 {NULL} /* Sentinel */
446};
447
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000448PyDoc_STRVAR(func_doc,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000449"function(code, globals[, name[, argdefs[, closure]]])\n\
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000450\n\
451Create a function object from a code object and a dictionary.\n\
452The optional name string overrides the name from the code object.\n\
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000453The optional argdefs tuple specifies the default argument values.\n\
454The optional closure tuple supplies the bindings for free variables.");
455
456/* func_new() maintains the following invariants for closures. The
457 closure must correspond to the free variables of the code object.
458
459 if len(code.co_freevars) == 0:
460 closure = NULL
461 else:
462 len(closure) == len(code.co_freevars)
463 for every elt in closure, type(elt) == cell
464*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000465
466static PyObject *
467func_new(PyTypeObject* type, PyObject* args, PyObject* kw)
468{
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000469 PyCodeObject *code;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000470 PyObject *globals;
471 PyObject *name = Py_None;
472 PyObject *defaults = Py_None;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000473 PyObject *closure = Py_None;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000474 PyFunctionObject *newfunc;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000475 Py_ssize_t nfree, nclosure;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000476 static char *kwlist[] = {"code", "globals", "name",
Raymond Hettinger86578452003-05-06 09:01:41 +0000477 "argdefs", "closure", 0};
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000478
Raymond Hettinger86578452003-05-06 09:01:41 +0000479 if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!|OOO:function",
480 kwlist,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000481 &PyCode_Type, &code,
482 &PyDict_Type, &globals,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000483 &name, &defaults, &closure))
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000484 return NULL;
Neal Norwitz7e95bef2007-08-26 03:56:04 +0000485 if (name != Py_None && !PyUnicode_Check(name)) {
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000486 PyErr_SetString(PyExc_TypeError,
487 "arg 3 (name) must be None or string");
488 return NULL;
489 }
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000490 if (defaults != Py_None && !PyTuple_Check(defaults)) {
491 PyErr_SetString(PyExc_TypeError,
492 "arg 4 (defaults) must be None or tuple");
493 return NULL;
494 }
495 nfree = PyTuple_GET_SIZE(code->co_freevars);
496 if (!PyTuple_Check(closure)) {
497 if (nfree && closure == Py_None) {
498 PyErr_SetString(PyExc_TypeError,
499 "arg 5 (closure) must be tuple");
500 return NULL;
501 }
502 else if (closure != Py_None) {
503 PyErr_SetString(PyExc_TypeError,
504 "arg 5 (closure) must be None or tuple");
505 return NULL;
506 }
507 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000508
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000509 /* check that the closure is well-formed */
510 nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure);
511 if (nfree != nclosure)
512 return PyErr_Format(PyExc_ValueError,
Walter Dörwalda29d1d72007-06-11 15:00:18 +0000513 "%U requires closure of length %zd, not %zd",
514 code->co_name, nfree, nclosure);
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000515 if (nclosure) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000516 Py_ssize_t i;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000517 for (i = 0; i < nclosure; i++) {
518 PyObject *o = PyTuple_GET_ITEM(closure, i);
519 if (!PyCell_Check(o)) {
520 return PyErr_Format(PyExc_TypeError,
521 "arg 5 (closure) expected cell, found %s",
522 o->ob_type->tp_name);
523 }
524 }
525 }
526
527 newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code,
528 globals);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000529 if (newfunc == NULL)
530 return NULL;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000531
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000532 if (name != Py_None) {
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000533 Py_INCREF(name);
534 Py_DECREF(newfunc->func_name);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000535 newfunc->func_name = name;
536 }
537 if (defaults != Py_None) {
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000538 Py_INCREF(defaults);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000539 newfunc->func_defaults = defaults;
540 }
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000541 if (closure != Py_None) {
542 Py_INCREF(closure);
543 newfunc->func_closure = closure;
544 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000545
546 return (PyObject *)newfunc;
547}
548
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000549static void
Fred Drakeee238b92000-07-09 06:03:25 +0000550func_dealloc(PyFunctionObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000551{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000552 _PyObject_GC_UNTRACK(op);
Fred Drakec916f5a2001-10-26 17:56:51 +0000553 if (op->func_weakreflist != NULL)
554 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 Py_DECREF(op->func_code);
556 Py_DECREF(op->func_globals);
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000557 Py_XDECREF(op->func_module);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558 Py_DECREF(op->func_name);
559 Py_XDECREF(op->func_defaults);
Georg Brandl80b331c2007-02-26 12:28:57 +0000560 Py_XDECREF(op->func_kwdefaults);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561 Py_XDECREF(op->func_doc);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000562 Py_XDECREF(op->func_dict);
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000563 Py_XDECREF(op->func_closure);
Neal Norwitzc1505362006-12-28 06:47:50 +0000564 Py_XDECREF(op->func_annotations);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000565 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000566}
567
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568static PyObject*
Fred Drakeee238b92000-07-09 06:03:25 +0000569func_repr(PyFunctionObject *op)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000570{
Neal Norwitz7e95bef2007-08-26 03:56:04 +0000571 return PyUnicode_FromFormat("<function %U at %p>",
572 op->func_name, op);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000573}
574
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000575static int
Jeremy Hylton8caad492000-06-23 14:18:11 +0000576func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
577{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000578 Py_VISIT(f->func_code);
579 Py_VISIT(f->func_globals);
580 Py_VISIT(f->func_module);
581 Py_VISIT(f->func_defaults);
Georg Brandl80b331c2007-02-26 12:28:57 +0000582 Py_VISIT(f->func_kwdefaults);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000583 Py_VISIT(f->func_doc);
584 Py_VISIT(f->func_name);
585 Py_VISIT(f->func_dict);
586 Py_VISIT(f->func_closure);
Neal Norwitzc1505362006-12-28 06:47:50 +0000587 Py_VISIT(f->func_annotations);
Jeremy Hylton8caad492000-06-23 14:18:11 +0000588 return 0;
589}
590
Tim Peters6d6c1a32001-08-02 04:15:00 +0000591static PyObject *
592function_call(PyObject *func, PyObject *arg, PyObject *kw)
593{
594 PyObject *result;
595 PyObject *argdefs;
Benjamin Peterson0289b152009-06-28 17:22:03 +0000596 PyObject *kwtuple = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000597 PyObject **d, **k;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000598 Py_ssize_t nk, nd;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000599
600 argdefs = PyFunction_GET_DEFAULTS(func);
601 if (argdefs != NULL && PyTuple_Check(argdefs)) {
602 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
Benjamin Peterson0289b152009-06-28 17:22:03 +0000603 nd = PyTuple_GET_SIZE(argdefs);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000604 }
605 else {
606 d = NULL;
607 nd = 0;
608 }
609
610 if (kw != NULL && PyDict_Check(kw)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000611 Py_ssize_t pos, i;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000612 nk = PyDict_Size(kw);
Benjamin Peterson0289b152009-06-28 17:22:03 +0000613 kwtuple = PyTuple_New(2*nk);
614 if (kwtuple == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000615 return NULL;
Benjamin Peterson0289b152009-06-28 17:22:03 +0000616 k = &PyTuple_GET_ITEM(kwtuple, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000617 pos = i = 0;
Benjamin Peterson0289b152009-06-28 17:22:03 +0000618 while (PyDict_Next(kw, &pos, &k[i], &k[i+1])) {
619 Py_INCREF(k[i]);
620 Py_INCREF(k[i+1]);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000621 i += 2;
Benjamin Peterson0289b152009-06-28 17:22:03 +0000622 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000623 nk = i/2;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000624 }
625 else {
626 k = NULL;
627 nk = 0;
628 }
629
630 result = PyEval_EvalCodeEx(
631 (PyCodeObject *)PyFunction_GET_CODE(func),
632 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Benjamin Peterson0289b152009-06-28 17:22:03 +0000633 &PyTuple_GET_ITEM(arg, 0), PyTuple_GET_SIZE(arg),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000634 k, nk, d, nd,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000635 PyFunction_GET_KW_DEFAULTS(func),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000636 PyFunction_GET_CLOSURE(func));
637
Benjamin Peterson0289b152009-06-28 17:22:03 +0000638 Py_XDECREF(kwtuple);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000639
640 return result;
641}
642
643/* Bind a function to an object */
644static PyObject *
645func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
646{
Christian Heimes4a22b5d2007-11-25 09:39:14 +0000647 if (obj == Py_None || obj == NULL) {
648 Py_INCREF(func);
649 return func;
650 }
Christian Heimesff737952007-11-27 10:40:20 +0000651 return PyMethod_New(func, obj);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000652}
653
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654PyTypeObject PyFunction_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000655 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000656 "function",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000657 sizeof(PyFunctionObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000658 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +0000659 (destructor)func_dealloc, /* tp_dealloc */
660 0, /* tp_print */
661 0, /* tp_getattr */
662 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000663 0, /* tp_reserved */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000664 (reprfunc)func_repr, /* tp_repr */
665 0, /* tp_as_number */
666 0, /* tp_as_sequence */
667 0, /* tp_as_mapping */
668 0, /* tp_hash */
669 function_call, /* tp_call */
670 0, /* tp_str */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000671 PyObject_GenericGetAttr, /* tp_getattro */
672 PyObject_GenericSetAttr, /* tp_setattro */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000673 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000674 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000675 func_doc, /* tp_doc */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000676 (traverseproc)func_traverse, /* tp_traverse */
677 0, /* tp_clear */
678 0, /* tp_richcompare */
Fred Drakedb81e8d2001-03-23 04:19:27 +0000679 offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000680 0, /* tp_iter */
681 0, /* tp_iternext */
682 0, /* tp_methods */
683 func_memberlist, /* tp_members */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000684 func_getsetlist, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000685 0, /* tp_base */
686 0, /* tp_dict */
687 func_descr_get, /* tp_descr_get */
688 0, /* tp_descr_set */
689 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000690 0, /* tp_init */
691 0, /* tp_alloc */
692 func_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000693};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000694
695
696/* Class method object */
697
698/* A class method receives the class as implicit first argument,
699 just like an instance method receives the instance.
700 To declare a class method, use this idiom:
701
702 class C:
703 def f(cls, arg1, arg2, ...): ...
704 f = classmethod(f)
705
706 It can be called either on the class (e.g. C.f()) or on an instance
707 (e.g. C().f()); the instance is ignored except for its class.
708 If a class method is called for a derived class, the derived class
709 object is passed as the implied first argument.
710
711 Class methods are different than C++ or Java static methods.
712 If you want those, see static methods below.
713*/
714
715typedef struct {
716 PyObject_HEAD
717 PyObject *cm_callable;
718} classmethod;
719
720static void
721cm_dealloc(classmethod *cm)
722{
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000723 _PyObject_GC_UNTRACK((PyObject *)cm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000724 Py_XDECREF(cm->cm_callable);
Christian Heimes90aa7642007-12-19 02:45:37 +0000725 Py_TYPE(cm)->tp_free((PyObject *)cm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000726}
727
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000728static int
729cm_traverse(classmethod *cm, visitproc visit, void *arg)
730{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000731 Py_VISIT(cm->cm_callable);
732 return 0;
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000733}
734
735static int
736cm_clear(classmethod *cm)
737{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000738 Py_CLEAR(cm->cm_callable);
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000739 return 0;
740}
741
742
Tim Peters6d6c1a32001-08-02 04:15:00 +0000743static PyObject *
744cm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
745{
746 classmethod *cm = (classmethod *)self;
747
748 if (cm->cm_callable == NULL) {
749 PyErr_SetString(PyExc_RuntimeError,
750 "uninitialized classmethod object");
751 return NULL;
752 }
Guido van Rossum7e305482002-03-18 03:09:06 +0000753 if (type == NULL)
Christian Heimes90aa7642007-12-19 02:45:37 +0000754 type = (PyObject *)(Py_TYPE(obj));
Christian Heimesff737952007-11-27 10:40:20 +0000755 return PyMethod_New(cm->cm_callable, type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000756}
757
758static int
759cm_init(PyObject *self, PyObject *args, PyObject *kwds)
760{
761 classmethod *cm = (classmethod *)self;
762 PyObject *callable;
763
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000764 if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000765 return -1;
Georg Brandld02db402006-02-21 22:13:44 +0000766 if (!_PyArg_NoKeywords("classmethod", kwds))
767 return -1;
Raymond Hettingerbe971532003-06-18 01:13:41 +0000768 if (!PyCallable_Check(callable)) {
769 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
770 callable->ob_type->tp_name);
771 return -1;
772 }
773
Tim Peters6d6c1a32001-08-02 04:15:00 +0000774 Py_INCREF(callable);
775 cm->cm_callable = callable;
776 return 0;
777}
778
Raymond Hettinger2bcde142009-05-29 04:52:27 +0000779static PyMemberDef cm_memberlist[] = {
780 {"__func__", T_OBJECT, offsetof(classmethod, cm_callable), READONLY},
781 {NULL} /* Sentinel */
782};
783
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000784PyDoc_STRVAR(classmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000785"classmethod(function) -> method\n\
786\n\
787Convert a function to be a class method.\n\
788\n\
789A class method receives the class as implicit first argument,\n\
790just like an instance method receives the instance.\n\
791To declare a class method, use this idiom:\n\
792\n\
793 class C:\n\
794 def f(cls, arg1, arg2, ...): ...\n\
795 f = classmethod(f)\n\
796\n\
797It can be called either on the class (e.g. C.f()) or on an instance\n\
798(e.g. C().f()). The instance is ignored except for its class.\n\
799If a class method is called for a derived class, the derived class\n\
800object is passed as the implied first argument.\n\
Sjoerd Mullender564980b2001-12-17 11:39:56 +0000801\n\
Guido van Rossum33c1a882001-12-17 02:53:53 +0000802Class methods are different than C++ or Java static methods.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000803If you want those, see the staticmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000804
Tim Peters6d6c1a32001-08-02 04:15:00 +0000805PyTypeObject PyClassMethod_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000806 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000807 "classmethod",
808 sizeof(classmethod),
809 0,
810 (destructor)cm_dealloc, /* tp_dealloc */
811 0, /* tp_print */
812 0, /* tp_getattr */
813 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000814 0, /* tp_reserved */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000815 0, /* tp_repr */
816 0, /* tp_as_number */
817 0, /* tp_as_sequence */
818 0, /* tp_as_mapping */
819 0, /* tp_hash */
820 0, /* tp_call */
821 0, /* tp_str */
822 PyObject_GenericGetAttr, /* tp_getattro */
823 0, /* tp_setattro */
824 0, /* tp_as_buffer */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000825 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000826 classmethod_doc, /* tp_doc */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000827 (traverseproc)cm_traverse, /* tp_traverse */
828 (inquiry)cm_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000829 0, /* tp_richcompare */
830 0, /* tp_weaklistoffset */
831 0, /* tp_iter */
832 0, /* tp_iternext */
833 0, /* tp_methods */
Raymond Hettinger2bcde142009-05-29 04:52:27 +0000834 cm_memberlist, /* tp_members */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000835 0, /* tp_getset */
836 0, /* tp_base */
837 0, /* tp_dict */
838 cm_descr_get, /* tp_descr_get */
839 0, /* tp_descr_set */
840 0, /* tp_dictoffset */
841 cm_init, /* tp_init */
842 PyType_GenericAlloc, /* tp_alloc */
843 PyType_GenericNew, /* tp_new */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000844 PyObject_GC_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000845};
846
847PyObject *
848PyClassMethod_New(PyObject *callable)
849{
850 classmethod *cm = (classmethod *)
851 PyType_GenericAlloc(&PyClassMethod_Type, 0);
852 if (cm != NULL) {
853 Py_INCREF(callable);
854 cm->cm_callable = callable;
855 }
856 return (PyObject *)cm;
857}
858
859
860/* Static method object */
861
862/* A static method does not receive an implicit first argument.
863 To declare a static method, use this idiom:
864
865 class C:
866 def f(arg1, arg2, ...): ...
867 f = staticmethod(f)
868
869 It can be called either on the class (e.g. C.f()) or on an instance
870 (e.g. C().f()); the instance is ignored except for its class.
871
872 Static methods in Python are similar to those found in Java or C++.
873 For a more advanced concept, see class methods above.
874*/
875
876typedef struct {
877 PyObject_HEAD
878 PyObject *sm_callable;
879} staticmethod;
880
881static void
882sm_dealloc(staticmethod *sm)
883{
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000884 _PyObject_GC_UNTRACK((PyObject *)sm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000885 Py_XDECREF(sm->sm_callable);
Christian Heimes90aa7642007-12-19 02:45:37 +0000886 Py_TYPE(sm)->tp_free((PyObject *)sm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000887}
888
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000889static int
890sm_traverse(staticmethod *sm, visitproc visit, void *arg)
891{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000892 Py_VISIT(sm->sm_callable);
893 return 0;
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000894}
895
896static int
897sm_clear(staticmethod *sm)
898{
899 Py_XDECREF(sm->sm_callable);
900 sm->sm_callable = NULL;
901
902 return 0;
903}
904
Tim Peters6d6c1a32001-08-02 04:15:00 +0000905static PyObject *
906sm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
907{
908 staticmethod *sm = (staticmethod *)self;
909
910 if (sm->sm_callable == NULL) {
911 PyErr_SetString(PyExc_RuntimeError,
912 "uninitialized staticmethod object");
913 return NULL;
914 }
915 Py_INCREF(sm->sm_callable);
916 return sm->sm_callable;
917}
918
919static int
920sm_init(PyObject *self, PyObject *args, PyObject *kwds)
921{
922 staticmethod *sm = (staticmethod *)self;
923 PyObject *callable;
924
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000925 if (!PyArg_UnpackTuple(args, "staticmethod", 1, 1, &callable))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000926 return -1;
Georg Brandld02db402006-02-21 22:13:44 +0000927 if (!_PyArg_NoKeywords("staticmethod", kwds))
928 return -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000929 Py_INCREF(callable);
930 sm->sm_callable = callable;
931 return 0;
932}
933
Raymond Hettinger2bcde142009-05-29 04:52:27 +0000934static PyMemberDef sm_memberlist[] = {
935 {"__func__", T_OBJECT, offsetof(staticmethod, sm_callable), READONLY},
936 {NULL} /* Sentinel */
937};
938
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000939PyDoc_STRVAR(staticmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000940"staticmethod(function) -> method\n\
941\n\
942Convert a function to be a static method.\n\
943\n\
944A static method does not receive an implicit first argument.\n\
945To declare a static method, use this idiom:\n\
946\n\
947 class C:\n\
948 def f(arg1, arg2, ...): ...\n\
949 f = staticmethod(f)\n\
950\n\
951It can be called either on the class (e.g. C.f()) or on an instance\n\
952(e.g. C().f()). The instance is ignored except for its class.\n\
953\n\
954Static methods in Python are similar to those found in Java or C++.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000955For a more advanced concept, see the classmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000956
Tim Peters6d6c1a32001-08-02 04:15:00 +0000957PyTypeObject PyStaticMethod_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000958 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000959 "staticmethod",
960 sizeof(staticmethod),
961 0,
962 (destructor)sm_dealloc, /* tp_dealloc */
963 0, /* tp_print */
964 0, /* tp_getattr */
965 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000966 0, /* tp_reserved */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000967 0, /* tp_repr */
968 0, /* tp_as_number */
969 0, /* tp_as_sequence */
970 0, /* tp_as_mapping */
971 0, /* tp_hash */
972 0, /* tp_call */
973 0, /* tp_str */
974 PyObject_GenericGetAttr, /* tp_getattro */
975 0, /* tp_setattro */
976 0, /* tp_as_buffer */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000977 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000978 staticmethod_doc, /* tp_doc */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000979 (traverseproc)sm_traverse, /* tp_traverse */
980 (inquiry)sm_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000981 0, /* tp_richcompare */
982 0, /* tp_weaklistoffset */
983 0, /* tp_iter */
984 0, /* tp_iternext */
985 0, /* tp_methods */
Raymond Hettinger2bcde142009-05-29 04:52:27 +0000986 sm_memberlist, /* tp_members */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000987 0, /* tp_getset */
988 0, /* tp_base */
989 0, /* tp_dict */
990 sm_descr_get, /* tp_descr_get */
991 0, /* tp_descr_set */
992 0, /* tp_dictoffset */
993 sm_init, /* tp_init */
994 PyType_GenericAlloc, /* tp_alloc */
995 PyType_GenericNew, /* tp_new */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000996 PyObject_GC_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000997};
998
999PyObject *
1000PyStaticMethod_New(PyObject *callable)
1001{
1002 staticmethod *sm = (staticmethod *)
1003 PyType_GenericAlloc(&PyStaticMethod_Type, 0);
1004 if (sm != NULL) {
1005 Py_INCREF(callable);
1006 sm->sm_callable = callable;
1007 }
1008 return (PyObject *)sm;
1009}