blob: 971eb1cd0d601547f6d0e376162043b78c4b24e8 [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"
Guido van Rossum9bfef441993-03-29 10:43:31 +00005#include "compile.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 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +000027 op->func_closure = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000028 consts = ((PyCodeObject *)code)->co_consts;
29 if (PyTuple_Size(consts) >= 1) {
30 doc = PyTuple_GetItem(consts, 0);
Guido van Rossumec5b7762000-04-27 20:14:13 +000031 if (!PyString_Check(doc) && !PyUnicode_Check(doc))
Guido van Rossumc0b618a1997-05-02 03:12:38 +000032 doc = Py_None;
Guido van Rossum5bd38051995-01-07 12:01:30 +000033 }
34 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000035 doc = Py_None;
36 Py_INCREF(doc);
Guido van Rossum5bd38051995-01-07 12:01:30 +000037 op->func_doc = doc;
Barry Warsawd6a9e842001-01-15 20:40:19 +000038 op->func_dict = NULL;
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +000039 op->func_module = NULL;
40
41 /* __module__: If module name is in globals, use it.
42 Otherwise, use None.
43 */
Martin v. Löwis321c9ab2004-03-23 18:40:15 +000044 if (!__name__) {
45 __name__ = PyString_InternFromString("__name__");
46 if (!__name__) {
47 Py_DECREF(op);
48 return NULL;
49 }
50 }
51 module = PyDict_GetItem(globals, __name__);
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +000052 if (module) {
53 Py_INCREF(module);
54 op->func_module = module;
55 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056 }
Barry Warsawd6a9e842001-01-15 20:40:19 +000057 else
58 return NULL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +000059 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000060 return (PyObject *)op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000061}
62
Guido van Rossumc0b618a1997-05-02 03:12:38 +000063PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000064PyFunction_GetCode(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000065{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 if (!PyFunction_Check(op)) {
67 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000068 return NULL;
69 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000070 return ((PyFunctionObject *) op) -> func_code;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071}
72
Guido van Rossumc0b618a1997-05-02 03:12:38 +000073PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000074PyFunction_GetGlobals(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000076 if (!PyFunction_Check(op)) {
77 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000078 return NULL;
79 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000080 return ((PyFunctionObject *) op) -> func_globals;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081}
82
Guido van Rossumc0b618a1997-05-02 03:12:38 +000083PyObject *
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +000084PyFunction_GetModule(PyObject *op)
85{
86 if (!PyFunction_Check(op)) {
87 PyErr_BadInternalCall();
88 return NULL;
89 }
90 return ((PyFunctionObject *) op) -> func_module;
91}
92
93PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000094PyFunction_GetDefaults(PyObject *op)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000095{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 if (!PyFunction_Check(op)) {
97 PyErr_BadInternalCall();
Guido van Rossum1d5735e1994-08-30 08:27:36 +000098 return NULL;
99 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100 return ((PyFunctionObject *) op) -> func_defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000101}
102
103int
Fred Drakeee238b92000-07-09 06:03:25 +0000104PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000105{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000106 if (!PyFunction_Check(op)) {
107 PyErr_BadInternalCall();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000108 return -1;
109 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 if (defaults == Py_None)
Guido van Rossum2271bf71995-07-18 14:30:34 +0000111 defaults = NULL;
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000112 else if (PyTuple_Check(defaults)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113 Py_XINCREF(defaults);
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000114 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000115 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 PyErr_SetString(PyExc_SystemError, "non-tuple default args");
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000117 return -1;
118 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000119 Py_XDECREF(((PyFunctionObject *) op) -> func_defaults);
120 ((PyFunctionObject *) op) -> func_defaults = defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000121 return 0;
122}
123
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000124PyObject *
125PyFunction_GetClosure(PyObject *op)
126{
127 if (!PyFunction_Check(op)) {
128 PyErr_BadInternalCall();
129 return NULL;
130 }
131 return ((PyFunctionObject *) op) -> func_closure;
132}
133
134int
135PyFunction_SetClosure(PyObject *op, PyObject *closure)
136{
137 if (!PyFunction_Check(op)) {
138 PyErr_BadInternalCall();
139 return -1;
140 }
141 if (closure == Py_None)
142 closure = NULL;
143 else if (PyTuple_Check(closure)) {
144 Py_XINCREF(closure);
145 }
146 else {
147 PyErr_SetString(PyExc_SystemError, "non-tuple closure");
148 return -1;
149 }
150 Py_XDECREF(((PyFunctionObject *) op) -> func_closure);
151 ((PyFunctionObject *) op) -> func_closure = closure;
152 return 0;
153}
154
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000155/* Methods */
156
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157#define OFF(x) offsetof(PyFunctionObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000158
Guido van Rossum6f799372001-09-20 20:46:19 +0000159static PyMemberDef func_memberlist[] = {
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000160 {"func_closure", T_OBJECT, OFF(func_closure),
161 RESTRICTED|READONLY},
162 {"func_doc", T_OBJECT, OFF(func_doc), WRITE_RESTRICTED},
163 {"__doc__", T_OBJECT, OFF(func_doc), WRITE_RESTRICTED},
164 {"func_globals", T_OBJECT, OFF(func_globals),
165 RESTRICTED|READONLY},
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000166 {"func_name", T_OBJECT, OFF(func_name), READONLY},
167 {"__name__", T_OBJECT, OFF(func_name), READONLY},
Guido van Rossum6b29c012003-02-18 17:18:35 +0000168 {"__module__", T_OBJECT, OFF(func_module), WRITE_RESTRICTED},
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000169 {NULL} /* Sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000170};
171
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000172static int
173restricted(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000174{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000175 if (!PyEval_GetRestricted())
176 return 0;
177 PyErr_SetString(PyExc_RuntimeError,
178 "function attributes not accessible in restricted mode");
179 return 1;
180}
181
182static PyObject *
183func_get_dict(PyFunctionObject *op)
184{
185 if (restricted())
Guido van Rossum10393b11995-01-10 10:39:49 +0000186 return NULL;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000187 if (op->func_dict == NULL) {
188 op->func_dict = PyDict_New();
189 if (op->func_dict == NULL)
Barry Warsaw142865c2001-08-14 18:23:58 +0000190 return NULL;
191 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000192 Py_INCREF(op->func_dict);
193 return op->func_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000194}
195
Guido van Rossum0dabace1998-05-22 00:55:34 +0000196static int
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000197func_set_dict(PyFunctionObject *op, PyObject *value)
Guido van Rossum0dabace1998-05-22 00:55:34 +0000198{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000199 PyObject *tmp;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000200
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000201 if (restricted())
202 return -1;
203 /* It is illegal to del f.func_dict */
204 if (value == NULL) {
205 PyErr_SetString(PyExc_TypeError,
206 "function's dictionary may not be deleted");
Guido van Rossum0dabace1998-05-22 00:55:34 +0000207 return -1;
208 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000209 /* Can only set func_dict to a dictionary */
210 if (!PyDict_Check(value)) {
211 PyErr_SetString(PyExc_TypeError,
Barry Warsaw142865c2001-08-14 18:23:58 +0000212 "setting function's dictionary to a non-dict");
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000213 return -1;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000214 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000215 tmp = op->func_dict;
216 Py_INCREF(value);
217 op->func_dict = value;
218 Py_XDECREF(tmp);
219 return 0;
Guido van Rossum0dabace1998-05-22 00:55:34 +0000220}
221
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000222static PyObject *
223func_get_code(PyFunctionObject *op)
224{
225 if (restricted())
226 return NULL;
227 Py_INCREF(op->func_code);
228 return op->func_code;
229}
230
231static int
232func_set_code(PyFunctionObject *op, PyObject *value)
233{
234 PyObject *tmp;
235
236 if (restricted())
237 return -1;
238 /* Not legal to del f.func_code or to set it to anything
239 * other than a code object. */
240 if (value == NULL || !PyCode_Check(value)) {
241 PyErr_SetString(PyExc_TypeError,
242 "func_code must be set to a code object");
243 return -1;
244 }
245 tmp = op->func_code;
246 Py_INCREF(value);
247 op->func_code = value;
248 Py_DECREF(tmp);
249 return 0;
250}
251
252static PyObject *
253func_get_defaults(PyFunctionObject *op)
254{
255 if (restricted())
256 return NULL;
257 if (op->func_defaults == NULL) {
258 Py_INCREF(Py_None);
259 return Py_None;
260 }
261 Py_INCREF(op->func_defaults);
262 return op->func_defaults;
263}
264
265static int
266func_set_defaults(PyFunctionObject *op, PyObject *value)
267{
268 PyObject *tmp;
269
270 if (restricted())
271 return -1;
272 /* Legal to del f.func_defaults.
273 * Can only set func_defaults to NULL or a tuple. */
274 if (value == Py_None)
275 value = NULL;
276 if (value != NULL && !PyTuple_Check(value)) {
277 PyErr_SetString(PyExc_TypeError,
278 "func_defaults must be set to a tuple object");
279 return -1;
280 }
281 tmp = op->func_defaults;
282 Py_XINCREF(value);
283 op->func_defaults = value;
284 Py_XDECREF(tmp);
285 return 0;
286}
287
Guido van Rossum32d34c82001-09-20 21:45:26 +0000288static PyGetSetDef func_getsetlist[] = {
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000289 {"func_code", (getter)func_get_code, (setter)func_set_code},
290 {"func_defaults", (getter)func_get_defaults,
291 (setter)func_set_defaults},
292 {"func_dict", (getter)func_get_dict, (setter)func_set_dict},
293 {"__dict__", (getter)func_get_dict, (setter)func_set_dict},
294 {NULL} /* Sentinel */
295};
296
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000297PyDoc_STRVAR(func_doc,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000298"function(code, globals[, name[, argdefs[, closure]]])\n\
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000299\n\
300Create a function object from a code object and a dictionary.\n\
301The optional name string overrides the name from the code object.\n\
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000302The optional argdefs tuple specifies the default argument values.\n\
303The optional closure tuple supplies the bindings for free variables.");
304
305/* func_new() maintains the following invariants for closures. The
306 closure must correspond to the free variables of the code object.
307
308 if len(code.co_freevars) == 0:
309 closure = NULL
310 else:
311 len(closure) == len(code.co_freevars)
312 for every elt in closure, type(elt) == cell
313*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000314
315static PyObject *
316func_new(PyTypeObject* type, PyObject* args, PyObject* kw)
317{
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000318 PyCodeObject *code;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000319 PyObject *globals;
320 PyObject *name = Py_None;
321 PyObject *defaults = Py_None;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000322 PyObject *closure = Py_None;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000323 PyFunctionObject *newfunc;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000324 int nfree, nclosure;
Raymond Hettinger86578452003-05-06 09:01:41 +0000325 static char *kwlist[] = {"code", "globals", "name",
326 "argdefs", "closure", 0};
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000327
Raymond Hettinger86578452003-05-06 09:01:41 +0000328 if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!|OOO:function",
329 kwlist,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000330 &PyCode_Type, &code,
331 &PyDict_Type, &globals,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000332 &name, &defaults, &closure))
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000333 return NULL;
334 if (name != Py_None && !PyString_Check(name)) {
335 PyErr_SetString(PyExc_TypeError,
336 "arg 3 (name) must be None or string");
337 return NULL;
338 }
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000339 if (defaults != Py_None && !PyTuple_Check(defaults)) {
340 PyErr_SetString(PyExc_TypeError,
341 "arg 4 (defaults) must be None or tuple");
342 return NULL;
343 }
344 nfree = PyTuple_GET_SIZE(code->co_freevars);
345 if (!PyTuple_Check(closure)) {
346 if (nfree && closure == Py_None) {
347 PyErr_SetString(PyExc_TypeError,
348 "arg 5 (closure) must be tuple");
349 return NULL;
350 }
351 else if (closure != Py_None) {
352 PyErr_SetString(PyExc_TypeError,
353 "arg 5 (closure) must be None or tuple");
354 return NULL;
355 }
356 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000357
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000358 /* check that the closure is well-formed */
359 nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure);
360 if (nfree != nclosure)
361 return PyErr_Format(PyExc_ValueError,
362 "%s requires closure of length %d, not %d",
363 PyString_AS_STRING(code->co_name),
364 nfree, nclosure);
365 if (nclosure) {
366 int i;
367 for (i = 0; i < nclosure; i++) {
368 PyObject *o = PyTuple_GET_ITEM(closure, i);
369 if (!PyCell_Check(o)) {
370 return PyErr_Format(PyExc_TypeError,
371 "arg 5 (closure) expected cell, found %s",
372 o->ob_type->tp_name);
373 }
374 }
375 }
376
377 newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code,
378 globals);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000379 if (newfunc == NULL)
380 return NULL;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000381
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000382 if (name != Py_None) {
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000383 Py_INCREF(name);
384 Py_DECREF(newfunc->func_name);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000385 newfunc->func_name = name;
386 }
387 if (defaults != Py_None) {
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000388 Py_INCREF(defaults);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000389 newfunc->func_defaults = defaults;
390 }
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000391 if (closure != Py_None) {
392 Py_INCREF(closure);
393 newfunc->func_closure = closure;
394 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000395
396 return (PyObject *)newfunc;
397}
398
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000399static void
Fred Drakeee238b92000-07-09 06:03:25 +0000400func_dealloc(PyFunctionObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000402 _PyObject_GC_UNTRACK(op);
Fred Drakec916f5a2001-10-26 17:56:51 +0000403 if (op->func_weakreflist != NULL)
404 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000405 Py_DECREF(op->func_code);
406 Py_DECREF(op->func_globals);
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000407 Py_XDECREF(op->func_module);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000408 Py_DECREF(op->func_name);
409 Py_XDECREF(op->func_defaults);
410 Py_XDECREF(op->func_doc);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000411 Py_XDECREF(op->func_dict);
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000412 Py_XDECREF(op->func_closure);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000413 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000414}
415
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416static PyObject*
Fred Drakeee238b92000-07-09 06:03:25 +0000417func_repr(PyFunctionObject *op)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000418{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 if (op->func_name == Py_None)
Barry Warsaw7ce36942001-08-24 18:34:26 +0000420 return PyString_FromFormat("<anonymous function at %p>", op);
421 return PyString_FromFormat("<function %s at %p>",
422 PyString_AsString(op->func_name),
423 op);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000424}
425
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000426static int
Jeremy Hylton8caad492000-06-23 14:18:11 +0000427func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
428{
429 int err;
430 if (f->func_code) {
431 err = visit(f->func_code, arg);
432 if (err)
433 return err;
434 }
435 if (f->func_globals) {
436 err = visit(f->func_globals, arg);
437 if (err)
438 return err;
439 }
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000440 if (f->func_module) {
441 err = visit(f->func_module, arg);
442 if (err)
443 return err;
444 }
Jeremy Hylton8caad492000-06-23 14:18:11 +0000445 if (f->func_defaults) {
446 err = visit(f->func_defaults, arg);
447 if (err)
448 return err;
449 }
450 if (f->func_doc) {
451 err = visit(f->func_doc, arg);
452 if (err)
453 return err;
454 }
455 if (f->func_name) {
456 err = visit(f->func_name, arg);
457 if (err)
458 return err;
459 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000460 if (f->func_dict) {
461 err = visit(f->func_dict, arg);
462 if (err)
463 return err;
464 }
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000465 if (f->func_closure) {
466 err = visit(f->func_closure, arg);
467 if (err)
468 return err;
469 }
Jeremy Hylton8caad492000-06-23 14:18:11 +0000470 return 0;
471}
472
Tim Peters6d6c1a32001-08-02 04:15:00 +0000473static PyObject *
474function_call(PyObject *func, PyObject *arg, PyObject *kw)
475{
476 PyObject *result;
477 PyObject *argdefs;
478 PyObject **d, **k;
479 int nk, nd;
480
481 argdefs = PyFunction_GET_DEFAULTS(func);
482 if (argdefs != NULL && PyTuple_Check(argdefs)) {
483 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
484 nd = PyTuple_Size(argdefs);
485 }
486 else {
487 d = NULL;
488 nd = 0;
489 }
490
491 if (kw != NULL && PyDict_Check(kw)) {
492 int pos, i;
493 nk = PyDict_Size(kw);
494 k = PyMem_NEW(PyObject *, 2*nk);
495 if (k == NULL) {
496 PyErr_NoMemory();
Tim Peters6d6c1a32001-08-02 04:15:00 +0000497 return NULL;
498 }
499 pos = i = 0;
500 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
501 i += 2;
502 nk = i/2;
503 /* XXX This is broken if the caller deletes dict items! */
504 }
505 else {
506 k = NULL;
507 nk = 0;
508 }
509
510 result = PyEval_EvalCodeEx(
511 (PyCodeObject *)PyFunction_GET_CODE(func),
512 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
513 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
514 k, nk, d, nd,
515 PyFunction_GET_CLOSURE(func));
516
517 if (k != NULL)
518 PyMem_DEL(k);
519
520 return result;
521}
522
523/* Bind a function to an object */
524static PyObject *
525func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
526{
527 if (obj == Py_None)
528 obj = NULL;
529 return PyMethod_New(func, obj, type);
530}
531
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532PyTypeObject PyFunction_Type = {
533 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000534 0,
535 "function",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000536 sizeof(PyFunctionObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000537 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +0000538 (destructor)func_dealloc, /* tp_dealloc */
539 0, /* tp_print */
540 0, /* tp_getattr */
541 0, /* tp_setattr */
542 0, /* tp_compare */
543 (reprfunc)func_repr, /* tp_repr */
544 0, /* tp_as_number */
545 0, /* tp_as_sequence */
546 0, /* tp_as_mapping */
547 0, /* tp_hash */
548 function_call, /* tp_call */
549 0, /* tp_str */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000550 PyObject_GenericGetAttr, /* tp_getattro */
551 PyObject_GenericSetAttr, /* tp_setattro */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000552 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000553 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000554 func_doc, /* tp_doc */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000555 (traverseproc)func_traverse, /* tp_traverse */
556 0, /* tp_clear */
557 0, /* tp_richcompare */
Fred Drakedb81e8d2001-03-23 04:19:27 +0000558 offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000559 0, /* tp_iter */
560 0, /* tp_iternext */
561 0, /* tp_methods */
562 func_memberlist, /* tp_members */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000563 func_getsetlist, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000564 0, /* tp_base */
565 0, /* tp_dict */
566 func_descr_get, /* tp_descr_get */
567 0, /* tp_descr_set */
568 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000569 0, /* tp_init */
570 0, /* tp_alloc */
571 func_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000572};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000573
574
575/* Class method object */
576
577/* A class method receives the class as implicit first argument,
578 just like an instance method receives the instance.
579 To declare a class method, use this idiom:
580
581 class C:
582 def f(cls, arg1, arg2, ...): ...
583 f = classmethod(f)
584
585 It can be called either on the class (e.g. C.f()) or on an instance
586 (e.g. C().f()); the instance is ignored except for its class.
587 If a class method is called for a derived class, the derived class
588 object is passed as the implied first argument.
589
590 Class methods are different than C++ or Java static methods.
591 If you want those, see static methods below.
592*/
593
594typedef struct {
595 PyObject_HEAD
596 PyObject *cm_callable;
597} classmethod;
598
599static void
600cm_dealloc(classmethod *cm)
601{
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000602 _PyObject_GC_UNTRACK((PyObject *)cm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000603 Py_XDECREF(cm->cm_callable);
Guido van Rossum9475a232001-10-05 20:51:39 +0000604 cm->ob_type->tp_free((PyObject *)cm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000605}
606
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000607static int
608cm_traverse(classmethod *cm, visitproc visit, void *arg)
609{
610 if (!cm->cm_callable)
611 return 0;
612 return visit(cm->cm_callable, arg);
613}
614
615static int
616cm_clear(classmethod *cm)
617{
618 Py_XDECREF(cm->cm_callable);
619 cm->cm_callable = NULL;
620
621 return 0;
622}
623
624
Tim Peters6d6c1a32001-08-02 04:15:00 +0000625static PyObject *
626cm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
627{
628 classmethod *cm = (classmethod *)self;
629
630 if (cm->cm_callable == NULL) {
631 PyErr_SetString(PyExc_RuntimeError,
632 "uninitialized classmethod object");
633 return NULL;
634 }
Guido van Rossum7e305482002-03-18 03:09:06 +0000635 if (type == NULL)
636 type = (PyObject *)(obj->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000637 return PyMethod_New(cm->cm_callable,
638 type, (PyObject *)(type->ob_type));
639}
640
641static int
642cm_init(PyObject *self, PyObject *args, PyObject *kwds)
643{
644 classmethod *cm = (classmethod *)self;
645 PyObject *callable;
646
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000647 if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000648 return -1;
Raymond Hettingerbe971532003-06-18 01:13:41 +0000649 if (!PyCallable_Check(callable)) {
650 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
651 callable->ob_type->tp_name);
652 return -1;
653 }
654
Tim Peters6d6c1a32001-08-02 04:15:00 +0000655 Py_INCREF(callable);
656 cm->cm_callable = callable;
657 return 0;
658}
659
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000660PyDoc_STRVAR(classmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000661"classmethod(function) -> method\n\
662\n\
663Convert a function to be a class method.\n\
664\n\
665A class method receives the class as implicit first argument,\n\
666just like an instance method receives the instance.\n\
667To declare a class method, use this idiom:\n\
668\n\
669 class C:\n\
670 def f(cls, arg1, arg2, ...): ...\n\
671 f = classmethod(f)\n\
672\n\
673It can be called either on the class (e.g. C.f()) or on an instance\n\
674(e.g. C().f()). The instance is ignored except for its class.\n\
675If a class method is called for a derived class, the derived class\n\
676object is passed as the implied first argument.\n\
Sjoerd Mullender564980b2001-12-17 11:39:56 +0000677\n\
Guido van Rossum33c1a882001-12-17 02:53:53 +0000678Class methods are different than C++ or Java static methods.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000679If you want those, see the staticmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000680
Tim Peters6d6c1a32001-08-02 04:15:00 +0000681PyTypeObject PyClassMethod_Type = {
682 PyObject_HEAD_INIT(&PyType_Type)
683 0,
684 "classmethod",
685 sizeof(classmethod),
686 0,
687 (destructor)cm_dealloc, /* tp_dealloc */
688 0, /* tp_print */
689 0, /* tp_getattr */
690 0, /* tp_setattr */
691 0, /* tp_compare */
692 0, /* tp_repr */
693 0, /* tp_as_number */
694 0, /* tp_as_sequence */
695 0, /* tp_as_mapping */
696 0, /* tp_hash */
697 0, /* tp_call */
698 0, /* tp_str */
699 PyObject_GenericGetAttr, /* tp_getattro */
700 0, /* tp_setattro */
701 0, /* tp_as_buffer */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000702 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000703 classmethod_doc, /* tp_doc */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000704 (traverseproc)cm_traverse, /* tp_traverse */
705 (inquiry)cm_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000706 0, /* tp_richcompare */
707 0, /* tp_weaklistoffset */
708 0, /* tp_iter */
709 0, /* tp_iternext */
710 0, /* tp_methods */
711 0, /* tp_members */
712 0, /* tp_getset */
713 0, /* tp_base */
714 0, /* tp_dict */
715 cm_descr_get, /* tp_descr_get */
716 0, /* tp_descr_set */
717 0, /* tp_dictoffset */
718 cm_init, /* tp_init */
719 PyType_GenericAlloc, /* tp_alloc */
720 PyType_GenericNew, /* tp_new */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000721 PyObject_GC_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000722};
723
724PyObject *
725PyClassMethod_New(PyObject *callable)
726{
727 classmethod *cm = (classmethod *)
728 PyType_GenericAlloc(&PyClassMethod_Type, 0);
729 if (cm != NULL) {
730 Py_INCREF(callable);
731 cm->cm_callable = callable;
732 }
733 return (PyObject *)cm;
734}
735
736
737/* Static method object */
738
739/* A static method does not receive an implicit first argument.
740 To declare a static method, use this idiom:
741
742 class C:
743 def f(arg1, arg2, ...): ...
744 f = staticmethod(f)
745
746 It can be called either on the class (e.g. C.f()) or on an instance
747 (e.g. C().f()); the instance is ignored except for its class.
748
749 Static methods in Python are similar to those found in Java or C++.
750 For a more advanced concept, see class methods above.
751*/
752
753typedef struct {
754 PyObject_HEAD
755 PyObject *sm_callable;
756} staticmethod;
757
758static void
759sm_dealloc(staticmethod *sm)
760{
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000761 _PyObject_GC_UNTRACK((PyObject *)sm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000762 Py_XDECREF(sm->sm_callable);
Guido van Rossum9475a232001-10-05 20:51:39 +0000763 sm->ob_type->tp_free((PyObject *)sm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000764}
765
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000766static int
767sm_traverse(staticmethod *sm, visitproc visit, void *arg)
768{
769 if (!sm->sm_callable)
770 return 0;
771 return visit(sm->sm_callable, arg);
772}
773
774static int
775sm_clear(staticmethod *sm)
776{
777 Py_XDECREF(sm->sm_callable);
778 sm->sm_callable = NULL;
779
780 return 0;
781}
782
Tim Peters6d6c1a32001-08-02 04:15:00 +0000783static PyObject *
784sm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
785{
786 staticmethod *sm = (staticmethod *)self;
787
788 if (sm->sm_callable == NULL) {
789 PyErr_SetString(PyExc_RuntimeError,
790 "uninitialized staticmethod object");
791 return NULL;
792 }
793 Py_INCREF(sm->sm_callable);
794 return sm->sm_callable;
795}
796
797static int
798sm_init(PyObject *self, PyObject *args, PyObject *kwds)
799{
800 staticmethod *sm = (staticmethod *)self;
801 PyObject *callable;
802
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000803 if (!PyArg_UnpackTuple(args, "staticmethod", 1, 1, &callable))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000804 return -1;
805 Py_INCREF(callable);
806 sm->sm_callable = callable;
807 return 0;
808}
809
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000810PyDoc_STRVAR(staticmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000811"staticmethod(function) -> method\n\
812\n\
813Convert a function to be a static method.\n\
814\n\
815A static method does not receive an implicit first argument.\n\
816To declare a static method, use this idiom:\n\
817\n\
818 class C:\n\
819 def f(arg1, arg2, ...): ...\n\
820 f = staticmethod(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\
824\n\
825Static methods in Python are similar to those found in Java or C++.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000826For a more advanced concept, see the classmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000827
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828PyTypeObject PyStaticMethod_Type = {
829 PyObject_HEAD_INIT(&PyType_Type)
830 0,
831 "staticmethod",
832 sizeof(staticmethod),
833 0,
834 (destructor)sm_dealloc, /* tp_dealloc */
835 0, /* tp_print */
836 0, /* tp_getattr */
837 0, /* tp_setattr */
838 0, /* tp_compare */
839 0, /* tp_repr */
840 0, /* tp_as_number */
841 0, /* tp_as_sequence */
842 0, /* tp_as_mapping */
843 0, /* tp_hash */
844 0, /* tp_call */
845 0, /* tp_str */
846 PyObject_GenericGetAttr, /* tp_getattro */
847 0, /* tp_setattro */
848 0, /* tp_as_buffer */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000849 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000850 staticmethod_doc, /* tp_doc */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000851 (traverseproc)sm_traverse, /* tp_traverse */
852 (inquiry)sm_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000853 0, /* tp_richcompare */
854 0, /* tp_weaklistoffset */
855 0, /* tp_iter */
856 0, /* tp_iternext */
857 0, /* tp_methods */
858 0, /* tp_members */
859 0, /* tp_getset */
860 0, /* tp_base */
861 0, /* tp_dict */
862 sm_descr_get, /* tp_descr_get */
863 0, /* tp_descr_set */
864 0, /* tp_dictoffset */
865 sm_init, /* tp_init */
866 PyType_GenericAlloc, /* tp_alloc */
867 PyType_GenericNew, /* tp_new */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000868 PyObject_GC_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000869};
870
871PyObject *
872PyStaticMethod_New(PyObject *callable)
873{
874 staticmethod *sm = (staticmethod *)
875 PyType_GenericAlloc(&PyStaticMethod_Type, 0);
876 if (sm != NULL) {
877 Py_INCREF(callable);
878 sm->sm_callable = callable;
879 }
880 return (PyObject *)sm;
881}