blob: 6f0fa268562902d83c1c2e9d38355240d893a1fb [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);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014 if (op != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000015 PyObject *doc;
16 PyObject *consts;
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +000017 PyObject *module;
Fred Drakedb81e8d2001-03-23 04:19:27 +000018 op->func_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000019 Py_INCREF(code);
Guido van Rossum846e4311990-11-18 17:44:06 +000020 op->func_code = code;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000021 Py_INCREF(globals);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000022 op->func_globals = globals;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000023 op->func_name = ((PyCodeObject *)code)->co_name;
24 Py_INCREF(op->func_name);
Guido van Rossum2271bf71995-07-18 14:30:34 +000025 op->func_defaults = NULL; /* No default arguments */
Jeremy Hylton64949cb2001-01-25 20:06:59 +000026 op->func_closure = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000027 consts = ((PyCodeObject *)code)->co_consts;
28 if (PyTuple_Size(consts) >= 1) {
29 doc = PyTuple_GetItem(consts, 0);
Guido van Rossumec5b7762000-04-27 20:14:13 +000030 if (!PyString_Check(doc) && !PyUnicode_Check(doc))
Guido van Rossumc0b618a1997-05-02 03:12:38 +000031 doc = Py_None;
Guido van Rossum5bd38051995-01-07 12:01:30 +000032 }
33 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034 doc = Py_None;
35 Py_INCREF(doc);
Guido van Rossum5bd38051995-01-07 12:01:30 +000036 op->func_doc = doc;
Barry Warsawd6a9e842001-01-15 20:40:19 +000037 op->func_dict = NULL;
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +000038 op->func_module = NULL;
39
40 /* __module__: If module name is in globals, use it.
41 Otherwise, use None.
42 */
43 module = PyDict_GetItemString(globals, "__name__");
44 if (module) {
45 Py_INCREF(module);
46 op->func_module = module;
47 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048 }
Barry Warsawd6a9e842001-01-15 20:40:19 +000049 else
50 return NULL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +000051 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052 return (PyObject *)op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053}
54
Guido van Rossumc0b618a1997-05-02 03:12:38 +000055PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000056PyFunction_GetCode(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000058 if (!PyFunction_Check(op)) {
59 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000060 return NULL;
61 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062 return ((PyFunctionObject *) op) -> func_code;
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_GetGlobals(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_globals;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073}
74
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075PyObject *
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +000076PyFunction_GetModule(PyObject *op)
77{
78 if (!PyFunction_Check(op)) {
79 PyErr_BadInternalCall();
80 return NULL;
81 }
82 return ((PyFunctionObject *) op) -> func_module;
83}
84
85PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000086PyFunction_GetDefaults(PyObject *op)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000087{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000088 if (!PyFunction_Check(op)) {
89 PyErr_BadInternalCall();
Guido van Rossum1d5735e1994-08-30 08:27:36 +000090 return NULL;
91 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092 return ((PyFunctionObject *) op) -> func_defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000093}
94
95int
Fred Drakeee238b92000-07-09 06:03:25 +000096PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
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 -1;
101 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102 if (defaults == Py_None)
Guido van Rossum2271bf71995-07-18 14:30:34 +0000103 defaults = NULL;
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000104 else if (PyTuple_Check(defaults)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 Py_XINCREF(defaults);
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000106 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000107 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000108 PyErr_SetString(PyExc_SystemError, "non-tuple default args");
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000109 return -1;
110 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000111 Py_XDECREF(((PyFunctionObject *) op) -> func_defaults);
112 ((PyFunctionObject *) op) -> func_defaults = defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000113 return 0;
114}
115
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000116PyObject *
117PyFunction_GetClosure(PyObject *op)
118{
119 if (!PyFunction_Check(op)) {
120 PyErr_BadInternalCall();
121 return NULL;
122 }
123 return ((PyFunctionObject *) op) -> func_closure;
124}
125
126int
127PyFunction_SetClosure(PyObject *op, PyObject *closure)
128{
129 if (!PyFunction_Check(op)) {
130 PyErr_BadInternalCall();
131 return -1;
132 }
133 if (closure == Py_None)
134 closure = NULL;
135 else if (PyTuple_Check(closure)) {
136 Py_XINCREF(closure);
137 }
138 else {
139 PyErr_SetString(PyExc_SystemError, "non-tuple closure");
140 return -1;
141 }
142 Py_XDECREF(((PyFunctionObject *) op) -> func_closure);
143 ((PyFunctionObject *) op) -> func_closure = closure;
144 return 0;
145}
146
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147/* Methods */
148
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149#define OFF(x) offsetof(PyFunctionObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000150
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000151#define RR ()
152
Guido van Rossum6f799372001-09-20 20:46:19 +0000153static PyMemberDef func_memberlist[] = {
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000154 {"func_closure", T_OBJECT, OFF(func_closure),
155 RESTRICTED|READONLY},
156 {"func_doc", T_OBJECT, OFF(func_doc), WRITE_RESTRICTED},
157 {"__doc__", T_OBJECT, OFF(func_doc), WRITE_RESTRICTED},
158 {"func_globals", T_OBJECT, OFF(func_globals),
159 RESTRICTED|READONLY},
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000160 {"func_name", T_OBJECT, OFF(func_name), READONLY},
161 {"__name__", T_OBJECT, OFF(func_name), READONLY},
Guido van Rossum6b29c012003-02-18 17:18:35 +0000162 {"__module__", T_OBJECT, OFF(func_module), WRITE_RESTRICTED},
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000163 {NULL} /* Sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000164};
165
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000166static int
167restricted(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000168{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000169 if (!PyEval_GetRestricted())
170 return 0;
171 PyErr_SetString(PyExc_RuntimeError,
172 "function attributes not accessible in restricted mode");
173 return 1;
174}
175
176static PyObject *
177func_get_dict(PyFunctionObject *op)
178{
179 if (restricted())
Guido van Rossum10393b11995-01-10 10:39:49 +0000180 return NULL;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000181 if (op->func_dict == NULL) {
182 op->func_dict = PyDict_New();
183 if (op->func_dict == NULL)
Barry Warsaw142865c2001-08-14 18:23:58 +0000184 return NULL;
185 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000186 Py_INCREF(op->func_dict);
187 return op->func_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000188}
189
Guido van Rossum0dabace1998-05-22 00:55:34 +0000190static int
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000191func_set_dict(PyFunctionObject *op, PyObject *value)
Guido van Rossum0dabace1998-05-22 00:55:34 +0000192{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000193 PyObject *tmp;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000194
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000195 if (restricted())
196 return -1;
197 /* It is illegal to del f.func_dict */
198 if (value == NULL) {
199 PyErr_SetString(PyExc_TypeError,
200 "function's dictionary may not be deleted");
Guido van Rossum0dabace1998-05-22 00:55:34 +0000201 return -1;
202 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000203 /* Can only set func_dict to a dictionary */
204 if (!PyDict_Check(value)) {
205 PyErr_SetString(PyExc_TypeError,
Barry Warsaw142865c2001-08-14 18:23:58 +0000206 "setting function's dictionary to a non-dict");
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000207 return -1;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000208 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000209 tmp = op->func_dict;
210 Py_INCREF(value);
211 op->func_dict = value;
212 Py_XDECREF(tmp);
213 return 0;
Guido van Rossum0dabace1998-05-22 00:55:34 +0000214}
215
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000216static PyObject *
217func_get_code(PyFunctionObject *op)
218{
219 if (restricted())
220 return NULL;
221 Py_INCREF(op->func_code);
222 return op->func_code;
223}
224
225static int
226func_set_code(PyFunctionObject *op, PyObject *value)
227{
228 PyObject *tmp;
229
230 if (restricted())
231 return -1;
232 /* Not legal to del f.func_code or to set it to anything
233 * other than a code object. */
234 if (value == NULL || !PyCode_Check(value)) {
235 PyErr_SetString(PyExc_TypeError,
236 "func_code must be set to a code object");
237 return -1;
238 }
239 tmp = op->func_code;
240 Py_INCREF(value);
241 op->func_code = value;
242 Py_DECREF(tmp);
243 return 0;
244}
245
246static PyObject *
247func_get_defaults(PyFunctionObject *op)
248{
249 if (restricted())
250 return NULL;
251 if (op->func_defaults == NULL) {
252 Py_INCREF(Py_None);
253 return Py_None;
254 }
255 Py_INCREF(op->func_defaults);
256 return op->func_defaults;
257}
258
259static int
260func_set_defaults(PyFunctionObject *op, PyObject *value)
261{
262 PyObject *tmp;
263
264 if (restricted())
265 return -1;
266 /* Legal to del f.func_defaults.
267 * Can only set func_defaults to NULL or a tuple. */
268 if (value == Py_None)
269 value = NULL;
270 if (value != NULL && !PyTuple_Check(value)) {
271 PyErr_SetString(PyExc_TypeError,
272 "func_defaults must be set to a tuple object");
273 return -1;
274 }
275 tmp = op->func_defaults;
276 Py_XINCREF(value);
277 op->func_defaults = value;
278 Py_XDECREF(tmp);
279 return 0;
280}
281
Guido van Rossum32d34c82001-09-20 21:45:26 +0000282static PyGetSetDef func_getsetlist[] = {
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000283 {"func_code", (getter)func_get_code, (setter)func_set_code},
284 {"func_defaults", (getter)func_get_defaults,
285 (setter)func_set_defaults},
286 {"func_dict", (getter)func_get_dict, (setter)func_set_dict},
287 {"__dict__", (getter)func_get_dict, (setter)func_set_dict},
288 {NULL} /* Sentinel */
289};
290
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000291PyDoc_STRVAR(func_doc,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000292"function(code, globals[, name[, argdefs[, closure]]])\n\
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000293\n\
294Create a function object from a code object and a dictionary.\n\
295The optional name string overrides the name from the code object.\n\
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000296The optional argdefs tuple specifies the default argument values.\n\
297The optional closure tuple supplies the bindings for free variables.");
298
299/* func_new() maintains the following invariants for closures. The
300 closure must correspond to the free variables of the code object.
301
302 if len(code.co_freevars) == 0:
303 closure = NULL
304 else:
305 len(closure) == len(code.co_freevars)
306 for every elt in closure, type(elt) == cell
307*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000308
309static PyObject *
310func_new(PyTypeObject* type, PyObject* args, PyObject* kw)
311{
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000312 PyCodeObject *code;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000313 PyObject *globals;
314 PyObject *name = Py_None;
315 PyObject *defaults = Py_None;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000316 PyObject *closure = Py_None;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000317 PyFunctionObject *newfunc;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000318 int nfree, nclosure;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000319
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000320 if (!PyArg_ParseTuple(args, "O!O!|OOO:function",
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000321 &PyCode_Type, &code,
322 &PyDict_Type, &globals,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000323 &name, &defaults, &closure))
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000324 return NULL;
325 if (name != Py_None && !PyString_Check(name)) {
326 PyErr_SetString(PyExc_TypeError,
327 "arg 3 (name) must be None or string");
328 return NULL;
329 }
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000330 if (defaults != Py_None && !PyTuple_Check(defaults)) {
331 PyErr_SetString(PyExc_TypeError,
332 "arg 4 (defaults) must be None or tuple");
333 return NULL;
334 }
335 nfree = PyTuple_GET_SIZE(code->co_freevars);
336 if (!PyTuple_Check(closure)) {
337 if (nfree && closure == Py_None) {
338 PyErr_SetString(PyExc_TypeError,
339 "arg 5 (closure) must be tuple");
340 return NULL;
341 }
342 else if (closure != Py_None) {
343 PyErr_SetString(PyExc_TypeError,
344 "arg 5 (closure) must be None or tuple");
345 return NULL;
346 }
347 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000348
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000349 /* check that the closure is well-formed */
350 nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure);
351 if (nfree != nclosure)
352 return PyErr_Format(PyExc_ValueError,
353 "%s requires closure of length %d, not %d",
354 PyString_AS_STRING(code->co_name),
355 nfree, nclosure);
356 if (nclosure) {
357 int i;
358 for (i = 0; i < nclosure; i++) {
359 PyObject *o = PyTuple_GET_ITEM(closure, i);
360 if (!PyCell_Check(o)) {
361 return PyErr_Format(PyExc_TypeError,
362 "arg 5 (closure) expected cell, found %s",
363 o->ob_type->tp_name);
364 }
365 }
366 }
367
368 newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code,
369 globals);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000370 if (newfunc == NULL)
371 return NULL;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000372
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000373 if (name != Py_None) {
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000374 Py_INCREF(name);
375 Py_DECREF(newfunc->func_name);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000376 newfunc->func_name = name;
377 }
378 if (defaults != Py_None) {
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000379 Py_INCREF(defaults);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000380 newfunc->func_defaults = defaults;
381 }
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000382 if (closure != Py_None) {
383 Py_INCREF(closure);
384 newfunc->func_closure = closure;
385 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000386
387 return (PyObject *)newfunc;
388}
389
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000390static void
Fred Drakeee238b92000-07-09 06:03:25 +0000391func_dealloc(PyFunctionObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000393 _PyObject_GC_UNTRACK(op);
Fred Drakec916f5a2001-10-26 17:56:51 +0000394 if (op->func_weakreflist != NULL)
395 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 Py_DECREF(op->func_code);
397 Py_DECREF(op->func_globals);
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000398 Py_XDECREF(op->func_module);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000399 Py_DECREF(op->func_name);
400 Py_XDECREF(op->func_defaults);
401 Py_XDECREF(op->func_doc);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000402 Py_XDECREF(op->func_dict);
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000403 Py_XDECREF(op->func_closure);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000404 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000405}
406
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000407static PyObject*
Fred Drakeee238b92000-07-09 06:03:25 +0000408func_repr(PyFunctionObject *op)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000409{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 if (op->func_name == Py_None)
Barry Warsaw7ce36942001-08-24 18:34:26 +0000411 return PyString_FromFormat("<anonymous function at %p>", op);
412 return PyString_FromFormat("<function %s at %p>",
413 PyString_AsString(op->func_name),
414 op);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000415}
416
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000417static int
Jeremy Hylton8caad492000-06-23 14:18:11 +0000418func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
419{
420 int err;
421 if (f->func_code) {
422 err = visit(f->func_code, arg);
423 if (err)
424 return err;
425 }
426 if (f->func_globals) {
427 err = visit(f->func_globals, arg);
428 if (err)
429 return err;
430 }
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000431 if (f->func_module) {
432 err = visit(f->func_module, arg);
433 if (err)
434 return err;
435 }
Jeremy Hylton8caad492000-06-23 14:18:11 +0000436 if (f->func_defaults) {
437 err = visit(f->func_defaults, arg);
438 if (err)
439 return err;
440 }
441 if (f->func_doc) {
442 err = visit(f->func_doc, arg);
443 if (err)
444 return err;
445 }
446 if (f->func_name) {
447 err = visit(f->func_name, arg);
448 if (err)
449 return err;
450 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000451 if (f->func_dict) {
452 err = visit(f->func_dict, arg);
453 if (err)
454 return err;
455 }
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000456 if (f->func_closure) {
457 err = visit(f->func_closure, arg);
458 if (err)
459 return err;
460 }
Jeremy Hylton8caad492000-06-23 14:18:11 +0000461 return 0;
462}
463
Tim Peters6d6c1a32001-08-02 04:15:00 +0000464static PyObject *
465function_call(PyObject *func, PyObject *arg, PyObject *kw)
466{
467 PyObject *result;
468 PyObject *argdefs;
469 PyObject **d, **k;
470 int nk, nd;
471
472 argdefs = PyFunction_GET_DEFAULTS(func);
473 if (argdefs != NULL && PyTuple_Check(argdefs)) {
474 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
475 nd = PyTuple_Size(argdefs);
476 }
477 else {
478 d = NULL;
479 nd = 0;
480 }
481
482 if (kw != NULL && PyDict_Check(kw)) {
483 int pos, i;
484 nk = PyDict_Size(kw);
485 k = PyMem_NEW(PyObject *, 2*nk);
486 if (k == NULL) {
487 PyErr_NoMemory();
Tim Peters6d6c1a32001-08-02 04:15:00 +0000488 return NULL;
489 }
490 pos = i = 0;
491 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
492 i += 2;
493 nk = i/2;
494 /* XXX This is broken if the caller deletes dict items! */
495 }
496 else {
497 k = NULL;
498 nk = 0;
499 }
500
501 result = PyEval_EvalCodeEx(
502 (PyCodeObject *)PyFunction_GET_CODE(func),
503 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
504 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
505 k, nk, d, nd,
506 PyFunction_GET_CLOSURE(func));
507
508 if (k != NULL)
509 PyMem_DEL(k);
510
511 return result;
512}
513
514/* Bind a function to an object */
515static PyObject *
516func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
517{
518 if (obj == Py_None)
519 obj = NULL;
520 return PyMethod_New(func, obj, type);
521}
522
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000523PyTypeObject PyFunction_Type = {
524 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000525 0,
526 "function",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000527 sizeof(PyFunctionObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000528 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +0000529 (destructor)func_dealloc, /* tp_dealloc */
530 0, /* tp_print */
531 0, /* tp_getattr */
532 0, /* tp_setattr */
533 0, /* tp_compare */
534 (reprfunc)func_repr, /* tp_repr */
535 0, /* tp_as_number */
536 0, /* tp_as_sequence */
537 0, /* tp_as_mapping */
538 0, /* tp_hash */
539 function_call, /* tp_call */
540 0, /* tp_str */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000541 PyObject_GenericGetAttr, /* tp_getattro */
542 PyObject_GenericSetAttr, /* tp_setattro */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000543 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000544 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000545 func_doc, /* tp_doc */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000546 (traverseproc)func_traverse, /* tp_traverse */
547 0, /* tp_clear */
548 0, /* tp_richcompare */
Fred Drakedb81e8d2001-03-23 04:19:27 +0000549 offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000550 0, /* tp_iter */
551 0, /* tp_iternext */
552 0, /* tp_methods */
553 func_memberlist, /* tp_members */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000554 func_getsetlist, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000555 0, /* tp_base */
556 0, /* tp_dict */
557 func_descr_get, /* tp_descr_get */
558 0, /* tp_descr_set */
559 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000560 0, /* tp_init */
561 0, /* tp_alloc */
562 func_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000563};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000564
565
566/* Class method object */
567
568/* A class method receives the class as implicit first argument,
569 just like an instance method receives the instance.
570 To declare a class method, use this idiom:
571
572 class C:
573 def f(cls, arg1, arg2, ...): ...
574 f = classmethod(f)
575
576 It can be called either on the class (e.g. C.f()) or on an instance
577 (e.g. C().f()); the instance is ignored except for its class.
578 If a class method is called for a derived class, the derived class
579 object is passed as the implied first argument.
580
581 Class methods are different than C++ or Java static methods.
582 If you want those, see static methods below.
583*/
584
585typedef struct {
586 PyObject_HEAD
587 PyObject *cm_callable;
588} classmethod;
589
590static void
591cm_dealloc(classmethod *cm)
592{
593 Py_XDECREF(cm->cm_callable);
Guido van Rossum9475a232001-10-05 20:51:39 +0000594 cm->ob_type->tp_free((PyObject *)cm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000595}
596
597static PyObject *
598cm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
599{
600 classmethod *cm = (classmethod *)self;
601
602 if (cm->cm_callable == NULL) {
603 PyErr_SetString(PyExc_RuntimeError,
604 "uninitialized classmethod object");
605 return NULL;
606 }
Guido van Rossum7e305482002-03-18 03:09:06 +0000607 if (type == NULL)
608 type = (PyObject *)(obj->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000609 return PyMethod_New(cm->cm_callable,
610 type, (PyObject *)(type->ob_type));
611}
612
613static int
614cm_init(PyObject *self, PyObject *args, PyObject *kwds)
615{
616 classmethod *cm = (classmethod *)self;
617 PyObject *callable;
618
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000619 if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000620 return -1;
621 Py_INCREF(callable);
622 cm->cm_callable = callable;
623 return 0;
624}
625
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000626PyDoc_STRVAR(classmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000627"classmethod(function) -> method\n\
628\n\
629Convert a function to be a class method.\n\
630\n\
631A class method receives the class as implicit first argument,\n\
632just like an instance method receives the instance.\n\
633To declare a class method, use this idiom:\n\
634\n\
635 class C:\n\
636 def f(cls, arg1, arg2, ...): ...\n\
637 f = classmethod(f)\n\
638\n\
639It can be called either on the class (e.g. C.f()) or on an instance\n\
640(e.g. C().f()). The instance is ignored except for its class.\n\
641If a class method is called for a derived class, the derived class\n\
642object is passed as the implied first argument.\n\
Sjoerd Mullender564980b2001-12-17 11:39:56 +0000643\n\
Guido van Rossum33c1a882001-12-17 02:53:53 +0000644Class methods are different than C++ or Java static methods.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000645If you want those, see the staticmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000646
Tim Peters6d6c1a32001-08-02 04:15:00 +0000647PyTypeObject PyClassMethod_Type = {
648 PyObject_HEAD_INIT(&PyType_Type)
649 0,
650 "classmethod",
651 sizeof(classmethod),
652 0,
653 (destructor)cm_dealloc, /* tp_dealloc */
654 0, /* tp_print */
655 0, /* tp_getattr */
656 0, /* tp_setattr */
657 0, /* tp_compare */
658 0, /* tp_repr */
659 0, /* tp_as_number */
660 0, /* tp_as_sequence */
661 0, /* tp_as_mapping */
662 0, /* tp_hash */
663 0, /* tp_call */
664 0, /* tp_str */
665 PyObject_GenericGetAttr, /* tp_getattro */
666 0, /* tp_setattro */
667 0, /* tp_as_buffer */
668 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum33c1a882001-12-17 02:53:53 +0000669 classmethod_doc, /* tp_doc */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000670 0, /* tp_traverse */
671 0, /* tp_clear */
672 0, /* tp_richcompare */
673 0, /* tp_weaklistoffset */
674 0, /* tp_iter */
675 0, /* tp_iternext */
676 0, /* tp_methods */
677 0, /* tp_members */
678 0, /* tp_getset */
679 0, /* tp_base */
680 0, /* tp_dict */
681 cm_descr_get, /* tp_descr_get */
682 0, /* tp_descr_set */
683 0, /* tp_dictoffset */
684 cm_init, /* tp_init */
685 PyType_GenericAlloc, /* tp_alloc */
686 PyType_GenericNew, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +0000687 PyObject_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000688};
689
690PyObject *
691PyClassMethod_New(PyObject *callable)
692{
693 classmethod *cm = (classmethod *)
694 PyType_GenericAlloc(&PyClassMethod_Type, 0);
695 if (cm != NULL) {
696 Py_INCREF(callable);
697 cm->cm_callable = callable;
698 }
699 return (PyObject *)cm;
700}
701
702
703/* Static method object */
704
705/* A static method does not receive an implicit first argument.
706 To declare a static method, use this idiom:
707
708 class C:
709 def f(arg1, arg2, ...): ...
710 f = staticmethod(f)
711
712 It can be called either on the class (e.g. C.f()) or on an instance
713 (e.g. C().f()); the instance is ignored except for its class.
714
715 Static methods in Python are similar to those found in Java or C++.
716 For a more advanced concept, see class methods above.
717*/
718
719typedef struct {
720 PyObject_HEAD
721 PyObject *sm_callable;
722} staticmethod;
723
724static void
725sm_dealloc(staticmethod *sm)
726{
727 Py_XDECREF(sm->sm_callable);
Guido van Rossum9475a232001-10-05 20:51:39 +0000728 sm->ob_type->tp_free((PyObject *)sm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000729}
730
731static PyObject *
732sm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
733{
734 staticmethod *sm = (staticmethod *)self;
735
736 if (sm->sm_callable == NULL) {
737 PyErr_SetString(PyExc_RuntimeError,
738 "uninitialized staticmethod object");
739 return NULL;
740 }
741 Py_INCREF(sm->sm_callable);
742 return sm->sm_callable;
743}
744
745static int
746sm_init(PyObject *self, PyObject *args, PyObject *kwds)
747{
748 staticmethod *sm = (staticmethod *)self;
749 PyObject *callable;
750
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000751 if (!PyArg_UnpackTuple(args, "staticmethod", 1, 1, &callable))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000752 return -1;
753 Py_INCREF(callable);
754 sm->sm_callable = callable;
755 return 0;
756}
757
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000758PyDoc_STRVAR(staticmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000759"staticmethod(function) -> method\n\
760\n\
761Convert a function to be a static method.\n\
762\n\
763A static method does not receive an implicit first argument.\n\
764To declare a static method, use this idiom:\n\
765\n\
766 class C:\n\
767 def f(arg1, arg2, ...): ...\n\
768 f = staticmethod(f)\n\
769\n\
770It can be called either on the class (e.g. C.f()) or on an instance\n\
771(e.g. C().f()). The instance is ignored except for its class.\n\
772\n\
773Static methods in Python are similar to those found in Java or C++.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000774For a more advanced concept, see the classmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000775
Tim Peters6d6c1a32001-08-02 04:15:00 +0000776PyTypeObject PyStaticMethod_Type = {
777 PyObject_HEAD_INIT(&PyType_Type)
778 0,
779 "staticmethod",
780 sizeof(staticmethod),
781 0,
782 (destructor)sm_dealloc, /* tp_dealloc */
783 0, /* tp_print */
784 0, /* tp_getattr */
785 0, /* tp_setattr */
786 0, /* tp_compare */
787 0, /* tp_repr */
788 0, /* tp_as_number */
789 0, /* tp_as_sequence */
790 0, /* tp_as_mapping */
791 0, /* tp_hash */
792 0, /* tp_call */
793 0, /* tp_str */
794 PyObject_GenericGetAttr, /* tp_getattro */
795 0, /* tp_setattro */
796 0, /* tp_as_buffer */
797 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum33c1a882001-12-17 02:53:53 +0000798 staticmethod_doc, /* tp_doc */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000799 0, /* tp_traverse */
800 0, /* tp_clear */
801 0, /* tp_richcompare */
802 0, /* tp_weaklistoffset */
803 0, /* tp_iter */
804 0, /* tp_iternext */
805 0, /* tp_methods */
806 0, /* tp_members */
807 0, /* tp_getset */
808 0, /* tp_base */
809 0, /* tp_dict */
810 sm_descr_get, /* tp_descr_get */
811 0, /* tp_descr_set */
812 0, /* tp_dictoffset */
813 sm_init, /* tp_init */
814 PyType_GenericAlloc, /* tp_alloc */
815 PyType_GenericNew, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +0000816 PyObject_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000817};
818
819PyObject *
820PyStaticMethod_New(PyObject *callable)
821{
822 staticmethod *sm = (staticmethod *)
823 PyType_GenericAlloc(&PyStaticMethod_Type, 0);
824 if (sm != NULL) {
825 Py_INCREF(callable);
826 sm->sm_callable = callable;
827 }
828 return (PyObject *)sm;
829}