blob: 76acf9865cb4d8edbb1926736bb78111350a3d99 [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 Rossumd9d1d4a2001-09-17 23:46:56 +0000159#define RR ()
160
Guido van Rossum6f799372001-09-20 20:46:19 +0000161static PyMemberDef func_memberlist[] = {
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000162 {"func_closure", T_OBJECT, OFF(func_closure),
163 RESTRICTED|READONLY},
164 {"func_doc", T_OBJECT, OFF(func_doc), WRITE_RESTRICTED},
165 {"__doc__", T_OBJECT, OFF(func_doc), WRITE_RESTRICTED},
166 {"func_globals", T_OBJECT, OFF(func_globals),
167 RESTRICTED|READONLY},
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000168 {"func_name", T_OBJECT, OFF(func_name), READONLY},
169 {"__name__", T_OBJECT, OFF(func_name), READONLY},
Guido van Rossum6b29c012003-02-18 17:18:35 +0000170 {"__module__", T_OBJECT, OFF(func_module), WRITE_RESTRICTED},
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000171 {NULL} /* Sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000172};
173
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000174static int
175restricted(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000176{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000177 if (!PyEval_GetRestricted())
178 return 0;
179 PyErr_SetString(PyExc_RuntimeError,
180 "function attributes not accessible in restricted mode");
181 return 1;
182}
183
184static PyObject *
185func_get_dict(PyFunctionObject *op)
186{
187 if (restricted())
Guido van Rossum10393b11995-01-10 10:39:49 +0000188 return NULL;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000189 if (op->func_dict == NULL) {
190 op->func_dict = PyDict_New();
191 if (op->func_dict == NULL)
Barry Warsaw142865c2001-08-14 18:23:58 +0000192 return NULL;
193 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000194 Py_INCREF(op->func_dict);
195 return op->func_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000196}
197
Guido van Rossum0dabace1998-05-22 00:55:34 +0000198static int
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000199func_set_dict(PyFunctionObject *op, PyObject *value)
Guido van Rossum0dabace1998-05-22 00:55:34 +0000200{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000201 PyObject *tmp;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000202
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000203 if (restricted())
204 return -1;
205 /* It is illegal to del f.func_dict */
206 if (value == NULL) {
207 PyErr_SetString(PyExc_TypeError,
208 "function's dictionary may not be deleted");
Guido van Rossum0dabace1998-05-22 00:55:34 +0000209 return -1;
210 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000211 /* Can only set func_dict to a dictionary */
212 if (!PyDict_Check(value)) {
213 PyErr_SetString(PyExc_TypeError,
Barry Warsaw142865c2001-08-14 18:23:58 +0000214 "setting function's dictionary to a non-dict");
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000215 return -1;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000216 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000217 tmp = op->func_dict;
218 Py_INCREF(value);
219 op->func_dict = value;
220 Py_XDECREF(tmp);
221 return 0;
Guido van Rossum0dabace1998-05-22 00:55:34 +0000222}
223
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000224static PyObject *
225func_get_code(PyFunctionObject *op)
226{
227 if (restricted())
228 return NULL;
229 Py_INCREF(op->func_code);
230 return op->func_code;
231}
232
233static int
234func_set_code(PyFunctionObject *op, PyObject *value)
235{
236 PyObject *tmp;
237
238 if (restricted())
239 return -1;
240 /* Not legal to del f.func_code or to set it to anything
241 * other than a code object. */
242 if (value == NULL || !PyCode_Check(value)) {
243 PyErr_SetString(PyExc_TypeError,
244 "func_code must be set to a code object");
245 return -1;
246 }
247 tmp = op->func_code;
248 Py_INCREF(value);
249 op->func_code = value;
250 Py_DECREF(tmp);
251 return 0;
252}
253
254static PyObject *
255func_get_defaults(PyFunctionObject *op)
256{
257 if (restricted())
258 return NULL;
259 if (op->func_defaults == NULL) {
260 Py_INCREF(Py_None);
261 return Py_None;
262 }
263 Py_INCREF(op->func_defaults);
264 return op->func_defaults;
265}
266
267static int
268func_set_defaults(PyFunctionObject *op, PyObject *value)
269{
270 PyObject *tmp;
271
272 if (restricted())
273 return -1;
274 /* Legal to del f.func_defaults.
275 * Can only set func_defaults to NULL or a tuple. */
276 if (value == Py_None)
277 value = NULL;
278 if (value != NULL && !PyTuple_Check(value)) {
279 PyErr_SetString(PyExc_TypeError,
280 "func_defaults must be set to a tuple object");
281 return -1;
282 }
283 tmp = op->func_defaults;
284 Py_XINCREF(value);
285 op->func_defaults = value;
286 Py_XDECREF(tmp);
287 return 0;
288}
289
Guido van Rossum32d34c82001-09-20 21:45:26 +0000290static PyGetSetDef func_getsetlist[] = {
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000291 {"func_code", (getter)func_get_code, (setter)func_set_code},
292 {"func_defaults", (getter)func_get_defaults,
293 (setter)func_set_defaults},
294 {"func_dict", (getter)func_get_dict, (setter)func_set_dict},
295 {"__dict__", (getter)func_get_dict, (setter)func_set_dict},
296 {NULL} /* Sentinel */
297};
298
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000299PyDoc_STRVAR(func_doc,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000300"function(code, globals[, name[, argdefs[, closure]]])\n\
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000301\n\
302Create a function object from a code object and a dictionary.\n\
303The optional name string overrides the name from the code object.\n\
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000304The optional argdefs tuple specifies the default argument values.\n\
305The optional closure tuple supplies the bindings for free variables.");
306
307/* func_new() maintains the following invariants for closures. The
308 closure must correspond to the free variables of the code object.
309
310 if len(code.co_freevars) == 0:
311 closure = NULL
312 else:
313 len(closure) == len(code.co_freevars)
314 for every elt in closure, type(elt) == cell
315*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000316
317static PyObject *
318func_new(PyTypeObject* type, PyObject* args, PyObject* kw)
319{
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000320 PyCodeObject *code;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000321 PyObject *globals;
322 PyObject *name = Py_None;
323 PyObject *defaults = Py_None;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000324 PyObject *closure = Py_None;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000325 PyFunctionObject *newfunc;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000326 int nfree, nclosure;
Raymond Hettinger86578452003-05-06 09:01:41 +0000327 static char *kwlist[] = {"code", "globals", "name",
328 "argdefs", "closure", 0};
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000329
Raymond Hettinger86578452003-05-06 09:01:41 +0000330 if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!|OOO:function",
331 kwlist,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000332 &PyCode_Type, &code,
333 &PyDict_Type, &globals,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000334 &name, &defaults, &closure))
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000335 return NULL;
336 if (name != Py_None && !PyString_Check(name)) {
337 PyErr_SetString(PyExc_TypeError,
338 "arg 3 (name) must be None or string");
339 return NULL;
340 }
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000341 if (defaults != Py_None && !PyTuple_Check(defaults)) {
342 PyErr_SetString(PyExc_TypeError,
343 "arg 4 (defaults) must be None or tuple");
344 return NULL;
345 }
346 nfree = PyTuple_GET_SIZE(code->co_freevars);
347 if (!PyTuple_Check(closure)) {
348 if (nfree && closure == Py_None) {
349 PyErr_SetString(PyExc_TypeError,
350 "arg 5 (closure) must be tuple");
351 return NULL;
352 }
353 else if (closure != Py_None) {
354 PyErr_SetString(PyExc_TypeError,
355 "arg 5 (closure) must be None or tuple");
356 return NULL;
357 }
358 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000359
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000360 /* check that the closure is well-formed */
361 nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure);
362 if (nfree != nclosure)
363 return PyErr_Format(PyExc_ValueError,
364 "%s requires closure of length %d, not %d",
365 PyString_AS_STRING(code->co_name),
366 nfree, nclosure);
367 if (nclosure) {
368 int i;
369 for (i = 0; i < nclosure; i++) {
370 PyObject *o = PyTuple_GET_ITEM(closure, i);
371 if (!PyCell_Check(o)) {
372 return PyErr_Format(PyExc_TypeError,
373 "arg 5 (closure) expected cell, found %s",
374 o->ob_type->tp_name);
375 }
376 }
377 }
378
379 newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code,
380 globals);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000381 if (newfunc == NULL)
382 return NULL;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000383
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000384 if (name != Py_None) {
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000385 Py_INCREF(name);
386 Py_DECREF(newfunc->func_name);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000387 newfunc->func_name = name;
388 }
389 if (defaults != Py_None) {
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000390 Py_INCREF(defaults);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000391 newfunc->func_defaults = defaults;
392 }
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000393 if (closure != Py_None) {
394 Py_INCREF(closure);
395 newfunc->func_closure = closure;
396 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000397
398 return (PyObject *)newfunc;
399}
400
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401static void
Fred Drakeee238b92000-07-09 06:03:25 +0000402func_dealloc(PyFunctionObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000403{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000404 _PyObject_GC_UNTRACK(op);
Fred Drakec916f5a2001-10-26 17:56:51 +0000405 if (op->func_weakreflist != NULL)
406 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000407 Py_DECREF(op->func_code);
408 Py_DECREF(op->func_globals);
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000409 Py_XDECREF(op->func_module);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 Py_DECREF(op->func_name);
411 Py_XDECREF(op->func_defaults);
412 Py_XDECREF(op->func_doc);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000413 Py_XDECREF(op->func_dict);
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000414 Py_XDECREF(op->func_closure);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000415 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000416}
417
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418static PyObject*
Fred Drakeee238b92000-07-09 06:03:25 +0000419func_repr(PyFunctionObject *op)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000420{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421 if (op->func_name == Py_None)
Barry Warsaw7ce36942001-08-24 18:34:26 +0000422 return PyString_FromFormat("<anonymous function at %p>", op);
423 return PyString_FromFormat("<function %s at %p>",
424 PyString_AsString(op->func_name),
425 op);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000426}
427
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000428static int
Jeremy Hylton8caad492000-06-23 14:18:11 +0000429func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
430{
431 int err;
432 if (f->func_code) {
433 err = visit(f->func_code, arg);
434 if (err)
435 return err;
436 }
437 if (f->func_globals) {
438 err = visit(f->func_globals, arg);
439 if (err)
440 return err;
441 }
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000442 if (f->func_module) {
443 err = visit(f->func_module, arg);
444 if (err)
445 return err;
446 }
Jeremy Hylton8caad492000-06-23 14:18:11 +0000447 if (f->func_defaults) {
448 err = visit(f->func_defaults, arg);
449 if (err)
450 return err;
451 }
452 if (f->func_doc) {
453 err = visit(f->func_doc, arg);
454 if (err)
455 return err;
456 }
457 if (f->func_name) {
458 err = visit(f->func_name, arg);
459 if (err)
460 return err;
461 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000462 if (f->func_dict) {
463 err = visit(f->func_dict, arg);
464 if (err)
465 return err;
466 }
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000467 if (f->func_closure) {
468 err = visit(f->func_closure, arg);
469 if (err)
470 return err;
471 }
Jeremy Hylton8caad492000-06-23 14:18:11 +0000472 return 0;
473}
474
Tim Peters6d6c1a32001-08-02 04:15:00 +0000475static PyObject *
476function_call(PyObject *func, PyObject *arg, PyObject *kw)
477{
478 PyObject *result;
479 PyObject *argdefs;
480 PyObject **d, **k;
481 int nk, nd;
482
483 argdefs = PyFunction_GET_DEFAULTS(func);
484 if (argdefs != NULL && PyTuple_Check(argdefs)) {
485 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
486 nd = PyTuple_Size(argdefs);
487 }
488 else {
489 d = NULL;
490 nd = 0;
491 }
492
493 if (kw != NULL && PyDict_Check(kw)) {
494 int pos, i;
495 nk = PyDict_Size(kw);
496 k = PyMem_NEW(PyObject *, 2*nk);
497 if (k == NULL) {
498 PyErr_NoMemory();
Tim Peters6d6c1a32001-08-02 04:15:00 +0000499 return NULL;
500 }
501 pos = i = 0;
502 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
503 i += 2;
504 nk = i/2;
505 /* XXX This is broken if the caller deletes dict items! */
506 }
507 else {
508 k = NULL;
509 nk = 0;
510 }
511
512 result = PyEval_EvalCodeEx(
513 (PyCodeObject *)PyFunction_GET_CODE(func),
514 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
515 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
516 k, nk, d, nd,
517 PyFunction_GET_CLOSURE(func));
518
519 if (k != NULL)
520 PyMem_DEL(k);
521
522 return result;
523}
524
525/* Bind a function to an object */
526static PyObject *
527func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
528{
529 if (obj == Py_None)
530 obj = NULL;
531 return PyMethod_New(func, obj, type);
532}
533
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534PyTypeObject PyFunction_Type = {
535 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000536 0,
537 "function",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000538 sizeof(PyFunctionObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000539 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +0000540 (destructor)func_dealloc, /* tp_dealloc */
541 0, /* tp_print */
542 0, /* tp_getattr */
543 0, /* tp_setattr */
544 0, /* tp_compare */
545 (reprfunc)func_repr, /* tp_repr */
546 0, /* tp_as_number */
547 0, /* tp_as_sequence */
548 0, /* tp_as_mapping */
549 0, /* tp_hash */
550 function_call, /* tp_call */
551 0, /* tp_str */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000552 PyObject_GenericGetAttr, /* tp_getattro */
553 PyObject_GenericSetAttr, /* tp_setattro */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000554 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000555 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000556 func_doc, /* tp_doc */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000557 (traverseproc)func_traverse, /* tp_traverse */
558 0, /* tp_clear */
559 0, /* tp_richcompare */
Fred Drakedb81e8d2001-03-23 04:19:27 +0000560 offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000561 0, /* tp_iter */
562 0, /* tp_iternext */
563 0, /* tp_methods */
564 func_memberlist, /* tp_members */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000565 func_getsetlist, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000566 0, /* tp_base */
567 0, /* tp_dict */
568 func_descr_get, /* tp_descr_get */
569 0, /* tp_descr_set */
570 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000571 0, /* tp_init */
572 0, /* tp_alloc */
573 func_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000574};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000575
576
577/* Class method object */
578
579/* A class method receives the class as implicit first argument,
580 just like an instance method receives the instance.
581 To declare a class method, use this idiom:
582
583 class C:
584 def f(cls, arg1, arg2, ...): ...
585 f = classmethod(f)
586
587 It can be called either on the class (e.g. C.f()) or on an instance
588 (e.g. C().f()); the instance is ignored except for its class.
589 If a class method is called for a derived class, the derived class
590 object is passed as the implied first argument.
591
592 Class methods are different than C++ or Java static methods.
593 If you want those, see static methods below.
594*/
595
596typedef struct {
597 PyObject_HEAD
598 PyObject *cm_callable;
599} classmethod;
600
601static void
602cm_dealloc(classmethod *cm)
603{
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000604 _PyObject_GC_UNTRACK((PyObject *)cm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000605 Py_XDECREF(cm->cm_callable);
Guido van Rossum9475a232001-10-05 20:51:39 +0000606 cm->ob_type->tp_free((PyObject *)cm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000607}
608
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000609static int
610cm_traverse(classmethod *cm, visitproc visit, void *arg)
611{
612 if (!cm->cm_callable)
613 return 0;
614 return visit(cm->cm_callable, arg);
615}
616
617static int
618cm_clear(classmethod *cm)
619{
620 Py_XDECREF(cm->cm_callable);
621 cm->cm_callable = NULL;
622
623 return 0;
624}
625
626
Tim Peters6d6c1a32001-08-02 04:15:00 +0000627static PyObject *
628cm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
629{
630 classmethod *cm = (classmethod *)self;
631
632 if (cm->cm_callable == NULL) {
633 PyErr_SetString(PyExc_RuntimeError,
634 "uninitialized classmethod object");
635 return NULL;
636 }
Guido van Rossum7e305482002-03-18 03:09:06 +0000637 if (type == NULL)
638 type = (PyObject *)(obj->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000639 return PyMethod_New(cm->cm_callable,
640 type, (PyObject *)(type->ob_type));
641}
642
643static int
644cm_init(PyObject *self, PyObject *args, PyObject *kwds)
645{
646 classmethod *cm = (classmethod *)self;
647 PyObject *callable;
648
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000649 if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000650 return -1;
Raymond Hettingerbe971532003-06-18 01:13:41 +0000651 if (!PyCallable_Check(callable)) {
652 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
653 callable->ob_type->tp_name);
654 return -1;
655 }
656
Tim Peters6d6c1a32001-08-02 04:15:00 +0000657 Py_INCREF(callable);
658 cm->cm_callable = callable;
659 return 0;
660}
661
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000662PyDoc_STRVAR(classmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000663"classmethod(function) -> method\n\
664\n\
665Convert a function to be a class method.\n\
666\n\
667A class method receives the class as implicit first argument,\n\
668just like an instance method receives the instance.\n\
669To declare a class method, use this idiom:\n\
670\n\
671 class C:\n\
672 def f(cls, arg1, arg2, ...): ...\n\
673 f = classmethod(f)\n\
674\n\
675It can be called either on the class (e.g. C.f()) or on an instance\n\
676(e.g. C().f()). The instance is ignored except for its class.\n\
677If a class method is called for a derived class, the derived class\n\
678object is passed as the implied first argument.\n\
Sjoerd Mullender564980b2001-12-17 11:39:56 +0000679\n\
Guido van Rossum33c1a882001-12-17 02:53:53 +0000680Class methods are different than C++ or Java static methods.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000681If you want those, see the staticmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000682
Tim Peters6d6c1a32001-08-02 04:15:00 +0000683PyTypeObject PyClassMethod_Type = {
684 PyObject_HEAD_INIT(&PyType_Type)
685 0,
686 "classmethod",
687 sizeof(classmethod),
688 0,
689 (destructor)cm_dealloc, /* tp_dealloc */
690 0, /* tp_print */
691 0, /* tp_getattr */
692 0, /* tp_setattr */
693 0, /* tp_compare */
694 0, /* tp_repr */
695 0, /* tp_as_number */
696 0, /* tp_as_sequence */
697 0, /* tp_as_mapping */
698 0, /* tp_hash */
699 0, /* tp_call */
700 0, /* tp_str */
701 PyObject_GenericGetAttr, /* tp_getattro */
702 0, /* tp_setattro */
703 0, /* tp_as_buffer */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000704 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000705 classmethod_doc, /* tp_doc */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000706 (traverseproc)cm_traverse, /* tp_traverse */
707 (inquiry)cm_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000708 0, /* tp_richcompare */
709 0, /* tp_weaklistoffset */
710 0, /* tp_iter */
711 0, /* tp_iternext */
712 0, /* tp_methods */
713 0, /* tp_members */
714 0, /* tp_getset */
715 0, /* tp_base */
716 0, /* tp_dict */
717 cm_descr_get, /* tp_descr_get */
718 0, /* tp_descr_set */
719 0, /* tp_dictoffset */
720 cm_init, /* tp_init */
721 PyType_GenericAlloc, /* tp_alloc */
722 PyType_GenericNew, /* tp_new */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000723 PyObject_GC_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000724};
725
726PyObject *
727PyClassMethod_New(PyObject *callable)
728{
729 classmethod *cm = (classmethod *)
730 PyType_GenericAlloc(&PyClassMethod_Type, 0);
731 if (cm != NULL) {
732 Py_INCREF(callable);
733 cm->cm_callable = callable;
734 }
735 return (PyObject *)cm;
736}
737
738
739/* Static method object */
740
741/* A static method does not receive an implicit first argument.
742 To declare a static method, use this idiom:
743
744 class C:
745 def f(arg1, arg2, ...): ...
746 f = staticmethod(f)
747
748 It can be called either on the class (e.g. C.f()) or on an instance
749 (e.g. C().f()); the instance is ignored except for its class.
750
751 Static methods in Python are similar to those found in Java or C++.
752 For a more advanced concept, see class methods above.
753*/
754
755typedef struct {
756 PyObject_HEAD
757 PyObject *sm_callable;
758} staticmethod;
759
760static void
761sm_dealloc(staticmethod *sm)
762{
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000763 _PyObject_GC_UNTRACK((PyObject *)sm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000764 Py_XDECREF(sm->sm_callable);
Guido van Rossum9475a232001-10-05 20:51:39 +0000765 sm->ob_type->tp_free((PyObject *)sm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000766}
767
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000768static int
769sm_traverse(staticmethod *sm, visitproc visit, void *arg)
770{
771 if (!sm->sm_callable)
772 return 0;
773 return visit(sm->sm_callable, arg);
774}
775
776static int
777sm_clear(staticmethod *sm)
778{
779 Py_XDECREF(sm->sm_callable);
780 sm->sm_callable = NULL;
781
782 return 0;
783}
784
Tim Peters6d6c1a32001-08-02 04:15:00 +0000785static PyObject *
786sm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
787{
788 staticmethod *sm = (staticmethod *)self;
789
790 if (sm->sm_callable == NULL) {
791 PyErr_SetString(PyExc_RuntimeError,
792 "uninitialized staticmethod object");
793 return NULL;
794 }
795 Py_INCREF(sm->sm_callable);
796 return sm->sm_callable;
797}
798
799static int
800sm_init(PyObject *self, PyObject *args, PyObject *kwds)
801{
802 staticmethod *sm = (staticmethod *)self;
803 PyObject *callable;
804
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000805 if (!PyArg_UnpackTuple(args, "staticmethod", 1, 1, &callable))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000806 return -1;
807 Py_INCREF(callable);
808 sm->sm_callable = callable;
809 return 0;
810}
811
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000812PyDoc_STRVAR(staticmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000813"staticmethod(function) -> method\n\
814\n\
815Convert a function to be a static method.\n\
816\n\
817A static method does not receive an implicit first argument.\n\
818To declare a static method, use this idiom:\n\
819\n\
820 class C:\n\
821 def f(arg1, arg2, ...): ...\n\
822 f = staticmethod(f)\n\
823\n\
824It can be called either on the class (e.g. C.f()) or on an instance\n\
825(e.g. C().f()). The instance is ignored except for its class.\n\
826\n\
827Static methods in Python are similar to those found in Java or C++.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000828For a more advanced concept, see the classmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000829
Tim Peters6d6c1a32001-08-02 04:15:00 +0000830PyTypeObject PyStaticMethod_Type = {
831 PyObject_HEAD_INIT(&PyType_Type)
832 0,
833 "staticmethod",
834 sizeof(staticmethod),
835 0,
836 (destructor)sm_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 staticmethod_doc, /* tp_doc */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000853 (traverseproc)sm_traverse, /* tp_traverse */
854 (inquiry)sm_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 sm_descr_get, /* tp_descr_get */
865 0, /* tp_descr_set */
866 0, /* tp_dictoffset */
867 sm_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 *
874PyStaticMethod_New(PyObject *callable)
875{
876 staticmethod *sm = (staticmethod *)
877 PyType_GenericAlloc(&PyStaticMethod_Type, 0);
878 if (sm != NULL) {
879 Py_INCREF(callable);
880 sm->sm_callable = callable;
881 }
882 return (PyObject *)sm;
883}