blob: d835f898b95da974bffe85580910b3822ef304e8 [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);
Guido van Rossumec5b7762000-04-27 20:14:13 +000032 if (!PyString_Check(doc) && !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__) {
47 __name__ = PyString_InternFromString("__name__");
48 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},
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000230 {"__doc__", T_OBJECT, OFF(func_doc), 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},
Guido van Rossum6b29c012003-02-18 17:18:35 +0000233 {"__module__", T_OBJECT, OFF(func_module), 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 int
238restricted(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000239{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000240 if (!PyEval_GetRestricted())
241 return 0;
242 PyErr_SetString(PyExc_RuntimeError,
243 "function attributes not accessible in restricted mode");
244 return 1;
245}
246
247static PyObject *
248func_get_dict(PyFunctionObject *op)
249{
250 if (restricted())
Guido van Rossum10393b11995-01-10 10:39:49 +0000251 return NULL;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000252 if (op->func_dict == NULL) {
253 op->func_dict = PyDict_New();
254 if (op->func_dict == NULL)
Barry Warsaw142865c2001-08-14 18:23:58 +0000255 return NULL;
256 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000257 Py_INCREF(op->func_dict);
258 return op->func_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000259}
260
Guido van Rossum0dabace1998-05-22 00:55:34 +0000261static int
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000262func_set_dict(PyFunctionObject *op, PyObject *value)
Guido van Rossum0dabace1998-05-22 00:55:34 +0000263{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000264 PyObject *tmp;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000265
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000266 if (restricted())
267 return -1;
268 /* It is illegal to del f.func_dict */
269 if (value == NULL) {
270 PyErr_SetString(PyExc_TypeError,
271 "function's dictionary may not be deleted");
Guido van Rossum0dabace1998-05-22 00:55:34 +0000272 return -1;
273 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000274 /* Can only set func_dict to a dictionary */
275 if (!PyDict_Check(value)) {
276 PyErr_SetString(PyExc_TypeError,
Barry Warsaw142865c2001-08-14 18:23:58 +0000277 "setting function's dictionary to a non-dict");
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000278 return -1;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000279 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000280 tmp = op->func_dict;
281 Py_INCREF(value);
282 op->func_dict = value;
283 Py_XDECREF(tmp);
284 return 0;
Guido van Rossum0dabace1998-05-22 00:55:34 +0000285}
286
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000287static PyObject *
288func_get_code(PyFunctionObject *op)
289{
290 if (restricted())
291 return NULL;
292 Py_INCREF(op->func_code);
293 return op->func_code;
294}
295
296static int
297func_set_code(PyFunctionObject *op, PyObject *value)
298{
299 PyObject *tmp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000300 Py_ssize_t nfree, nclosure;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000301
302 if (restricted())
303 return -1;
304 /* Not legal to del f.func_code or to set it to anything
305 * other than a code object. */
306 if (value == NULL || !PyCode_Check(value)) {
307 PyErr_SetString(PyExc_TypeError,
Neal Norwitz221085d2007-02-25 20:55:47 +0000308 "__code__ must be set to a code object");
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000309 return -1;
310 }
Armin Rigo89a39462004-10-28 16:32:00 +0000311 nfree = PyCode_GetNumFree((PyCodeObject *)value);
312 nclosure = (op->func_closure == NULL ? 0 :
313 PyTuple_GET_SIZE(op->func_closure));
314 if (nclosure != nfree) {
315 PyErr_Format(PyExc_ValueError,
Martin v. Löwis2c95cc62006-02-16 06:54:25 +0000316 "%s() requires a code object with %zd free vars,"
317 " not %zd",
Armin Rigo89a39462004-10-28 16:32:00 +0000318 PyString_AsString(op->func_name),
Martin v. Löwise0e89f72006-02-16 06:59:22 +0000319 nclosure, nfree);
Armin Rigo89a39462004-10-28 16:32:00 +0000320 return -1;
321 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000322 tmp = op->func_code;
323 Py_INCREF(value);
324 op->func_code = value;
325 Py_DECREF(tmp);
326 return 0;
327}
328
329static PyObject *
Michael W. Hudson5e897952004-08-12 18:12:44 +0000330func_get_name(PyFunctionObject *op)
331{
Michael W. Hudson5e897952004-08-12 18:12:44 +0000332 Py_INCREF(op->func_name);
333 return op->func_name;
334}
335
336static int
337func_set_name(PyFunctionObject *op, PyObject *value)
338{
339 PyObject *tmp;
340
341 if (restricted())
342 return -1;
343 /* Not legal to del f.func_name or to set it to anything
344 * other than a string object. */
345 if (value == NULL || !PyString_Check(value)) {
346 PyErr_SetString(PyExc_TypeError,
Neal Norwitz221085d2007-02-25 20:55:47 +0000347 "__name__ must be set to a string object");
Michael W. Hudson5e897952004-08-12 18:12:44 +0000348 return -1;
349 }
350 tmp = op->func_name;
351 Py_INCREF(value);
352 op->func_name = value;
353 Py_DECREF(tmp);
354 return 0;
355}
356
357static PyObject *
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000358func_get_defaults(PyFunctionObject *op)
359{
360 if (restricted())
361 return NULL;
362 if (op->func_defaults == NULL) {
363 Py_INCREF(Py_None);
364 return Py_None;
365 }
366 Py_INCREF(op->func_defaults);
367 return op->func_defaults;
368}
369
370static int
371func_set_defaults(PyFunctionObject *op, PyObject *value)
372{
373 PyObject *tmp;
374
375 if (restricted())
376 return -1;
377 /* Legal to del f.func_defaults.
378 * Can only set func_defaults to NULL or a tuple. */
379 if (value == Py_None)
380 value = NULL;
381 if (value != NULL && !PyTuple_Check(value)) {
382 PyErr_SetString(PyExc_TypeError,
Neal Norwitz221085d2007-02-25 20:55:47 +0000383 "__defaults__ must be set to a tuple object");
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000384 return -1;
385 }
386 tmp = op->func_defaults;
387 Py_XINCREF(value);
388 op->func_defaults = value;
389 Py_XDECREF(tmp);
390 return 0;
391}
392
Guido van Rossum4f72a782006-10-27 23:31:49 +0000393static PyObject *
394func_get_kwdefaults(PyFunctionObject *op)
395{
396 if (restricted())
397 return NULL;
398 if (op->func_kwdefaults == NULL) {
399 Py_INCREF(Py_None);
400 return Py_None;
401 }
402 Py_INCREF(op->func_kwdefaults);
403 return op->func_kwdefaults;
404}
405
406static int
407func_set_kwdefaults(PyFunctionObject *op, PyObject *value)
408{
409 PyObject *tmp;
410
411 if (restricted())
412 return -1;
413
414 if (value == Py_None)
415 value = NULL;
Georg Brandl80b331c2007-02-26 12:28:57 +0000416 /* Legal to del f.func_kwdefaults.
Guido van Rossum4f72a782006-10-27 23:31:49 +0000417 * Can only set func_kwdefaults to NULL or a dict. */
418 if (value != NULL && !PyDict_Check(value)) {
419 PyErr_SetString(PyExc_TypeError,
Neal Norwitz221085d2007-02-25 20:55:47 +0000420 "__kwdefaults__ must be set to a dict object");
Guido van Rossum4f72a782006-10-27 23:31:49 +0000421 return -1;
422 }
423 tmp = op->func_kwdefaults;
424 Py_XINCREF(value);
425 op->func_kwdefaults = value;
426 Py_XDECREF(tmp);
427 return 0;
428}
429
Neal Norwitzc1505362006-12-28 06:47:50 +0000430static PyObject *
431func_get_annotations(PyFunctionObject *op)
432{
433 if (op->func_annotations == NULL) {
434 op->func_annotations = PyDict_New();
435 if (op->func_annotations == NULL)
436 return NULL;
437 }
438 Py_INCREF(op->func_annotations);
439 return op->func_annotations;
440}
441
442static int
443func_set_annotations(PyFunctionObject *op, PyObject *value)
444{
445 PyObject *tmp;
446
447 if (value == Py_None)
448 value = NULL;
449 /* Legal to del f.func_annotations.
450 * Can only set func_annotations to NULL (through C api)
451 * or a dict. */
452 if (value != NULL && !PyDict_Check(value)) {
453 PyErr_SetString(PyExc_TypeError,
Neal Norwitz221085d2007-02-25 20:55:47 +0000454 "__annotations__ must be set to a dict object");
Neal Norwitzc1505362006-12-28 06:47:50 +0000455 return -1;
456 }
457 tmp = op->func_annotations;
458 Py_XINCREF(value);
459 op->func_annotations = value;
460 Py_XDECREF(tmp);
461 return 0;
462}
463
Guido van Rossum32d34c82001-09-20 21:45:26 +0000464static PyGetSetDef func_getsetlist[] = {
Neal Norwitz221085d2007-02-25 20:55:47 +0000465 {"__code__", (getter)func_get_code, (setter)func_set_code},
466 {"__defaults__", (getter)func_get_defaults,
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000467 (setter)func_set_defaults},
Neal Norwitz221085d2007-02-25 20:55:47 +0000468 {"__kwdefaults__", (getter)func_get_kwdefaults,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000469 (setter)func_set_kwdefaults},
Neal Norwitz221085d2007-02-25 20:55:47 +0000470 {"__annotations__", (getter)func_get_annotations,
Neal Norwitzc1505362006-12-28 06:47:50 +0000471 (setter)func_set_annotations},
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000472 {"__dict__", (getter)func_get_dict, (setter)func_set_dict},
Michael W. Hudson5e897952004-08-12 18:12:44 +0000473 {"__name__", (getter)func_get_name, (setter)func_set_name},
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000474 {NULL} /* Sentinel */
475};
476
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000477PyDoc_STRVAR(func_doc,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000478"function(code, globals[, name[, argdefs[, closure]]])\n\
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000479\n\
480Create a function object from a code object and a dictionary.\n\
481The optional name string overrides the name from the code object.\n\
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000482The optional argdefs tuple specifies the default argument values.\n\
483The optional closure tuple supplies the bindings for free variables.");
484
485/* func_new() maintains the following invariants for closures. The
486 closure must correspond to the free variables of the code object.
487
488 if len(code.co_freevars) == 0:
489 closure = NULL
490 else:
491 len(closure) == len(code.co_freevars)
492 for every elt in closure, type(elt) == cell
493*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000494
495static PyObject *
496func_new(PyTypeObject* type, PyObject* args, PyObject* kw)
497{
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000498 PyCodeObject *code;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000499 PyObject *globals;
500 PyObject *name = Py_None;
501 PyObject *defaults = Py_None;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000502 PyObject *closure = Py_None;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000503 PyFunctionObject *newfunc;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000504 Py_ssize_t nfree, nclosure;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000505 static char *kwlist[] = {"code", "globals", "name",
Raymond Hettinger86578452003-05-06 09:01:41 +0000506 "argdefs", "closure", 0};
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000507
Raymond Hettinger86578452003-05-06 09:01:41 +0000508 if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!|OOO:function",
509 kwlist,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000510 &PyCode_Type, &code,
511 &PyDict_Type, &globals,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000512 &name, &defaults, &closure))
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000513 return NULL;
514 if (name != Py_None && !PyString_Check(name)) {
515 PyErr_SetString(PyExc_TypeError,
516 "arg 3 (name) must be None or string");
517 return NULL;
518 }
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000519 if (defaults != Py_None && !PyTuple_Check(defaults)) {
520 PyErr_SetString(PyExc_TypeError,
521 "arg 4 (defaults) must be None or tuple");
522 return NULL;
523 }
524 nfree = PyTuple_GET_SIZE(code->co_freevars);
525 if (!PyTuple_Check(closure)) {
526 if (nfree && closure == Py_None) {
527 PyErr_SetString(PyExc_TypeError,
528 "arg 5 (closure) must be tuple");
529 return NULL;
530 }
531 else if (closure != Py_None) {
532 PyErr_SetString(PyExc_TypeError,
533 "arg 5 (closure) must be None or tuple");
534 return NULL;
535 }
536 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000537
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000538 /* check that the closure is well-formed */
539 nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure);
540 if (nfree != nclosure)
541 return PyErr_Format(PyExc_ValueError,
Martin v. Löwis2c95cc62006-02-16 06:54:25 +0000542 "%s requires closure of length %zd, not %zd",
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000543 PyString_AS_STRING(code->co_name),
Martin v. Löwise0e89f72006-02-16 06:59:22 +0000544 nfree, nclosure);
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000545 if (nclosure) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000546 Py_ssize_t i;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000547 for (i = 0; i < nclosure; i++) {
548 PyObject *o = PyTuple_GET_ITEM(closure, i);
549 if (!PyCell_Check(o)) {
550 return PyErr_Format(PyExc_TypeError,
551 "arg 5 (closure) expected cell, found %s",
552 o->ob_type->tp_name);
553 }
554 }
555 }
556
557 newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code,
558 globals);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000559 if (newfunc == NULL)
560 return NULL;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000561
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000562 if (name != Py_None) {
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000563 Py_INCREF(name);
564 Py_DECREF(newfunc->func_name);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000565 newfunc->func_name = name;
566 }
567 if (defaults != Py_None) {
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000568 Py_INCREF(defaults);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000569 newfunc->func_defaults = defaults;
570 }
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000571 if (closure != Py_None) {
572 Py_INCREF(closure);
573 newfunc->func_closure = closure;
574 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000575
576 return (PyObject *)newfunc;
577}
578
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000579static void
Fred Drakeee238b92000-07-09 06:03:25 +0000580func_dealloc(PyFunctionObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000581{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000582 _PyObject_GC_UNTRACK(op);
Fred Drakec916f5a2001-10-26 17:56:51 +0000583 if (op->func_weakreflist != NULL)
584 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585 Py_DECREF(op->func_code);
586 Py_DECREF(op->func_globals);
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000587 Py_XDECREF(op->func_module);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588 Py_DECREF(op->func_name);
589 Py_XDECREF(op->func_defaults);
Georg Brandl80b331c2007-02-26 12:28:57 +0000590 Py_XDECREF(op->func_kwdefaults);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591 Py_XDECREF(op->func_doc);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000592 Py_XDECREF(op->func_dict);
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000593 Py_XDECREF(op->func_closure);
Neal Norwitzc1505362006-12-28 06:47:50 +0000594 Py_XDECREF(op->func_annotations);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000595 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000596}
597
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598static PyObject*
Fred Drakeee238b92000-07-09 06:03:25 +0000599func_repr(PyFunctionObject *op)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000600{
Barry Warsaw7ce36942001-08-24 18:34:26 +0000601 return PyString_FromFormat("<function %s at %p>",
602 PyString_AsString(op->func_name),
603 op);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000604}
605
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000606static int
Jeremy Hylton8caad492000-06-23 14:18:11 +0000607func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
608{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000609 Py_VISIT(f->func_code);
610 Py_VISIT(f->func_globals);
611 Py_VISIT(f->func_module);
612 Py_VISIT(f->func_defaults);
Georg Brandl80b331c2007-02-26 12:28:57 +0000613 Py_VISIT(f->func_kwdefaults);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000614 Py_VISIT(f->func_doc);
615 Py_VISIT(f->func_name);
616 Py_VISIT(f->func_dict);
617 Py_VISIT(f->func_closure);
Neal Norwitzc1505362006-12-28 06:47:50 +0000618 Py_VISIT(f->func_annotations);
Jeremy Hylton8caad492000-06-23 14:18:11 +0000619 return 0;
620}
621
Tim Peters6d6c1a32001-08-02 04:15:00 +0000622static PyObject *
623function_call(PyObject *func, PyObject *arg, PyObject *kw)
624{
625 PyObject *result;
626 PyObject *argdefs;
627 PyObject **d, **k;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000628 Py_ssize_t nk, nd;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000629
630 argdefs = PyFunction_GET_DEFAULTS(func);
631 if (argdefs != NULL && PyTuple_Check(argdefs)) {
632 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
633 nd = PyTuple_Size(argdefs);
634 }
635 else {
636 d = NULL;
637 nd = 0;
638 }
639
640 if (kw != NULL && PyDict_Check(kw)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000641 Py_ssize_t pos, i;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000642 nk = PyDict_Size(kw);
643 k = PyMem_NEW(PyObject *, 2*nk);
644 if (k == NULL) {
645 PyErr_NoMemory();
Tim Peters6d6c1a32001-08-02 04:15:00 +0000646 return NULL;
647 }
648 pos = i = 0;
649 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
650 i += 2;
651 nk = i/2;
652 /* XXX This is broken if the caller deletes dict items! */
653 }
654 else {
655 k = NULL;
656 nk = 0;
657 }
658
659 result = PyEval_EvalCodeEx(
660 (PyCodeObject *)PyFunction_GET_CODE(func),
661 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
662 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
663 k, nk, d, nd,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000664 PyFunction_GET_KW_DEFAULTS(func),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000665 PyFunction_GET_CLOSURE(func));
666
667 if (k != NULL)
668 PyMem_DEL(k);
669
670 return result;
671}
672
673/* Bind a function to an object */
674static PyObject *
675func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
676{
677 if (obj == Py_None)
678 obj = NULL;
679 return PyMethod_New(func, obj, type);
680}
681
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000682PyTypeObject PyFunction_Type = {
683 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000684 0,
685 "function",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000686 sizeof(PyFunctionObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000687 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +0000688 (destructor)func_dealloc, /* tp_dealloc */
689 0, /* tp_print */
690 0, /* tp_getattr */
691 0, /* tp_setattr */
692 0, /* tp_compare */
693 (reprfunc)func_repr, /* tp_repr */
694 0, /* tp_as_number */
695 0, /* tp_as_sequence */
696 0, /* tp_as_mapping */
697 0, /* tp_hash */
698 function_call, /* tp_call */
699 0, /* tp_str */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000700 PyObject_GenericGetAttr, /* tp_getattro */
701 PyObject_GenericSetAttr, /* tp_setattro */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000702 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000703 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000704 func_doc, /* tp_doc */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000705 (traverseproc)func_traverse, /* tp_traverse */
706 0, /* tp_clear */
707 0, /* tp_richcompare */
Fred Drakedb81e8d2001-03-23 04:19:27 +0000708 offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000709 0, /* tp_iter */
710 0, /* tp_iternext */
711 0, /* tp_methods */
712 func_memberlist, /* tp_members */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000713 func_getsetlist, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000714 0, /* tp_base */
715 0, /* tp_dict */
716 func_descr_get, /* tp_descr_get */
717 0, /* tp_descr_set */
718 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000719 0, /* tp_init */
720 0, /* tp_alloc */
721 func_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000722};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000723
724
725/* Class method object */
726
727/* A class method receives the class as implicit first argument,
728 just like an instance method receives the instance.
729 To declare a class method, use this idiom:
730
731 class C:
732 def f(cls, arg1, arg2, ...): ...
733 f = classmethod(f)
734
735 It can be called either on the class (e.g. C.f()) or on an instance
736 (e.g. C().f()); the instance is ignored except for its class.
737 If a class method is called for a derived class, the derived class
738 object is passed as the implied first argument.
739
740 Class methods are different than C++ or Java static methods.
741 If you want those, see static methods below.
742*/
743
744typedef struct {
745 PyObject_HEAD
746 PyObject *cm_callable;
747} classmethod;
748
749static void
750cm_dealloc(classmethod *cm)
751{
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000752 _PyObject_GC_UNTRACK((PyObject *)cm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000753 Py_XDECREF(cm->cm_callable);
Guido van Rossum9475a232001-10-05 20:51:39 +0000754 cm->ob_type->tp_free((PyObject *)cm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000755}
756
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000757static int
758cm_traverse(classmethod *cm, visitproc visit, void *arg)
759{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000760 Py_VISIT(cm->cm_callable);
761 return 0;
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000762}
763
764static int
765cm_clear(classmethod *cm)
766{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000767 Py_CLEAR(cm->cm_callable);
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000768 return 0;
769}
770
771
Tim Peters6d6c1a32001-08-02 04:15:00 +0000772static PyObject *
773cm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
774{
775 classmethod *cm = (classmethod *)self;
776
777 if (cm->cm_callable == NULL) {
778 PyErr_SetString(PyExc_RuntimeError,
779 "uninitialized classmethod object");
780 return NULL;
781 }
Guido van Rossum7e305482002-03-18 03:09:06 +0000782 if (type == NULL)
783 type = (PyObject *)(obj->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000784 return PyMethod_New(cm->cm_callable,
785 type, (PyObject *)(type->ob_type));
786}
787
788static int
789cm_init(PyObject *self, PyObject *args, PyObject *kwds)
790{
791 classmethod *cm = (classmethod *)self;
792 PyObject *callable;
793
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000794 if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000795 return -1;
Georg Brandld02db402006-02-21 22:13:44 +0000796 if (!_PyArg_NoKeywords("classmethod", kwds))
797 return -1;
Raymond Hettingerbe971532003-06-18 01:13:41 +0000798 if (!PyCallable_Check(callable)) {
799 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
800 callable->ob_type->tp_name);
801 return -1;
802 }
803
Tim Peters6d6c1a32001-08-02 04:15:00 +0000804 Py_INCREF(callable);
805 cm->cm_callable = callable;
806 return 0;
807}
808
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000809PyDoc_STRVAR(classmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000810"classmethod(function) -> method\n\
811\n\
812Convert a function to be a class method.\n\
813\n\
814A class method receives the class as implicit first argument,\n\
815just like an instance method receives the instance.\n\
816To declare a class method, use this idiom:\n\
817\n\
818 class C:\n\
819 def f(cls, arg1, arg2, ...): ...\n\
820 f = classmethod(f)\n\
821\n\
822It can be called either on the class (e.g. C.f()) or on an instance\n\
823(e.g. C().f()). The instance is ignored except for its class.\n\
824If a class method is called for a derived class, the derived class\n\
825object is passed as the implied first argument.\n\
Sjoerd Mullender564980b2001-12-17 11:39:56 +0000826\n\
Guido van Rossum33c1a882001-12-17 02:53:53 +0000827Class methods are different than C++ or Java static methods.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000828If you want those, see the staticmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000829
Tim Peters6d6c1a32001-08-02 04:15:00 +0000830PyTypeObject PyClassMethod_Type = {
831 PyObject_HEAD_INIT(&PyType_Type)
832 0,
833 "classmethod",
834 sizeof(classmethod),
835 0,
836 (destructor)cm_dealloc, /* tp_dealloc */
837 0, /* tp_print */
838 0, /* tp_getattr */
839 0, /* tp_setattr */
840 0, /* tp_compare */
841 0, /* tp_repr */
842 0, /* tp_as_number */
843 0, /* tp_as_sequence */
844 0, /* tp_as_mapping */
845 0, /* tp_hash */
846 0, /* tp_call */
847 0, /* tp_str */
848 PyObject_GenericGetAttr, /* tp_getattro */
849 0, /* tp_setattro */
850 0, /* tp_as_buffer */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000851 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000852 classmethod_doc, /* tp_doc */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000853 (traverseproc)cm_traverse, /* tp_traverse */
854 (inquiry)cm_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000855 0, /* tp_richcompare */
856 0, /* tp_weaklistoffset */
857 0, /* tp_iter */
858 0, /* tp_iternext */
859 0, /* tp_methods */
860 0, /* tp_members */
861 0, /* tp_getset */
862 0, /* tp_base */
863 0, /* tp_dict */
864 cm_descr_get, /* tp_descr_get */
865 0, /* tp_descr_set */
866 0, /* tp_dictoffset */
867 cm_init, /* tp_init */
868 PyType_GenericAlloc, /* tp_alloc */
869 PyType_GenericNew, /* tp_new */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000870 PyObject_GC_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000871};
872
873PyObject *
874PyClassMethod_New(PyObject *callable)
875{
876 classmethod *cm = (classmethod *)
877 PyType_GenericAlloc(&PyClassMethod_Type, 0);
878 if (cm != NULL) {
879 Py_INCREF(callable);
880 cm->cm_callable = callable;
881 }
882 return (PyObject *)cm;
883}
884
885
886/* Static method object */
887
888/* A static method does not receive an implicit first argument.
889 To declare a static method, use this idiom:
890
891 class C:
892 def f(arg1, arg2, ...): ...
893 f = staticmethod(f)
894
895 It can be called either on the class (e.g. C.f()) or on an instance
896 (e.g. C().f()); the instance is ignored except for its class.
897
898 Static methods in Python are similar to those found in Java or C++.
899 For a more advanced concept, see class methods above.
900*/
901
902typedef struct {
903 PyObject_HEAD
904 PyObject *sm_callable;
905} staticmethod;
906
907static void
908sm_dealloc(staticmethod *sm)
909{
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000910 _PyObject_GC_UNTRACK((PyObject *)sm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000911 Py_XDECREF(sm->sm_callable);
Guido van Rossum9475a232001-10-05 20:51:39 +0000912 sm->ob_type->tp_free((PyObject *)sm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000913}
914
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000915static int
916sm_traverse(staticmethod *sm, visitproc visit, void *arg)
917{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000918 Py_VISIT(sm->sm_callable);
919 return 0;
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000920}
921
922static int
923sm_clear(staticmethod *sm)
924{
925 Py_XDECREF(sm->sm_callable);
926 sm->sm_callable = NULL;
927
928 return 0;
929}
930
Tim Peters6d6c1a32001-08-02 04:15:00 +0000931static PyObject *
932sm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
933{
934 staticmethod *sm = (staticmethod *)self;
935
936 if (sm->sm_callable == NULL) {
937 PyErr_SetString(PyExc_RuntimeError,
938 "uninitialized staticmethod object");
939 return NULL;
940 }
941 Py_INCREF(sm->sm_callable);
942 return sm->sm_callable;
943}
944
945static int
946sm_init(PyObject *self, PyObject *args, PyObject *kwds)
947{
948 staticmethod *sm = (staticmethod *)self;
949 PyObject *callable;
950
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000951 if (!PyArg_UnpackTuple(args, "staticmethod", 1, 1, &callable))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000952 return -1;
Georg Brandld02db402006-02-21 22:13:44 +0000953 if (!_PyArg_NoKeywords("staticmethod", kwds))
954 return -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000955 Py_INCREF(callable);
956 sm->sm_callable = callable;
957 return 0;
958}
959
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000960PyDoc_STRVAR(staticmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000961"staticmethod(function) -> method\n\
962\n\
963Convert a function to be a static method.\n\
964\n\
965A static method does not receive an implicit first argument.\n\
966To declare a static method, use this idiom:\n\
967\n\
968 class C:\n\
969 def f(arg1, arg2, ...): ...\n\
970 f = staticmethod(f)\n\
971\n\
972It can be called either on the class (e.g. C.f()) or on an instance\n\
973(e.g. C().f()). The instance is ignored except for its class.\n\
974\n\
975Static methods in Python are similar to those found in Java or C++.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000976For a more advanced concept, see the classmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000977
Tim Peters6d6c1a32001-08-02 04:15:00 +0000978PyTypeObject PyStaticMethod_Type = {
979 PyObject_HEAD_INIT(&PyType_Type)
980 0,
981 "staticmethod",
982 sizeof(staticmethod),
983 0,
984 (destructor)sm_dealloc, /* tp_dealloc */
985 0, /* tp_print */
986 0, /* tp_getattr */
987 0, /* tp_setattr */
988 0, /* tp_compare */
989 0, /* tp_repr */
990 0, /* tp_as_number */
991 0, /* tp_as_sequence */
992 0, /* tp_as_mapping */
993 0, /* tp_hash */
994 0, /* tp_call */
995 0, /* tp_str */
996 PyObject_GenericGetAttr, /* tp_getattro */
997 0, /* tp_setattro */
998 0, /* tp_as_buffer */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000999 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Guido van Rossum33c1a882001-12-17 02:53:53 +00001000 staticmethod_doc, /* tp_doc */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +00001001 (traverseproc)sm_traverse, /* tp_traverse */
1002 (inquiry)sm_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001003 0, /* tp_richcompare */
1004 0, /* tp_weaklistoffset */
1005 0, /* tp_iter */
1006 0, /* tp_iternext */
1007 0, /* tp_methods */
1008 0, /* tp_members */
1009 0, /* tp_getset */
1010 0, /* tp_base */
1011 0, /* tp_dict */
1012 sm_descr_get, /* tp_descr_get */
1013 0, /* tp_descr_set */
1014 0, /* tp_dictoffset */
1015 sm_init, /* tp_init */
1016 PyType_GenericAlloc, /* tp_alloc */
1017 PyType_GenericNew, /* tp_new */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +00001018 PyObject_GC_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001019};
1020
1021PyObject *
1022PyStaticMethod_New(PyObject *callable)
1023{
1024 staticmethod *sm = (staticmethod *)
1025 PyType_GenericAlloc(&PyStaticMethod_Type, 0);
1026 if (sm != NULL) {
1027 Py_INCREF(callable);
1028 sm->sm_callable = callable;
1029 }
1030 return (PyObject *)sm;
1031}