blob: c46887c96b553b9a993c01eec25545d04bac1390 [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},
Guido van Rossum6b29c012003-02-18 17:18:35 +0000166 {"__module__", T_OBJECT, OFF(func_module), WRITE_RESTRICTED},
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000167 {NULL} /* Sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000168};
169
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000170static int
171restricted(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000172{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000173 if (!PyEval_GetRestricted())
174 return 0;
175 PyErr_SetString(PyExc_RuntimeError,
176 "function attributes not accessible in restricted mode");
177 return 1;
178}
179
180static PyObject *
181func_get_dict(PyFunctionObject *op)
182{
183 if (restricted())
Guido van Rossum10393b11995-01-10 10:39:49 +0000184 return NULL;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000185 if (op->func_dict == NULL) {
186 op->func_dict = PyDict_New();
187 if (op->func_dict == NULL)
Barry Warsaw142865c2001-08-14 18:23:58 +0000188 return NULL;
189 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000190 Py_INCREF(op->func_dict);
191 return op->func_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000192}
193
Guido van Rossum0dabace1998-05-22 00:55:34 +0000194static int
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000195func_set_dict(PyFunctionObject *op, PyObject *value)
Guido van Rossum0dabace1998-05-22 00:55:34 +0000196{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000197 PyObject *tmp;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000198
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000199 if (restricted())
200 return -1;
201 /* It is illegal to del f.func_dict */
202 if (value == NULL) {
203 PyErr_SetString(PyExc_TypeError,
204 "function's dictionary may not be deleted");
Guido van Rossum0dabace1998-05-22 00:55:34 +0000205 return -1;
206 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000207 /* Can only set func_dict to a dictionary */
208 if (!PyDict_Check(value)) {
209 PyErr_SetString(PyExc_TypeError,
Barry Warsaw142865c2001-08-14 18:23:58 +0000210 "setting function's dictionary to a non-dict");
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000211 return -1;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000212 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000213 tmp = op->func_dict;
214 Py_INCREF(value);
215 op->func_dict = value;
216 Py_XDECREF(tmp);
217 return 0;
Guido van Rossum0dabace1998-05-22 00:55:34 +0000218}
219
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000220static PyObject *
221func_get_code(PyFunctionObject *op)
222{
223 if (restricted())
224 return NULL;
225 Py_INCREF(op->func_code);
226 return op->func_code;
227}
228
229static int
230func_set_code(PyFunctionObject *op, PyObject *value)
231{
232 PyObject *tmp;
233
234 if (restricted())
235 return -1;
236 /* Not legal to del f.func_code or to set it to anything
237 * other than a code object. */
238 if (value == NULL || !PyCode_Check(value)) {
239 PyErr_SetString(PyExc_TypeError,
240 "func_code must be set to a code object");
241 return -1;
242 }
243 tmp = op->func_code;
244 Py_INCREF(value);
245 op->func_code = value;
246 Py_DECREF(tmp);
247 return 0;
248}
249
250static PyObject *
Michael W. Hudson5e897952004-08-12 18:12:44 +0000251func_get_name(PyFunctionObject *op)
252{
253 if (restricted())
254 return NULL;
255 Py_INCREF(op->func_name);
256 return op->func_name;
257}
258
259static int
260func_set_name(PyFunctionObject *op, PyObject *value)
261{
262 PyObject *tmp;
263
264 if (restricted())
265 return -1;
266 /* Not legal to del f.func_name or to set it to anything
267 * other than a string object. */
268 if (value == NULL || !PyString_Check(value)) {
269 PyErr_SetString(PyExc_TypeError,
270 "func_name must be set to a string object");
271 return -1;
272 }
273 tmp = op->func_name;
274 Py_INCREF(value);
275 op->func_name = value;
276 Py_DECREF(tmp);
277 return 0;
278}
279
280static PyObject *
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000281func_get_defaults(PyFunctionObject *op)
282{
283 if (restricted())
284 return NULL;
285 if (op->func_defaults == NULL) {
286 Py_INCREF(Py_None);
287 return Py_None;
288 }
289 Py_INCREF(op->func_defaults);
290 return op->func_defaults;
291}
292
293static int
294func_set_defaults(PyFunctionObject *op, PyObject *value)
295{
296 PyObject *tmp;
297
298 if (restricted())
299 return -1;
300 /* Legal to del f.func_defaults.
301 * Can only set func_defaults to NULL or a tuple. */
302 if (value == Py_None)
303 value = NULL;
304 if (value != NULL && !PyTuple_Check(value)) {
305 PyErr_SetString(PyExc_TypeError,
306 "func_defaults must be set to a tuple object");
307 return -1;
308 }
309 tmp = op->func_defaults;
310 Py_XINCREF(value);
311 op->func_defaults = value;
312 Py_XDECREF(tmp);
313 return 0;
314}
315
Guido van Rossum32d34c82001-09-20 21:45:26 +0000316static PyGetSetDef func_getsetlist[] = {
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000317 {"func_code", (getter)func_get_code, (setter)func_set_code},
318 {"func_defaults", (getter)func_get_defaults,
319 (setter)func_set_defaults},
320 {"func_dict", (getter)func_get_dict, (setter)func_set_dict},
321 {"__dict__", (getter)func_get_dict, (setter)func_set_dict},
Michael W. Hudson5e897952004-08-12 18:12:44 +0000322 {"func_name", (getter)func_get_name, (setter)func_set_name},
323 {"__name__", (getter)func_get_name, (setter)func_set_name},
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000324 {NULL} /* Sentinel */
325};
326
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000327PyDoc_STRVAR(func_doc,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000328"function(code, globals[, name[, argdefs[, closure]]])\n\
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000329\n\
330Create a function object from a code object and a dictionary.\n\
331The optional name string overrides the name from the code object.\n\
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000332The optional argdefs tuple specifies the default argument values.\n\
333The optional closure tuple supplies the bindings for free variables.");
334
335/* func_new() maintains the following invariants for closures. The
336 closure must correspond to the free variables of the code object.
337
338 if len(code.co_freevars) == 0:
339 closure = NULL
340 else:
341 len(closure) == len(code.co_freevars)
342 for every elt in closure, type(elt) == cell
343*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000344
345static PyObject *
346func_new(PyTypeObject* type, PyObject* args, PyObject* kw)
347{
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000348 PyCodeObject *code;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000349 PyObject *globals;
350 PyObject *name = Py_None;
351 PyObject *defaults = Py_None;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000352 PyObject *closure = Py_None;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000353 PyFunctionObject *newfunc;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000354 int nfree, nclosure;
Raymond Hettinger86578452003-05-06 09:01:41 +0000355 static char *kwlist[] = {"code", "globals", "name",
356 "argdefs", "closure", 0};
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000357
Raymond Hettinger86578452003-05-06 09:01:41 +0000358 if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!|OOO:function",
359 kwlist,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000360 &PyCode_Type, &code,
361 &PyDict_Type, &globals,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000362 &name, &defaults, &closure))
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000363 return NULL;
364 if (name != Py_None && !PyString_Check(name)) {
365 PyErr_SetString(PyExc_TypeError,
366 "arg 3 (name) must be None or string");
367 return NULL;
368 }
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000369 if (defaults != Py_None && !PyTuple_Check(defaults)) {
370 PyErr_SetString(PyExc_TypeError,
371 "arg 4 (defaults) must be None or tuple");
372 return NULL;
373 }
374 nfree = PyTuple_GET_SIZE(code->co_freevars);
375 if (!PyTuple_Check(closure)) {
376 if (nfree && closure == Py_None) {
377 PyErr_SetString(PyExc_TypeError,
378 "arg 5 (closure) must be tuple");
379 return NULL;
380 }
381 else if (closure != Py_None) {
382 PyErr_SetString(PyExc_TypeError,
383 "arg 5 (closure) must be None or tuple");
384 return NULL;
385 }
386 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000387
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000388 /* check that the closure is well-formed */
389 nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure);
390 if (nfree != nclosure)
391 return PyErr_Format(PyExc_ValueError,
392 "%s requires closure of length %d, not %d",
393 PyString_AS_STRING(code->co_name),
394 nfree, nclosure);
395 if (nclosure) {
396 int i;
397 for (i = 0; i < nclosure; i++) {
398 PyObject *o = PyTuple_GET_ITEM(closure, i);
399 if (!PyCell_Check(o)) {
400 return PyErr_Format(PyExc_TypeError,
401 "arg 5 (closure) expected cell, found %s",
402 o->ob_type->tp_name);
403 }
404 }
405 }
406
407 newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code,
408 globals);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000409 if (newfunc == NULL)
410 return NULL;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000411
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000412 if (name != Py_None) {
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000413 Py_INCREF(name);
414 Py_DECREF(newfunc->func_name);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000415 newfunc->func_name = name;
416 }
417 if (defaults != Py_None) {
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000418 Py_INCREF(defaults);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000419 newfunc->func_defaults = defaults;
420 }
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000421 if (closure != Py_None) {
422 Py_INCREF(closure);
423 newfunc->func_closure = closure;
424 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000425
426 return (PyObject *)newfunc;
427}
428
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429static void
Fred Drakeee238b92000-07-09 06:03:25 +0000430func_dealloc(PyFunctionObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000432 _PyObject_GC_UNTRACK(op);
Fred Drakec916f5a2001-10-26 17:56:51 +0000433 if (op->func_weakreflist != NULL)
434 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000435 Py_DECREF(op->func_code);
436 Py_DECREF(op->func_globals);
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000437 Py_XDECREF(op->func_module);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000438 Py_DECREF(op->func_name);
439 Py_XDECREF(op->func_defaults);
440 Py_XDECREF(op->func_doc);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000441 Py_XDECREF(op->func_dict);
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000442 Py_XDECREF(op->func_closure);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000443 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444}
445
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446static PyObject*
Fred Drakeee238b92000-07-09 06:03:25 +0000447func_repr(PyFunctionObject *op)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000448{
Barry Warsaw7ce36942001-08-24 18:34:26 +0000449 return PyString_FromFormat("<function %s at %p>",
450 PyString_AsString(op->func_name),
451 op);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000452}
453
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000454static int
Jeremy Hylton8caad492000-06-23 14:18:11 +0000455func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
456{
457 int err;
458 if (f->func_code) {
459 err = visit(f->func_code, arg);
460 if (err)
461 return err;
462 }
463 if (f->func_globals) {
464 err = visit(f->func_globals, arg);
465 if (err)
466 return err;
467 }
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000468 if (f->func_module) {
469 err = visit(f->func_module, arg);
470 if (err)
471 return err;
472 }
Jeremy Hylton8caad492000-06-23 14:18:11 +0000473 if (f->func_defaults) {
474 err = visit(f->func_defaults, arg);
475 if (err)
476 return err;
477 }
478 if (f->func_doc) {
479 err = visit(f->func_doc, arg);
480 if (err)
481 return err;
482 }
483 if (f->func_name) {
484 err = visit(f->func_name, arg);
485 if (err)
486 return err;
487 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000488 if (f->func_dict) {
489 err = visit(f->func_dict, arg);
490 if (err)
491 return err;
492 }
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000493 if (f->func_closure) {
494 err = visit(f->func_closure, arg);
495 if (err)
496 return err;
497 }
Jeremy Hylton8caad492000-06-23 14:18:11 +0000498 return 0;
499}
500
Tim Peters6d6c1a32001-08-02 04:15:00 +0000501static PyObject *
502function_call(PyObject *func, PyObject *arg, PyObject *kw)
503{
504 PyObject *result;
505 PyObject *argdefs;
506 PyObject **d, **k;
507 int nk, nd;
508
509 argdefs = PyFunction_GET_DEFAULTS(func);
510 if (argdefs != NULL && PyTuple_Check(argdefs)) {
511 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
512 nd = PyTuple_Size(argdefs);
513 }
514 else {
515 d = NULL;
516 nd = 0;
517 }
518
519 if (kw != NULL && PyDict_Check(kw)) {
520 int pos, i;
521 nk = PyDict_Size(kw);
522 k = PyMem_NEW(PyObject *, 2*nk);
523 if (k == NULL) {
524 PyErr_NoMemory();
Tim Peters6d6c1a32001-08-02 04:15:00 +0000525 return NULL;
526 }
527 pos = i = 0;
528 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
529 i += 2;
530 nk = i/2;
531 /* XXX This is broken if the caller deletes dict items! */
532 }
533 else {
534 k = NULL;
535 nk = 0;
536 }
537
538 result = PyEval_EvalCodeEx(
539 (PyCodeObject *)PyFunction_GET_CODE(func),
540 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
541 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
542 k, nk, d, nd,
543 PyFunction_GET_CLOSURE(func));
544
545 if (k != NULL)
546 PyMem_DEL(k);
547
548 return result;
549}
550
551/* Bind a function to an object */
552static PyObject *
553func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
554{
555 if (obj == Py_None)
556 obj = NULL;
557 return PyMethod_New(func, obj, type);
558}
559
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560PyTypeObject PyFunction_Type = {
561 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000562 0,
563 "function",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000564 sizeof(PyFunctionObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +0000566 (destructor)func_dealloc, /* tp_dealloc */
567 0, /* tp_print */
568 0, /* tp_getattr */
569 0, /* tp_setattr */
570 0, /* tp_compare */
571 (reprfunc)func_repr, /* tp_repr */
572 0, /* tp_as_number */
573 0, /* tp_as_sequence */
574 0, /* tp_as_mapping */
575 0, /* tp_hash */
576 function_call, /* tp_call */
577 0, /* tp_str */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000578 PyObject_GenericGetAttr, /* tp_getattro */
579 PyObject_GenericSetAttr, /* tp_setattro */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000580 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000581 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000582 func_doc, /* tp_doc */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000583 (traverseproc)func_traverse, /* tp_traverse */
584 0, /* tp_clear */
585 0, /* tp_richcompare */
Fred Drakedb81e8d2001-03-23 04:19:27 +0000586 offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000587 0, /* tp_iter */
588 0, /* tp_iternext */
589 0, /* tp_methods */
590 func_memberlist, /* tp_members */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000591 func_getsetlist, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000592 0, /* tp_base */
593 0, /* tp_dict */
594 func_descr_get, /* tp_descr_get */
595 0, /* tp_descr_set */
596 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000597 0, /* tp_init */
598 0, /* tp_alloc */
599 func_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000600};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000601
602
603/* Class method object */
604
605/* A class method receives the class as implicit first argument,
606 just like an instance method receives the instance.
607 To declare a class method, use this idiom:
608
609 class C:
610 def f(cls, arg1, arg2, ...): ...
611 f = classmethod(f)
612
613 It can be called either on the class (e.g. C.f()) or on an instance
614 (e.g. C().f()); the instance is ignored except for its class.
615 If a class method is called for a derived class, the derived class
616 object is passed as the implied first argument.
617
618 Class methods are different than C++ or Java static methods.
619 If you want those, see static methods below.
620*/
621
622typedef struct {
623 PyObject_HEAD
624 PyObject *cm_callable;
625} classmethod;
626
627static void
628cm_dealloc(classmethod *cm)
629{
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000630 _PyObject_GC_UNTRACK((PyObject *)cm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000631 Py_XDECREF(cm->cm_callable);
Guido van Rossum9475a232001-10-05 20:51:39 +0000632 cm->ob_type->tp_free((PyObject *)cm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000633}
634
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000635static int
636cm_traverse(classmethod *cm, visitproc visit, void *arg)
637{
638 if (!cm->cm_callable)
639 return 0;
640 return visit(cm->cm_callable, arg);
641}
642
643static int
644cm_clear(classmethod *cm)
645{
646 Py_XDECREF(cm->cm_callable);
647 cm->cm_callable = NULL;
648
649 return 0;
650}
651
652
Tim Peters6d6c1a32001-08-02 04:15:00 +0000653static PyObject *
654cm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
655{
656 classmethod *cm = (classmethod *)self;
657
658 if (cm->cm_callable == NULL) {
659 PyErr_SetString(PyExc_RuntimeError,
660 "uninitialized classmethod object");
661 return NULL;
662 }
Guido van Rossum7e305482002-03-18 03:09:06 +0000663 if (type == NULL)
664 type = (PyObject *)(obj->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000665 return PyMethod_New(cm->cm_callable,
666 type, (PyObject *)(type->ob_type));
667}
668
669static int
670cm_init(PyObject *self, PyObject *args, PyObject *kwds)
671{
672 classmethod *cm = (classmethod *)self;
673 PyObject *callable;
674
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000675 if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000676 return -1;
Raymond Hettingerbe971532003-06-18 01:13:41 +0000677 if (!PyCallable_Check(callable)) {
678 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
679 callable->ob_type->tp_name);
680 return -1;
681 }
682
Tim Peters6d6c1a32001-08-02 04:15:00 +0000683 Py_INCREF(callable);
684 cm->cm_callable = callable;
685 return 0;
686}
687
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000688PyDoc_STRVAR(classmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000689"classmethod(function) -> method\n\
690\n\
691Convert a function to be a class method.\n\
692\n\
693A class method receives the class as implicit first argument,\n\
694just like an instance method receives the instance.\n\
695To declare a class method, use this idiom:\n\
696\n\
697 class C:\n\
698 def f(cls, arg1, arg2, ...): ...\n\
699 f = classmethod(f)\n\
700\n\
701It can be called either on the class (e.g. C.f()) or on an instance\n\
702(e.g. C().f()). The instance is ignored except for its class.\n\
703If a class method is called for a derived class, the derived class\n\
704object is passed as the implied first argument.\n\
Sjoerd Mullender564980b2001-12-17 11:39:56 +0000705\n\
Guido van Rossum33c1a882001-12-17 02:53:53 +0000706Class methods are different than C++ or Java static methods.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000707If you want those, see the staticmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000708
Tim Peters6d6c1a32001-08-02 04:15:00 +0000709PyTypeObject PyClassMethod_Type = {
710 PyObject_HEAD_INIT(&PyType_Type)
711 0,
712 "classmethod",
713 sizeof(classmethod),
714 0,
715 (destructor)cm_dealloc, /* tp_dealloc */
716 0, /* tp_print */
717 0, /* tp_getattr */
718 0, /* tp_setattr */
719 0, /* tp_compare */
720 0, /* tp_repr */
721 0, /* tp_as_number */
722 0, /* tp_as_sequence */
723 0, /* tp_as_mapping */
724 0, /* tp_hash */
725 0, /* tp_call */
726 0, /* tp_str */
727 PyObject_GenericGetAttr, /* tp_getattro */
728 0, /* tp_setattro */
729 0, /* tp_as_buffer */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000730 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000731 classmethod_doc, /* tp_doc */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000732 (traverseproc)cm_traverse, /* tp_traverse */
733 (inquiry)cm_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000734 0, /* tp_richcompare */
735 0, /* tp_weaklistoffset */
736 0, /* tp_iter */
737 0, /* tp_iternext */
738 0, /* tp_methods */
739 0, /* tp_members */
740 0, /* tp_getset */
741 0, /* tp_base */
742 0, /* tp_dict */
743 cm_descr_get, /* tp_descr_get */
744 0, /* tp_descr_set */
745 0, /* tp_dictoffset */
746 cm_init, /* tp_init */
747 PyType_GenericAlloc, /* tp_alloc */
748 PyType_GenericNew, /* tp_new */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000749 PyObject_GC_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000750};
751
752PyObject *
753PyClassMethod_New(PyObject *callable)
754{
755 classmethod *cm = (classmethod *)
756 PyType_GenericAlloc(&PyClassMethod_Type, 0);
757 if (cm != NULL) {
758 Py_INCREF(callable);
759 cm->cm_callable = callable;
760 }
761 return (PyObject *)cm;
762}
763
764
765/* Static method object */
766
767/* A static method does not receive an implicit first argument.
768 To declare a static method, use this idiom:
769
770 class C:
771 def f(arg1, arg2, ...): ...
772 f = staticmethod(f)
773
774 It can be called either on the class (e.g. C.f()) or on an instance
775 (e.g. C().f()); the instance is ignored except for its class.
776
777 Static methods in Python are similar to those found in Java or C++.
778 For a more advanced concept, see class methods above.
779*/
780
781typedef struct {
782 PyObject_HEAD
783 PyObject *sm_callable;
784} staticmethod;
785
786static void
787sm_dealloc(staticmethod *sm)
788{
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000789 _PyObject_GC_UNTRACK((PyObject *)sm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000790 Py_XDECREF(sm->sm_callable);
Guido van Rossum9475a232001-10-05 20:51:39 +0000791 sm->ob_type->tp_free((PyObject *)sm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000792}
793
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000794static int
795sm_traverse(staticmethod *sm, visitproc visit, void *arg)
796{
797 if (!sm->sm_callable)
798 return 0;
799 return visit(sm->sm_callable, arg);
800}
801
802static int
803sm_clear(staticmethod *sm)
804{
805 Py_XDECREF(sm->sm_callable);
806 sm->sm_callable = NULL;
807
808 return 0;
809}
810
Tim Peters6d6c1a32001-08-02 04:15:00 +0000811static PyObject *
812sm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
813{
814 staticmethod *sm = (staticmethod *)self;
815
816 if (sm->sm_callable == NULL) {
817 PyErr_SetString(PyExc_RuntimeError,
818 "uninitialized staticmethod object");
819 return NULL;
820 }
821 Py_INCREF(sm->sm_callable);
822 return sm->sm_callable;
823}
824
825static int
826sm_init(PyObject *self, PyObject *args, PyObject *kwds)
827{
828 staticmethod *sm = (staticmethod *)self;
829 PyObject *callable;
830
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000831 if (!PyArg_UnpackTuple(args, "staticmethod", 1, 1, &callable))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000832 return -1;
833 Py_INCREF(callable);
834 sm->sm_callable = callable;
835 return 0;
836}
837
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000838PyDoc_STRVAR(staticmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000839"staticmethod(function) -> method\n\
840\n\
841Convert a function to be a static method.\n\
842\n\
843A static method does not receive an implicit first argument.\n\
844To declare a static method, use this idiom:\n\
845\n\
846 class C:\n\
847 def f(arg1, arg2, ...): ...\n\
848 f = staticmethod(f)\n\
849\n\
850It can be called either on the class (e.g. C.f()) or on an instance\n\
851(e.g. C().f()). The instance is ignored except for its class.\n\
852\n\
853Static methods in Python are similar to those found in Java or C++.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000854For a more advanced concept, see the classmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000855
Tim Peters6d6c1a32001-08-02 04:15:00 +0000856PyTypeObject PyStaticMethod_Type = {
857 PyObject_HEAD_INIT(&PyType_Type)
858 0,
859 "staticmethod",
860 sizeof(staticmethod),
861 0,
862 (destructor)sm_dealloc, /* tp_dealloc */
863 0, /* tp_print */
864 0, /* tp_getattr */
865 0, /* tp_setattr */
866 0, /* tp_compare */
867 0, /* tp_repr */
868 0, /* tp_as_number */
869 0, /* tp_as_sequence */
870 0, /* tp_as_mapping */
871 0, /* tp_hash */
872 0, /* tp_call */
873 0, /* tp_str */
874 PyObject_GenericGetAttr, /* tp_getattro */
875 0, /* tp_setattro */
876 0, /* tp_as_buffer */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000877 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000878 staticmethod_doc, /* tp_doc */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000879 (traverseproc)sm_traverse, /* tp_traverse */
880 (inquiry)sm_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000881 0, /* tp_richcompare */
882 0, /* tp_weaklistoffset */
883 0, /* tp_iter */
884 0, /* tp_iternext */
885 0, /* tp_methods */
886 0, /* tp_members */
887 0, /* tp_getset */
888 0, /* tp_base */
889 0, /* tp_dict */
890 sm_descr_get, /* tp_descr_get */
891 0, /* tp_descr_set */
892 0, /* tp_dictoffset */
893 sm_init, /* tp_init */
894 PyType_GenericAlloc, /* tp_alloc */
895 PyType_GenericNew, /* tp_new */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000896 PyObject_GC_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000897};
898
899PyObject *
900PyStaticMethod_New(PyObject *callable)
901{
902 staticmethod *sm = (staticmethod *)
903 PyType_GenericAlloc(&PyStaticMethod_Type, 0);
904 if (sm != NULL) {
905 Py_INCREF(callable);
906 sm->sm_callable = callable;
907 }
908 return (PyObject *)sm;
909}