blob: 075f82012d8837a298b6e3b1653abff142bdffbf [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);
Gregory P. Smithdd96db62008-06-09 04:58:54 +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__) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +000045 __name__ = PyString_InternFromString("__name__");
Martin v. Löwis321c9ab2004-03-23 18:40:15 +000046 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;
Neal Norwitzee4cc692006-07-16 02:35:47 +0000112 else if (defaults && PyTuple_Check(defaults)) {
113 Py_INCREF(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)) {
Neal Norwitz101bac22006-07-27 03:55:39 +0000144 Py_INCREF(closure);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000145 }
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},
Neal Norwitz0ac60192007-05-27 04:08:54 +0000164 {"__closure__", T_OBJECT, OFF(func_closure),
165 RESTRICTED|READONLY},
Christian Heimese8954f82007-11-22 11:21:16 +0000166 {"func_doc", T_OBJECT, OFF(func_doc), PY_WRITE_RESTRICTED},
167 {"__doc__", T_OBJECT, OFF(func_doc), PY_WRITE_RESTRICTED},
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000168 {"func_globals", T_OBJECT, OFF(func_globals),
169 RESTRICTED|READONLY},
Neal Norwitz0ac60192007-05-27 04:08:54 +0000170 {"__globals__", T_OBJECT, OFF(func_globals),
171 RESTRICTED|READONLY},
Christian Heimese8954f82007-11-22 11:21:16 +0000172 {"__module__", T_OBJECT, OFF(func_module), PY_WRITE_RESTRICTED},
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000173 {NULL} /* Sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000174};
175
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000176static int
177restricted(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000178{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000179 if (!PyEval_GetRestricted())
180 return 0;
181 PyErr_SetString(PyExc_RuntimeError,
182 "function attributes not accessible in restricted mode");
183 return 1;
184}
185
186static PyObject *
187func_get_dict(PyFunctionObject *op)
188{
189 if (restricted())
Guido van Rossum10393b11995-01-10 10:39:49 +0000190 return NULL;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000191 if (op->func_dict == NULL) {
192 op->func_dict = PyDict_New();
193 if (op->func_dict == NULL)
Barry Warsaw142865c2001-08-14 18:23:58 +0000194 return NULL;
195 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000196 Py_INCREF(op->func_dict);
197 return op->func_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000198}
199
Guido van Rossum0dabace1998-05-22 00:55:34 +0000200static int
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000201func_set_dict(PyFunctionObject *op, PyObject *value)
Guido van Rossum0dabace1998-05-22 00:55:34 +0000202{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000203 PyObject *tmp;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000204
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000205 if (restricted())
206 return -1;
207 /* It is illegal to del f.func_dict */
208 if (value == NULL) {
209 PyErr_SetString(PyExc_TypeError,
210 "function's dictionary may not be deleted");
Guido van Rossum0dabace1998-05-22 00:55:34 +0000211 return -1;
212 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000213 /* Can only set func_dict to a dictionary */
214 if (!PyDict_Check(value)) {
215 PyErr_SetString(PyExc_TypeError,
Barry Warsaw142865c2001-08-14 18:23:58 +0000216 "setting function's dictionary to a non-dict");
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000217 return -1;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000218 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000219 tmp = op->func_dict;
220 Py_INCREF(value);
221 op->func_dict = value;
222 Py_XDECREF(tmp);
223 return 0;
Guido van Rossum0dabace1998-05-22 00:55:34 +0000224}
225
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000226static PyObject *
227func_get_code(PyFunctionObject *op)
228{
229 if (restricted())
230 return NULL;
231 Py_INCREF(op->func_code);
232 return op->func_code;
233}
234
235static int
236func_set_code(PyFunctionObject *op, PyObject *value)
237{
238 PyObject *tmp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000239 Py_ssize_t nfree, nclosure;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000240
241 if (restricted())
242 return -1;
243 /* Not legal to del f.func_code or to set it to anything
244 * other than a code object. */
245 if (value == NULL || !PyCode_Check(value)) {
246 PyErr_SetString(PyExc_TypeError,
Neal Norwitz0ac60192007-05-27 04:08:54 +0000247 "__code__ must be set to a code object");
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000248 return -1;
249 }
Armin Rigo89a39462004-10-28 16:32:00 +0000250 nfree = PyCode_GetNumFree((PyCodeObject *)value);
251 nclosure = (op->func_closure == NULL ? 0 :
252 PyTuple_GET_SIZE(op->func_closure));
253 if (nclosure != nfree) {
254 PyErr_Format(PyExc_ValueError,
Martin v. Löwis2c95cc62006-02-16 06:54:25 +0000255 "%s() requires a code object with %zd free vars,"
256 " not %zd",
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000257 PyString_AsString(op->func_name),
Martin v. Löwise0e89f72006-02-16 06:59:22 +0000258 nclosure, nfree);
Armin Rigo89a39462004-10-28 16:32:00 +0000259 return -1;
260 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000261 tmp = op->func_code;
262 Py_INCREF(value);
263 op->func_code = value;
264 Py_DECREF(tmp);
265 return 0;
266}
267
268static PyObject *
Michael W. Hudson5e897952004-08-12 18:12:44 +0000269func_get_name(PyFunctionObject *op)
270{
Michael W. Hudson5e897952004-08-12 18:12:44 +0000271 Py_INCREF(op->func_name);
272 return op->func_name;
273}
274
275static int
276func_set_name(PyFunctionObject *op, PyObject *value)
277{
278 PyObject *tmp;
279
280 if (restricted())
281 return -1;
282 /* Not legal to del f.func_name or to set it to anything
283 * other than a string object. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000284 if (value == NULL || !PyString_Check(value)) {
Michael W. Hudson5e897952004-08-12 18:12:44 +0000285 PyErr_SetString(PyExc_TypeError,
Neal Norwitz0ac60192007-05-27 04:08:54 +0000286 "__name__ must be set to a string object");
Michael W. Hudson5e897952004-08-12 18:12:44 +0000287 return -1;
288 }
289 tmp = op->func_name;
290 Py_INCREF(value);
291 op->func_name = value;
292 Py_DECREF(tmp);
293 return 0;
294}
295
296static PyObject *
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000297func_get_defaults(PyFunctionObject *op)
298{
299 if (restricted())
300 return NULL;
301 if (op->func_defaults == NULL) {
302 Py_INCREF(Py_None);
303 return Py_None;
304 }
305 Py_INCREF(op->func_defaults);
306 return op->func_defaults;
307}
308
309static int
310func_set_defaults(PyFunctionObject *op, PyObject *value)
311{
312 PyObject *tmp;
313
314 if (restricted())
315 return -1;
316 /* Legal to del f.func_defaults.
317 * Can only set func_defaults to NULL or a tuple. */
318 if (value == Py_None)
319 value = NULL;
320 if (value != NULL && !PyTuple_Check(value)) {
321 PyErr_SetString(PyExc_TypeError,
Neal Norwitz0ac60192007-05-27 04:08:54 +0000322 "__defaults__ must be set to a tuple object");
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000323 return -1;
324 }
325 tmp = op->func_defaults;
326 Py_XINCREF(value);
327 op->func_defaults = value;
328 Py_XDECREF(tmp);
329 return 0;
330}
331
Guido van Rossum32d34c82001-09-20 21:45:26 +0000332static PyGetSetDef func_getsetlist[] = {
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000333 {"func_code", (getter)func_get_code, (setter)func_set_code},
Neal Norwitz0ac60192007-05-27 04:08:54 +0000334 {"__code__", (getter)func_get_code, (setter)func_set_code},
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000335 {"func_defaults", (getter)func_get_defaults,
336 (setter)func_set_defaults},
Neal Norwitz0ac60192007-05-27 04:08:54 +0000337 {"__defaults__", (getter)func_get_defaults,
338 (setter)func_set_defaults},
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000339 {"func_dict", (getter)func_get_dict, (setter)func_set_dict},
340 {"__dict__", (getter)func_get_dict, (setter)func_set_dict},
Michael W. Hudson5e897952004-08-12 18:12:44 +0000341 {"func_name", (getter)func_get_name, (setter)func_set_name},
342 {"__name__", (getter)func_get_name, (setter)func_set_name},
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000343 {NULL} /* Sentinel */
344};
345
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000346PyDoc_STRVAR(func_doc,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000347"function(code, globals[, name[, argdefs[, closure]]])\n\
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000348\n\
349Create a function object from a code object and a dictionary.\n\
350The optional name string overrides the name from the code object.\n\
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000351The optional argdefs tuple specifies the default argument values.\n\
352The optional closure tuple supplies the bindings for free variables.");
353
354/* func_new() maintains the following invariants for closures. The
355 closure must correspond to the free variables of the code object.
356
357 if len(code.co_freevars) == 0:
358 closure = NULL
359 else:
360 len(closure) == len(code.co_freevars)
361 for every elt in closure, type(elt) == cell
362*/
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000363
364static PyObject *
365func_new(PyTypeObject* type, PyObject* args, PyObject* kw)
366{
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000367 PyCodeObject *code;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000368 PyObject *globals;
369 PyObject *name = Py_None;
370 PyObject *defaults = Py_None;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000371 PyObject *closure = Py_None;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000372 PyFunctionObject *newfunc;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000373 Py_ssize_t nfree, nclosure;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000374 static char *kwlist[] = {"code", "globals", "name",
Raymond Hettinger86578452003-05-06 09:01:41 +0000375 "argdefs", "closure", 0};
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000376
Raymond Hettinger86578452003-05-06 09:01:41 +0000377 if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!|OOO:function",
378 kwlist,
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000379 &PyCode_Type, &code,
380 &PyDict_Type, &globals,
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000381 &name, &defaults, &closure))
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000382 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000383 if (name != Py_None && !PyString_Check(name)) {
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000384 PyErr_SetString(PyExc_TypeError,
385 "arg 3 (name) must be None or string");
386 return NULL;
387 }
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000388 if (defaults != Py_None && !PyTuple_Check(defaults)) {
389 PyErr_SetString(PyExc_TypeError,
390 "arg 4 (defaults) must be None or tuple");
391 return NULL;
392 }
393 nfree = PyTuple_GET_SIZE(code->co_freevars);
394 if (!PyTuple_Check(closure)) {
395 if (nfree && closure == Py_None) {
396 PyErr_SetString(PyExc_TypeError,
397 "arg 5 (closure) must be tuple");
398 return NULL;
399 }
400 else if (closure != Py_None) {
401 PyErr_SetString(PyExc_TypeError,
402 "arg 5 (closure) must be None or tuple");
403 return NULL;
404 }
405 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000406
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000407 /* check that the closure is well-formed */
408 nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure);
409 if (nfree != nclosure)
410 return PyErr_Format(PyExc_ValueError,
Martin v. Löwis2c95cc62006-02-16 06:54:25 +0000411 "%s requires closure of length %zd, not %zd",
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000412 PyString_AS_STRING(code->co_name),
Martin v. Löwise0e89f72006-02-16 06:59:22 +0000413 nfree, nclosure);
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000414 if (nclosure) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000415 Py_ssize_t i;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000416 for (i = 0; i < nclosure; i++) {
417 PyObject *o = PyTuple_GET_ITEM(closure, i);
418 if (!PyCell_Check(o)) {
419 return PyErr_Format(PyExc_TypeError,
420 "arg 5 (closure) expected cell, found %s",
421 o->ob_type->tp_name);
422 }
423 }
424 }
425
426 newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code,
427 globals);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000428 if (newfunc == NULL)
429 return NULL;
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000430
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000431 if (name != Py_None) {
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000432 Py_INCREF(name);
433 Py_DECREF(newfunc->func_name);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000434 newfunc->func_name = name;
435 }
436 if (defaults != Py_None) {
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000437 Py_INCREF(defaults);
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000438 newfunc->func_defaults = defaults;
439 }
Jeremy Hyltondf3f7932002-07-11 18:30:27 +0000440 if (closure != Py_None) {
441 Py_INCREF(closure);
442 newfunc->func_closure = closure;
443 }
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000444
445 return (PyObject *)newfunc;
446}
447
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000448static void
Fred Drakeee238b92000-07-09 06:03:25 +0000449func_dealloc(PyFunctionObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000450{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000451 _PyObject_GC_UNTRACK(op);
Fred Drakec916f5a2001-10-26 17:56:51 +0000452 if (op->func_weakreflist != NULL)
453 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000454 Py_DECREF(op->func_code);
455 Py_DECREF(op->func_globals);
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000456 Py_XDECREF(op->func_module);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457 Py_DECREF(op->func_name);
458 Py_XDECREF(op->func_defaults);
459 Py_XDECREF(op->func_doc);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000460 Py_XDECREF(op->func_dict);
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000461 Py_XDECREF(op->func_closure);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000462 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000463}
464
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465static PyObject*
Fred Drakeee238b92000-07-09 06:03:25 +0000466func_repr(PyFunctionObject *op)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000467{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000468 return PyString_FromFormat("<function %s at %p>",
469 PyString_AsString(op->func_name),
Barry Warsaw7ce36942001-08-24 18:34:26 +0000470 op);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000471}
472
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000473static int
Jeremy Hylton8caad492000-06-23 14:18:11 +0000474func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
475{
Thomas Woutersc6e55062006-04-15 21:47:09 +0000476 Py_VISIT(f->func_code);
477 Py_VISIT(f->func_globals);
478 Py_VISIT(f->func_module);
479 Py_VISIT(f->func_defaults);
480 Py_VISIT(f->func_doc);
481 Py_VISIT(f->func_name);
482 Py_VISIT(f->func_dict);
483 Py_VISIT(f->func_closure);
Jeremy Hylton8caad492000-06-23 14:18:11 +0000484 return 0;
485}
486
Tim Peters6d6c1a32001-08-02 04:15:00 +0000487static PyObject *
488function_call(PyObject *func, PyObject *arg, PyObject *kw)
489{
490 PyObject *result;
491 PyObject *argdefs;
Amaury Forgeot d'Arc595f7a52009-06-25 22:29:29 +0000492 PyObject *kwtuple = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000493 PyObject **d, **k;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000494 Py_ssize_t nk, nd;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000495
496 argdefs = PyFunction_GET_DEFAULTS(func);
497 if (argdefs != NULL && PyTuple_Check(argdefs)) {
498 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
Amaury Forgeot d'Arc595f7a52009-06-25 22:29:29 +0000499 nd = PyTuple_GET_SIZE(argdefs);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000500 }
501 else {
502 d = NULL;
503 nd = 0;
504 }
505
506 if (kw != NULL && PyDict_Check(kw)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000507 Py_ssize_t pos, i;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000508 nk = PyDict_Size(kw);
Amaury Forgeot d'Arc595f7a52009-06-25 22:29:29 +0000509 kwtuple = PyTuple_New(2*nk);
510 if (kwtuple == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000511 return NULL;
Amaury Forgeot d'Arc595f7a52009-06-25 22:29:29 +0000512 k = &PyTuple_GET_ITEM(kwtuple, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000513 pos = i = 0;
Amaury Forgeot d'Arc595f7a52009-06-25 22:29:29 +0000514 while (PyDict_Next(kw, &pos, &k[i], &k[i+1])) {
515 Py_INCREF(k[i]);
516 Py_INCREF(k[i+1]);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000517 i += 2;
Amaury Forgeot d'Arc595f7a52009-06-25 22:29:29 +0000518 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000519 nk = i/2;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000520 }
521 else {
522 k = NULL;
523 nk = 0;
524 }
525
526 result = PyEval_EvalCodeEx(
527 (PyCodeObject *)PyFunction_GET_CODE(func),
528 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Amaury Forgeot d'Arc595f7a52009-06-25 22:29:29 +0000529 &PyTuple_GET_ITEM(arg, 0), PyTuple_GET_SIZE(arg),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000530 k, nk, d, nd,
531 PyFunction_GET_CLOSURE(func));
532
Amaury Forgeot d'Arc595f7a52009-06-25 22:29:29 +0000533 Py_XDECREF(kwtuple);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000534
535 return result;
536}
537
538/* Bind a function to an object */
539static PyObject *
540func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
541{
542 if (obj == Py_None)
543 obj = NULL;
544 return PyMethod_New(func, obj, type);
545}
546
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547PyTypeObject PyFunction_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000548 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000549 "function",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000550 sizeof(PyFunctionObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000551 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +0000552 (destructor)func_dealloc, /* tp_dealloc */
553 0, /* tp_print */
554 0, /* tp_getattr */
555 0, /* tp_setattr */
556 0, /* tp_compare */
557 (reprfunc)func_repr, /* tp_repr */
558 0, /* tp_as_number */
559 0, /* tp_as_sequence */
560 0, /* tp_as_mapping */
561 0, /* tp_hash */
562 function_call, /* tp_call */
563 0, /* tp_str */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000564 PyObject_GenericGetAttr, /* tp_getattro */
565 PyObject_GenericSetAttr, /* tp_setattro */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000566 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000567 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000568 func_doc, /* tp_doc */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000569 (traverseproc)func_traverse, /* tp_traverse */
570 0, /* tp_clear */
571 0, /* tp_richcompare */
Fred Drakedb81e8d2001-03-23 04:19:27 +0000572 offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000573 0, /* tp_iter */
574 0, /* tp_iternext */
575 0, /* tp_methods */
576 func_memberlist, /* tp_members */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000577 func_getsetlist, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000578 0, /* tp_base */
579 0, /* tp_dict */
580 func_descr_get, /* tp_descr_get */
581 0, /* tp_descr_set */
582 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000583 0, /* tp_init */
584 0, /* tp_alloc */
585 func_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000586};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000587
588
589/* Class method object */
590
591/* A class method receives the class as implicit first argument,
592 just like an instance method receives the instance.
593 To declare a class method, use this idiom:
594
595 class C:
596 def f(cls, arg1, arg2, ...): ...
597 f = classmethod(f)
598
599 It can be called either on the class (e.g. C.f()) or on an instance
600 (e.g. C().f()); the instance is ignored except for its class.
601 If a class method is called for a derived class, the derived class
602 object is passed as the implied first argument.
603
604 Class methods are different than C++ or Java static methods.
605 If you want those, see static methods below.
606*/
607
608typedef struct {
609 PyObject_HEAD
610 PyObject *cm_callable;
611} classmethod;
612
613static void
614cm_dealloc(classmethod *cm)
615{
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000616 _PyObject_GC_UNTRACK((PyObject *)cm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000617 Py_XDECREF(cm->cm_callable);
Christian Heimese93237d2007-12-19 02:37:44 +0000618 Py_TYPE(cm)->tp_free((PyObject *)cm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000619}
620
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000621static int
622cm_traverse(classmethod *cm, visitproc visit, void *arg)
623{
Thomas Woutersc6e55062006-04-15 21:47:09 +0000624 Py_VISIT(cm->cm_callable);
625 return 0;
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000626}
627
628static int
629cm_clear(classmethod *cm)
630{
Thomas Woutersedf17d82006-04-15 17:28:34 +0000631 Py_CLEAR(cm->cm_callable);
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000632 return 0;
633}
634
635
Tim Peters6d6c1a32001-08-02 04:15:00 +0000636static PyObject *
637cm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
638{
639 classmethod *cm = (classmethod *)self;
640
641 if (cm->cm_callable == NULL) {
642 PyErr_SetString(PyExc_RuntimeError,
643 "uninitialized classmethod object");
644 return NULL;
645 }
Guido van Rossum7e305482002-03-18 03:09:06 +0000646 if (type == NULL)
Christian Heimese93237d2007-12-19 02:37:44 +0000647 type = (PyObject *)(Py_TYPE(obj));
Tim Peters6d6c1a32001-08-02 04:15:00 +0000648 return PyMethod_New(cm->cm_callable,
Christian Heimese93237d2007-12-19 02:37:44 +0000649 type, (PyObject *)(Py_TYPE(type)));
Tim Peters6d6c1a32001-08-02 04:15:00 +0000650}
651
652static int
653cm_init(PyObject *self, PyObject *args, PyObject *kwds)
654{
655 classmethod *cm = (classmethod *)self;
656 PyObject *callable;
657
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000658 if (!PyArg_UnpackTuple(args, "classmethod", 1, 1, &callable))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000659 return -1;
Georg Brandld02db402006-02-21 22:13:44 +0000660 if (!_PyArg_NoKeywords("classmethod", kwds))
661 return -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000662 Py_INCREF(callable);
663 cm->cm_callable = callable;
664 return 0;
665}
666
Raymond Hettinger578a2282009-05-29 04:58:52 +0000667static PyMemberDef cm_memberlist[] = {
668 {"__func__", T_OBJECT, offsetof(classmethod, cm_callable), READONLY},
669 {NULL} /* Sentinel */
670};
671
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000672PyDoc_STRVAR(classmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000673"classmethod(function) -> method\n\
674\n\
675Convert a function to be a class method.\n\
676\n\
677A class method receives the class as implicit first argument,\n\
678just like an instance method receives the instance.\n\
679To declare a class method, use this idiom:\n\
680\n\
681 class C:\n\
682 def f(cls, arg1, arg2, ...): ...\n\
683 f = classmethod(f)\n\
684\n\
685It can be called either on the class (e.g. C.f()) or on an instance\n\
686(e.g. C().f()). The instance is ignored except for its class.\n\
687If a class method is called for a derived class, the derived class\n\
688object is passed as the implied first argument.\n\
Sjoerd Mullender564980b2001-12-17 11:39:56 +0000689\n\
Guido van Rossum33c1a882001-12-17 02:53:53 +0000690Class methods are different than C++ or Java static methods.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000691If you want those, see the staticmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000692
Tim Peters6d6c1a32001-08-02 04:15:00 +0000693PyTypeObject PyClassMethod_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000694 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000695 "classmethod",
696 sizeof(classmethod),
697 0,
698 (destructor)cm_dealloc, /* tp_dealloc */
699 0, /* tp_print */
700 0, /* tp_getattr */
701 0, /* tp_setattr */
702 0, /* tp_compare */
703 0, /* tp_repr */
704 0, /* tp_as_number */
705 0, /* tp_as_sequence */
706 0, /* tp_as_mapping */
707 0, /* tp_hash */
708 0, /* tp_call */
709 0, /* tp_str */
710 PyObject_GenericGetAttr, /* tp_getattro */
711 0, /* tp_setattro */
712 0, /* tp_as_buffer */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000713 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000714 classmethod_doc, /* tp_doc */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000715 (traverseproc)cm_traverse, /* tp_traverse */
716 (inquiry)cm_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000717 0, /* tp_richcompare */
718 0, /* tp_weaklistoffset */
719 0, /* tp_iter */
720 0, /* tp_iternext */
721 0, /* tp_methods */
Raymond Hettinger578a2282009-05-29 04:58:52 +0000722 cm_memberlist, /* tp_members */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000723 0, /* tp_getset */
724 0, /* tp_base */
725 0, /* tp_dict */
726 cm_descr_get, /* tp_descr_get */
727 0, /* tp_descr_set */
728 0, /* tp_dictoffset */
729 cm_init, /* tp_init */
730 PyType_GenericAlloc, /* tp_alloc */
731 PyType_GenericNew, /* tp_new */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000732 PyObject_GC_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000733};
734
735PyObject *
736PyClassMethod_New(PyObject *callable)
737{
738 classmethod *cm = (classmethod *)
739 PyType_GenericAlloc(&PyClassMethod_Type, 0);
740 if (cm != NULL) {
741 Py_INCREF(callable);
742 cm->cm_callable = callable;
743 }
744 return (PyObject *)cm;
745}
746
747
748/* Static method object */
749
750/* A static method does not receive an implicit first argument.
751 To declare a static method, use this idiom:
752
753 class C:
754 def f(arg1, arg2, ...): ...
755 f = staticmethod(f)
756
757 It can be called either on the class (e.g. C.f()) or on an instance
758 (e.g. C().f()); the instance is ignored except for its class.
759
760 Static methods in Python are similar to those found in Java or C++.
761 For a more advanced concept, see class methods above.
762*/
763
764typedef struct {
765 PyObject_HEAD
766 PyObject *sm_callable;
767} staticmethod;
768
769static void
770sm_dealloc(staticmethod *sm)
771{
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000772 _PyObject_GC_UNTRACK((PyObject *)sm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000773 Py_XDECREF(sm->sm_callable);
Christian Heimese93237d2007-12-19 02:37:44 +0000774 Py_TYPE(sm)->tp_free((PyObject *)sm);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000775}
776
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000777static int
778sm_traverse(staticmethod *sm, visitproc visit, void *arg)
779{
Thomas Woutersc6e55062006-04-15 21:47:09 +0000780 Py_VISIT(sm->sm_callable);
781 return 0;
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000782}
783
784static int
785sm_clear(staticmethod *sm)
786{
787 Py_XDECREF(sm->sm_callable);
788 sm->sm_callable = NULL;
789
790 return 0;
791}
792
Tim Peters6d6c1a32001-08-02 04:15:00 +0000793static PyObject *
794sm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
795{
796 staticmethod *sm = (staticmethod *)self;
797
798 if (sm->sm_callable == NULL) {
799 PyErr_SetString(PyExc_RuntimeError,
800 "uninitialized staticmethod object");
801 return NULL;
802 }
803 Py_INCREF(sm->sm_callable);
804 return sm->sm_callable;
805}
806
807static int
808sm_init(PyObject *self, PyObject *args, PyObject *kwds)
809{
810 staticmethod *sm = (staticmethod *)self;
811 PyObject *callable;
812
Raymond Hettingerea3fdf42002-12-29 16:33:45 +0000813 if (!PyArg_UnpackTuple(args, "staticmethod", 1, 1, &callable))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000814 return -1;
Georg Brandld02db402006-02-21 22:13:44 +0000815 if (!_PyArg_NoKeywords("staticmethod", kwds))
816 return -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000817 Py_INCREF(callable);
818 sm->sm_callable = callable;
819 return 0;
820}
821
Raymond Hettinger578a2282009-05-29 04:58:52 +0000822static PyMemberDef sm_memberlist[] = {
823 {"__func__", T_OBJECT, offsetof(staticmethod, sm_callable), READONLY},
824 {NULL} /* Sentinel */
825};
826
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000827PyDoc_STRVAR(staticmethod_doc,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000828"staticmethod(function) -> method\n\
829\n\
830Convert a function to be a static method.\n\
831\n\
832A static method does not receive an implicit first argument.\n\
833To declare a static method, use this idiom:\n\
834\n\
835 class C:\n\
836 def f(arg1, arg2, ...): ...\n\
837 f = staticmethod(f)\n\
838\n\
839It can be called either on the class (e.g. C.f()) or on an instance\n\
840(e.g. C().f()). The instance is ignored except for its class.\n\
841\n\
842Static methods in Python are similar to those found in Java or C++.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000843For a more advanced concept, see the classmethod builtin.");
Guido van Rossum33c1a882001-12-17 02:53:53 +0000844
Tim Peters6d6c1a32001-08-02 04:15:00 +0000845PyTypeObject PyStaticMethod_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000846 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000847 "staticmethod",
848 sizeof(staticmethod),
849 0,
850 (destructor)sm_dealloc, /* tp_dealloc */
851 0, /* tp_print */
852 0, /* tp_getattr */
853 0, /* tp_setattr */
854 0, /* tp_compare */
855 0, /* tp_repr */
856 0, /* tp_as_number */
857 0, /* tp_as_sequence */
858 0, /* tp_as_mapping */
859 0, /* tp_hash */
860 0, /* tp_call */
861 0, /* tp_str */
862 PyObject_GenericGetAttr, /* tp_getattro */
863 0, /* tp_setattro */
864 0, /* tp_as_buffer */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000865 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Guido van Rossum33c1a882001-12-17 02:53:53 +0000866 staticmethod_doc, /* tp_doc */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000867 (traverseproc)sm_traverse, /* tp_traverse */
868 (inquiry)sm_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000869 0, /* tp_richcompare */
870 0, /* tp_weaklistoffset */
871 0, /* tp_iter */
872 0, /* tp_iternext */
873 0, /* tp_methods */
Raymond Hettinger578a2282009-05-29 04:58:52 +0000874 sm_memberlist, /* tp_members */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000875 0, /* tp_getset */
876 0, /* tp_base */
877 0, /* tp_dict */
878 sm_descr_get, /* tp_descr_get */
879 0, /* tp_descr_set */
880 0, /* tp_dictoffset */
881 sm_init, /* tp_init */
882 PyType_GenericAlloc, /* tp_alloc */
883 PyType_GenericNew, /* tp_new */
Jeremy Hylton400d8ee2003-04-08 21:28:47 +0000884 PyObject_GC_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000885};
886
887PyObject *
888PyStaticMethod_New(PyObject *callable)
889{
890 staticmethod *sm = (staticmethod *)
891 PyType_GenericAlloc(&PyStaticMethod_Type, 0);
892 if (sm != NULL) {
893 Py_INCREF(callable);
894 sm->sm_callable = callable;
895 }
896 return (PyObject *)sm;
897}