blob: fe34a11b54314449df76181b745888698f6725e3 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Function object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005#include "code.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +00006#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00007#include "structmember.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00008
Guido van Rossumc0b618a1997-05-02 03:12:38 +00009PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000010PyFunction_New(PyObject *code, PyObject *globals)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011{
Neil Schemenauere83c00e2001-08-29 23:54:21 +000012 PyFunctionObject *op = PyObject_GC_New(PyFunctionObject,
Guido van Rossumc0b618a1997-05-02 03:12:38 +000013 &PyFunction_Type);
Martin v. Löwis321c9ab2004-03-23 18:40:15 +000014 static PyObject *__name__ = 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000015 if (op != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000016 PyObject *doc;
17 PyObject *consts;
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +000018 PyObject *module;
Fred Drakedb81e8d2001-03-23 04:19:27 +000019 op->func_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000020 Py_INCREF(code);
Guido van Rossum846e4311990-11-18 17:44:06 +000021 op->func_code = code;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000022 Py_INCREF(globals);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000023 op->func_globals = globals;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000024 op->func_name = ((PyCodeObject *)code)->co_name;
25 Py_INCREF(op->func_name);
Guido van Rossum2271bf71995-07-18 14:30:34 +000026 op->func_defaults = NULL; /* No default arguments */
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 {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000147 PyErr_Format(PyExc_SystemError,
148 "expected tuple for closure, got '%.100s'",
149 closure->ob_type->tp_name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000150 return -1;
151 }
152 Py_XDECREF(((PyFunctionObject *) op) -> func_closure);
153 ((PyFunctionObject *) op) -> func_closure = closure;
154 return 0;
155}
156
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157/* Methods */
158
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159#define OFF(x) offsetof(PyFunctionObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000160
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},
Guido van Rossum6b29c012003-02-18 17:18:35 +0000168 {"__module__", T_OBJECT, OFF(func_module), WRITE_RESTRICTED},
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000169 {NULL} /* Sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000170};
171
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000172static int
173restricted(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000174{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000175 if (!PyEval_GetRestricted())
176 return 0;
177 PyErr_SetString(PyExc_RuntimeError,
178 "function attributes not accessible in restricted mode");
179 return 1;
180}
181
182static PyObject *
183func_get_dict(PyFunctionObject *op)
184{
185 if (restricted())
Guido van Rossum10393b11995-01-10 10:39:49 +0000186 return NULL;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000187 if (op->func_dict == NULL) {
188 op->func_dict = PyDict_New();
189 if (op->func_dict == NULL)
Barry Warsaw142865c2001-08-14 18:23:58 +0000190 return NULL;
191 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000192 Py_INCREF(op->func_dict);
193 return op->func_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000194}
195
Guido van Rossum0dabace1998-05-22 00:55:34 +0000196static int
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000197func_set_dict(PyFunctionObject *op, PyObject *value)
Guido van Rossum0dabace1998-05-22 00:55:34 +0000198{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000199 PyObject *tmp;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000200
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000201 if (restricted())
202 return -1;
203 /* It is illegal to del f.func_dict */
204 if (value == NULL) {
205 PyErr_SetString(PyExc_TypeError,
206 "function's dictionary may not be deleted");
Guido van Rossum0dabace1998-05-22 00:55:34 +0000207 return -1;
208 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000209 /* Can only set func_dict to a dictionary */
210 if (!PyDict_Check(value)) {
211 PyErr_SetString(PyExc_TypeError,
Barry Warsaw142865c2001-08-14 18:23:58 +0000212 "setting function's dictionary to a non-dict");
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000213 return -1;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000214 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000215 tmp = op->func_dict;
216 Py_INCREF(value);
217 op->func_dict = value;
218 Py_XDECREF(tmp);
219 return 0;
Guido van Rossum0dabace1998-05-22 00:55:34 +0000220}
221
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000222static PyObject *
223func_get_code(PyFunctionObject *op)
224{
225 if (restricted())
226 return NULL;
227 Py_INCREF(op->func_code);
228 return op->func_code;
229}
230
231static int
232func_set_code(PyFunctionObject *op, PyObject *value)
233{
234 PyObject *tmp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000235 Py_ssize_t nfree, nclosure;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000236
237 if (restricted())
238 return -1;
239 /* Not legal to del f.func_code or to set it to anything
240 * other than a code object. */
241 if (value == NULL || !PyCode_Check(value)) {
242 PyErr_SetString(PyExc_TypeError,
243 "func_code must be set to a code object");
244 return -1;
245 }
Armin Rigo89a39462004-10-28 16:32:00 +0000246 nfree = PyCode_GetNumFree((PyCodeObject *)value);
247 nclosure = (op->func_closure == NULL ? 0 :
248 PyTuple_GET_SIZE(op->func_closure));
249 if (nclosure != nfree) {
250 PyErr_Format(PyExc_ValueError,
Martin v. Löwis2c95cc62006-02-16 06:54:25 +0000251 "%s() requires a code object with %zd free vars,"
252 " not %zd",
Armin Rigo89a39462004-10-28 16:32:00 +0000253 PyString_AsString(op->func_name),
Martin v. Löwise0e89f72006-02-16 06:59:22 +0000254 nclosure, nfree);
Armin Rigo89a39462004-10-28 16:32:00 +0000255 return -1;
256 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000257 tmp = op->func_code;
258 Py_INCREF(value);
259 op->func_code = value;
260 Py_DECREF(tmp);
261 return 0;
262}
263
264static PyObject *
Michael W. Hudson5e897952004-08-12 18:12:44 +0000265func_get_name(PyFunctionObject *op)
266{
Michael W. Hudson5e897952004-08-12 18:12:44 +0000267 Py_INCREF(op->func_name);
268 return op->func_name;
269}
270
271static int
272func_set_name(PyFunctionObject *op, PyObject *value)
273{
274 PyObject *tmp;
275
276 if (restricted())
277 return -1;
278 /* Not legal to del f.func_name or to set it to anything
279 * other than a string object. */
280 if (value == NULL || !PyString_Check(value)) {
281 PyErr_SetString(PyExc_TypeError,
282 "func_name must be set to a string object");
283 return -1;
284 }
285 tmp = op->func_name;
286 Py_INCREF(value);
287 op->func_name = value;
288 Py_DECREF(tmp);
289 return 0;
290}
291
292static PyObject *
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000293func_get_defaults(PyFunctionObject *op)
294{
295 if (restricted())
296 return NULL;
297 if (op->func_defaults == NULL) {
298 Py_INCREF(Py_None);
299 return Py_None;
300 }
301 Py_INCREF(op->func_defaults);
302 return op->func_defaults;
303}
304
305static int
306func_set_defaults(PyFunctionObject *op, PyObject *value)
307{
308 PyObject *tmp;
309
310 if (restricted())
311 return -1;
312 /* Legal to del f.func_defaults.
313 * Can only set func_defaults to NULL or a tuple. */
314 if (value == Py_None)
315 value = NULL;
316 if (value != NULL && !PyTuple_Check(value)) {
317 PyErr_SetString(PyExc_TypeError,
318 "func_defaults must be set to a tuple object");
319 return -1;
320 }
321 tmp = op->func_defaults;
322 Py_XINCREF(value);
323 op->func_defaults = value;
324 Py_XDECREF(tmp);
325 return 0;
326}
327
Guido van Rossum32d34c82001-09-20 21:45:26 +0000328static PyGetSetDef func_getsetlist[] = {
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000329 {"func_code", (getter)func_get_code, (setter)func_set_code},
330 {"func_defaults", (getter)func_get_defaults,
331 (setter)func_set_defaults},
332 {"func_dict", (getter)func_get_dict, (setter)func_set_dict},
333 {"__dict__", (getter)func_get_dict, (setter)func_set_dict},
Michael W. Hudson5e897952004-08-12 18:12:44 +0000334 {"func_name", (getter)func_get_name, (setter)func_set_name},
335 {"__name__", (getter)func_get_name, (setter)func_set_name},
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000336 {NULL} /* Sentinel */
337};
338
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000339PyDoc_STRVAR(func_doc,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000340"function(code, globals[, name[, argdefs[, closure]]])\n\
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000341\n\
342Create a function object from a code object and a dictionary.\n\
343The optional name string overrides the name from the code object.\n\
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000344The optional argdefs tuple specifies the default argument values.\n\
345The optional closure tuple supplies the bindings for free variables.");
346
347/* func_new() maintains the following invariants for closures. The
348 closure must correspond to the free variables of the code object.
349
350 if len(code.co_freevars) == 0:
351 closure = NULL
352 else:
353 len(closure) == len(code.co_freevars)
354 for every elt in closure, type(elt) == cell
355*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000356
357static PyObject *
358func_new(PyTypeObject* type, PyObject* args, PyObject* kw)
359{
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000360 PyCodeObject *code;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000361 PyObject *globals;
362 PyObject *name = Py_None;
363 PyObject *defaults = Py_None;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000364 PyObject *closure = Py_None;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000365 PyFunctionObject *newfunc;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000366 Py_ssize_t nfree, nclosure;
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000367 static const char *kwlist[] = {"code", "globals", "name",
Raymond Hettinger86578452003-05-06 09:01:41 +0000368 "argdefs", "closure", 0};
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000369
Raymond Hettinger86578452003-05-06 09:01:41 +0000370 if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!|OOO:function",
371 kwlist,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000372 &PyCode_Type, &code,
373 &PyDict_Type, &globals,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000374 &name, &defaults, &closure))
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000375 return NULL;
376 if (name != Py_None && !PyString_Check(name)) {
377 PyErr_SetString(PyExc_TypeError,
378 "arg 3 (name) must be None or string");
379 return NULL;
380 }
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000381 if (defaults != Py_None && !PyTuple_Check(defaults)) {
382 PyErr_SetString(PyExc_TypeError,
383 "arg 4 (defaults) must be None or tuple");
384 return NULL;
385 }
386 nfree = PyTuple_GET_SIZE(code->co_freevars);
387 if (!PyTuple_Check(closure)) {
388 if (nfree && closure == Py_None) {
389 PyErr_SetString(PyExc_TypeError,
390 "arg 5 (closure) must be tuple");
391 return NULL;
392 }
393 else if (closure != Py_None) {
394 PyErr_SetString(PyExc_TypeError,
395 "arg 5 (closure) must be None or tuple");
396 return NULL;
397 }
398 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000399
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000400 /* check that the closure is well-formed */
401 nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure);
402 if (nfree != nclosure)
403 return PyErr_Format(PyExc_ValueError,
Martin v. Löwis2c95cc62006-02-16 06:54:25 +0000404 "%s requires closure of length %zd, not %zd",
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000405 PyString_AS_STRING(code->co_name),
Martin v. Löwise0e89f72006-02-16 06:59:22 +0000406 nfree, nclosure);
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000407 if (nclosure) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000408 Py_ssize_t i;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000409 for (i = 0; i < nclosure; i++) {
410 PyObject *o = PyTuple_GET_ITEM(closure, i);
411 if (!PyCell_Check(o)) {
412 return PyErr_Format(PyExc_TypeError,
413 "arg 5 (closure) expected cell, found %s",
414 o->ob_type->tp_name);
415 }
416 }
417 }
418
419 newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code,
420 globals);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000421 if (newfunc == NULL)
422 return NULL;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000423
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000424 if (name != Py_None) {
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000425 Py_INCREF(name);
426 Py_DECREF(newfunc->func_name);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000427 newfunc->func_name = name;
428 }
429 if (defaults != Py_None) {
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000430 Py_INCREF(defaults);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000431 newfunc->func_defaults = defaults;
432 }
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000433 if (closure != Py_None) {
434 Py_INCREF(closure);
435 newfunc->func_closure = closure;
436 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000437
438 return (PyObject *)newfunc;
439}
440
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441static void
Fred Drakeee238b92000-07-09 06:03:25 +0000442func_dealloc(PyFunctionObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000444 _PyObject_GC_UNTRACK(op);
Fred Drakec916f5a2001-10-26 17:56:51 +0000445 if (op->func_weakreflist != NULL)
446 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000447 Py_DECREF(op->func_code);
448 Py_DECREF(op->func_globals);
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000449 Py_XDECREF(op->func_module);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000450 Py_DECREF(op->func_name);
451 Py_XDECREF(op->func_defaults);
452 Py_XDECREF(op->func_doc);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000453 Py_XDECREF(op->func_dict);
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000454 Py_XDECREF(op->func_closure);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000455 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000456}
457
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458static PyObject*
Fred Drakeee238b92000-07-09 06:03:25 +0000459func_repr(PyFunctionObject *op)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000460{
Barry Warsaw7ce36942001-08-24 18:34:26 +0000461 return PyString_FromFormat("<function %s at %p>",
462 PyString_AsString(op->func_name),
463 op);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000464}
465
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000466static int
Jeremy Hylton8caad492000-06-23 14:18:11 +0000467func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
468{
469 int err;
470 if (f->func_code) {
471 err = visit(f->func_code, arg);
472 if (err)
473 return err;
474 }
475 if (f->func_globals) {
476 err = visit(f->func_globals, arg);
477 if (err)
478 return err;
479 }
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000480 if (f->func_module) {
481 err = visit(f->func_module, arg);
482 if (err)
483 return err;
484 }
Jeremy Hylton8caad492000-06-23 14:18:11 +0000485 if (f->func_defaults) {
486 err = visit(f->func_defaults, arg);
487 if (err)
488 return err;
489 }
490 if (f->func_doc) {
491 err = visit(f->func_doc, arg);
492 if (err)
493 return err;
494 }
495 if (f->func_name) {
496 err = visit(f->func_name, arg);
497 if (err)
498 return err;
499 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000500 if (f->func_dict) {
501 err = visit(f->func_dict, arg);
502 if (err)
503 return err;
504 }
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000505 if (f->func_closure) {
506 err = visit(f->func_closure, arg);
507 if (err)
508 return err;
509 }
Jeremy Hylton8caad492000-06-23 14:18:11 +0000510 return 0;
511}
512
Tim Peters6d6c1a32001-08-02 04:15:00 +0000513static PyObject *
514function_call(PyObject *func, PyObject *arg, PyObject *kw)
515{
516 PyObject *result;
517 PyObject *argdefs;
518 PyObject **d, **k;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000519 Py_ssize_t nk, nd;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000520
521 argdefs = PyFunction_GET_DEFAULTS(func);
522 if (argdefs != NULL && PyTuple_Check(argdefs)) {
523 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
524 nd = PyTuple_Size(argdefs);
525 }
526 else {
527 d = NULL;
528 nd = 0;
529 }
530
531 if (kw != NULL && PyDict_Check(kw)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000532 Py_ssize_t pos, i;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000533 nk = PyDict_Size(kw);
534 k = PyMem_NEW(PyObject *, 2*nk);
535 if (k == NULL) {
536 PyErr_NoMemory();
Tim Peters6d6c1a32001-08-02 04:15:00 +0000537 return NULL;
538 }
539 pos = i = 0;
540 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
541 i += 2;
542 nk = i/2;
543 /* XXX This is broken if the caller deletes dict items! */
544 }
545 else {
546 k = NULL;
547 nk = 0;
548 }
549
550 result = PyEval_EvalCodeEx(
551 (PyCodeObject *)PyFunction_GET_CODE(func),
552 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
553 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
554 k, nk, d, nd,
555 PyFunction_GET_CLOSURE(func));
556
557 if (k != NULL)
558 PyMem_DEL(k);
559
560 return result;
561}
562
563/* Bind a function to an object */
564static PyObject *
565func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
566{
567 if (obj == Py_None)
568 obj = NULL;
569 return PyMethod_New(func, obj, type);
570}
571
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572PyTypeObject PyFunction_Type = {
573 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000574 0,
575 "function",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000576 sizeof(PyFunctionObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000577 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +0000578 (destructor)func_dealloc, /* tp_dealloc */
579 0, /* tp_print */
580 0, /* tp_getattr */
581 0, /* tp_setattr */
582 0, /* tp_compare */
583 (reprfunc)func_repr, /* tp_repr */
584 0, /* tp_as_number */
585 0, /* tp_as_sequence */
586 0, /* tp_as_mapping */
587 0, /* tp_hash */
588 function_call, /* tp_call */
589 0, /* tp_str */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000590 PyObject_GenericGetAttr, /* tp_getattro */
591 PyObject_GenericSetAttr, /* tp_setattro */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000592 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000593 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000594 func_doc, /* tp_doc */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000595 (traverseproc)func_traverse, /* tp_traverse */
596 0, /* tp_clear */
597 0, /* tp_richcompare */
Fred Drakedb81e8d2001-03-23 04:19:27 +0000598 offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000599 0, /* tp_iter */
600 0, /* tp_iternext */
601 0, /* tp_methods */
602 func_memberlist, /* tp_members */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000603 func_getsetlist, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000604 0, /* tp_base */
605 0, /* tp_dict */
606 func_descr_get, /* tp_descr_get */
607 0, /* tp_descr_set */
608 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000609 0, /* tp_init */
610 0, /* tp_alloc */
611 func_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000612};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000613
614
615/* Class method object */
616
617/* A class method receives the class as implicit first argument,
618 just like an instance method receives the instance.
619 To declare a class method, use this idiom:
620
621 class C:
622 def f(cls, arg1, arg2, ...): ...
623 f = classmethod(f)
624
625 It can be called either on the class (e.g. C.f()) or on an instance
626 (e.g. C().f()); the instance is ignored except for its class.
627 If a class method is called for a derived class, the derived class
628 object is passed as the implied first argument.
629
630 Class methods are different than C++ or Java static methods.
631 If you want those, see static methods below.
632*/
633
634typedef struct {
635 PyObject_HEAD
636 PyObject *cm_callable;
637} classmethod;
638
639static void
640cm_dealloc(classmethod *cm)
641{
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000642 _PyObject_GC_UNTRACK((PyObject *)cm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000643 Py_XDECREF(cm->cm_callable);
Guido van Rossum9475a232001-10-05 20:51:39 +0000644 cm->ob_type->tp_free((PyObject *)cm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000645}
646
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000647static int
648cm_traverse(classmethod *cm, visitproc visit, void *arg)
649{
650 if (!cm->cm_callable)
651 return 0;
652 return visit(cm->cm_callable, arg);
653}
654
655static int
656cm_clear(classmethod *cm)
657{
658 Py_XDECREF(cm->cm_callable);
659 cm->cm_callable = NULL;
660
661 return 0;
662}
663
664
Tim Peters6d6c1a32001-08-02 04:15:00 +0000665static PyObject *
666cm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
667{
668 classmethod *cm = (classmethod *)self;
669
670 if (cm->cm_callable == NULL) {
671 PyErr_SetString(PyExc_RuntimeError,
672 "uninitialized classmethod object");
673 return NULL;
674 }
Guido van Rossum7e305482002-03-18 03:09:06 +0000675 if (type == NULL)
676 type = (PyObject *)(obj->ob_type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000677 return PyMethod_New(cm->cm_callable,
678 type, (PyObject *)(type->ob_type));
679}
680
681static int
682cm_init(PyObject *self, PyObject *args, PyObject *kwds)
683{
684 classmethod *cm = (classmethod *)self;
685 PyObject *callable;
686
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000687 if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000688 return -1;
Raymond Hettingerbe971532003-06-18 01:13:41 +0000689 if (!PyCallable_Check(callable)) {
690 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
691 callable->ob_type->tp_name);
692 return -1;
693 }
694
Tim Peters6d6c1a32001-08-02 04:15:00 +0000695 Py_INCREF(callable);
696 cm->cm_callable = callable;
697 return 0;
698}
699
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000700PyDoc_STRVAR(classmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000701"classmethod(function) -> method\n\
702\n\
703Convert a function to be a class method.\n\
704\n\
705A class method receives the class as implicit first argument,\n\
706just like an instance method receives the instance.\n\
707To declare a class method, use this idiom:\n\
708\n\
709 class C:\n\
710 def f(cls, arg1, arg2, ...): ...\n\
711 f = classmethod(f)\n\
712\n\
713It can be called either on the class (e.g. C.f()) or on an instance\n\
714(e.g. C().f()). The instance is ignored except for its class.\n\
715If a class method is called for a derived class, the derived class\n\
716object is passed as the implied first argument.\n\
Sjoerd Mullender564980b2001-12-17 11:39:56 +0000717\n\
Guido van Rossum33c1a882001-12-17 02:53:53 +0000718Class methods are different than C++ or Java static methods.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000719If you want those, see the staticmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000720
Tim Peters6d6c1a32001-08-02 04:15:00 +0000721PyTypeObject PyClassMethod_Type = {
722 PyObject_HEAD_INIT(&PyType_Type)
723 0,
724 "classmethod",
725 sizeof(classmethod),
726 0,
727 (destructor)cm_dealloc, /* tp_dealloc */
728 0, /* tp_print */
729 0, /* tp_getattr */
730 0, /* tp_setattr */
731 0, /* tp_compare */
732 0, /* tp_repr */
733 0, /* tp_as_number */
734 0, /* tp_as_sequence */
735 0, /* tp_as_mapping */
736 0, /* tp_hash */
737 0, /* tp_call */
738 0, /* tp_str */
739 PyObject_GenericGetAttr, /* tp_getattro */
740 0, /* tp_setattro */
741 0, /* tp_as_buffer */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000742 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000743 classmethod_doc, /* tp_doc */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000744 (traverseproc)cm_traverse, /* tp_traverse */
745 (inquiry)cm_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000746 0, /* tp_richcompare */
747 0, /* tp_weaklistoffset */
748 0, /* tp_iter */
749 0, /* tp_iternext */
750 0, /* tp_methods */
751 0, /* tp_members */
752 0, /* tp_getset */
753 0, /* tp_base */
754 0, /* tp_dict */
755 cm_descr_get, /* tp_descr_get */
756 0, /* tp_descr_set */
757 0, /* tp_dictoffset */
758 cm_init, /* tp_init */
759 PyType_GenericAlloc, /* tp_alloc */
760 PyType_GenericNew, /* tp_new */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000761 PyObject_GC_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000762};
763
764PyObject *
765PyClassMethod_New(PyObject *callable)
766{
767 classmethod *cm = (classmethod *)
768 PyType_GenericAlloc(&PyClassMethod_Type, 0);
769 if (cm != NULL) {
770 Py_INCREF(callable);
771 cm->cm_callable = callable;
772 }
773 return (PyObject *)cm;
774}
775
776
777/* Static method object */
778
779/* A static method does not receive an implicit first argument.
780 To declare a static method, use this idiom:
781
782 class C:
783 def f(arg1, arg2, ...): ...
784 f = staticmethod(f)
785
786 It can be called either on the class (e.g. C.f()) or on an instance
787 (e.g. C().f()); the instance is ignored except for its class.
788
789 Static methods in Python are similar to those found in Java or C++.
790 For a more advanced concept, see class methods above.
791*/
792
793typedef struct {
794 PyObject_HEAD
795 PyObject *sm_callable;
796} staticmethod;
797
798static void
799sm_dealloc(staticmethod *sm)
800{
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000801 _PyObject_GC_UNTRACK((PyObject *)sm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000802 Py_XDECREF(sm->sm_callable);
Guido van Rossum9475a232001-10-05 20:51:39 +0000803 sm->ob_type->tp_free((PyObject *)sm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000804}
805
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000806static int
807sm_traverse(staticmethod *sm, visitproc visit, void *arg)
808{
809 if (!sm->sm_callable)
810 return 0;
811 return visit(sm->sm_callable, arg);
812}
813
814static int
815sm_clear(staticmethod *sm)
816{
817 Py_XDECREF(sm->sm_callable);
818 sm->sm_callable = NULL;
819
820 return 0;
821}
822
Tim Peters6d6c1a32001-08-02 04:15:00 +0000823static PyObject *
824sm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
825{
826 staticmethod *sm = (staticmethod *)self;
827
828 if (sm->sm_callable == NULL) {
829 PyErr_SetString(PyExc_RuntimeError,
830 "uninitialized staticmethod object");
831 return NULL;
832 }
833 Py_INCREF(sm->sm_callable);
834 return sm->sm_callable;
835}
836
837static int
838sm_init(PyObject *self, PyObject *args, PyObject *kwds)
839{
840 staticmethod *sm = (staticmethod *)self;
841 PyObject *callable;
842
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000843 if (!PyArg_UnpackTuple(args, "staticmethod", 1, 1, &callable))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000844 return -1;
845 Py_INCREF(callable);
846 sm->sm_callable = callable;
847 return 0;
848}
849
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000850PyDoc_STRVAR(staticmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000851"staticmethod(function) -> method\n\
852\n\
853Convert a function to be a static method.\n\
854\n\
855A static method does not receive an implicit first argument.\n\
856To declare a static method, use this idiom:\n\
857\n\
858 class C:\n\
859 def f(arg1, arg2, ...): ...\n\
860 f = staticmethod(f)\n\
861\n\
862It can be called either on the class (e.g. C.f()) or on an instance\n\
863(e.g. C().f()). The instance is ignored except for its class.\n\
864\n\
865Static methods in Python are similar to those found in Java or C++.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000866For a more advanced concept, see the classmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000867
Tim Peters6d6c1a32001-08-02 04:15:00 +0000868PyTypeObject PyStaticMethod_Type = {
869 PyObject_HEAD_INIT(&PyType_Type)
870 0,
871 "staticmethod",
872 sizeof(staticmethod),
873 0,
874 (destructor)sm_dealloc, /* tp_dealloc */
875 0, /* tp_print */
876 0, /* tp_getattr */
877 0, /* tp_setattr */
878 0, /* tp_compare */
879 0, /* tp_repr */
880 0, /* tp_as_number */
881 0, /* tp_as_sequence */
882 0, /* tp_as_mapping */
883 0, /* tp_hash */
884 0, /* tp_call */
885 0, /* tp_str */
886 PyObject_GenericGetAttr, /* tp_getattro */
887 0, /* tp_setattro */
888 0, /* tp_as_buffer */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000889 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000890 staticmethod_doc, /* tp_doc */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000891 (traverseproc)sm_traverse, /* tp_traverse */
892 (inquiry)sm_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000893 0, /* tp_richcompare */
894 0, /* tp_weaklistoffset */
895 0, /* tp_iter */
896 0, /* tp_iternext */
897 0, /* tp_methods */
898 0, /* tp_members */
899 0, /* tp_getset */
900 0, /* tp_base */
901 0, /* tp_dict */
902 sm_descr_get, /* tp_descr_get */
903 0, /* tp_descr_set */
904 0, /* tp_dictoffset */
905 sm_init, /* tp_init */
906 PyType_GenericAlloc, /* tp_alloc */
907 PyType_GenericNew, /* tp_new */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000908 PyObject_GC_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000909};
910
911PyObject *
912PyStaticMethod_New(PyObject *callable)
913{
914 staticmethod *sm = (staticmethod *)
915 PyType_GenericAlloc(&PyStaticMethod_Type, 0);
916 if (sm != NULL) {
917 Py_INCREF(callable);
918 sm->sm_callable = callable;
919 }
920 return (PyObject *)sm;
921}