blob: 91a312759fc54b3406fbe25216aed0052ccc335c [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Function object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Guido van Rossum9bfef441993-03-29 10:43:31 +00005#include "compile.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +00006#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00007#include "structmember.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00008
Guido van Rossumc0b618a1997-05-02 03:12:38 +00009PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000010PyFunction_New(PyObject *code, PyObject *globals)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011{
Neil Schemenauere83c00e2001-08-29 23:54:21 +000012 PyFunctionObject *op = PyObject_GC_New(PyFunctionObject,
Guido van Rossumc0b618a1997-05-02 03:12:38 +000013 &PyFunction_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014 if (op != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000015 PyObject *doc;
16 PyObject *consts;
Fred Drakedb81e8d2001-03-23 04:19:27 +000017 op->func_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000018 Py_INCREF(code);
Guido van Rossum846e4311990-11-18 17:44:06 +000019 op->func_code = code;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000020 Py_INCREF(globals);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000021 op->func_globals = globals;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000022 op->func_name = ((PyCodeObject *)code)->co_name;
23 Py_INCREF(op->func_name);
Guido van Rossum2271bf71995-07-18 14:30:34 +000024 op->func_defaults = NULL; /* No default arguments */
Jeremy Hylton64949cb2001-01-25 20:06:59 +000025 op->func_closure = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000026 consts = ((PyCodeObject *)code)->co_consts;
27 if (PyTuple_Size(consts) >= 1) {
28 doc = PyTuple_GetItem(consts, 0);
Guido van Rossumec5b7762000-04-27 20:14:13 +000029 if (!PyString_Check(doc) && !PyUnicode_Check(doc))
Guido van Rossumc0b618a1997-05-02 03:12:38 +000030 doc = Py_None;
Guido van Rossum5bd38051995-01-07 12:01:30 +000031 }
32 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000033 doc = Py_None;
34 Py_INCREF(doc);
Guido van Rossum5bd38051995-01-07 12:01:30 +000035 op->func_doc = doc;
Barry Warsawd6a9e842001-01-15 20:40:19 +000036 op->func_dict = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037 }
Barry Warsawd6a9e842001-01-15 20:40:19 +000038 else
39 return NULL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +000040 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000041 return (PyObject *)op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042}
43
Guido van Rossumc0b618a1997-05-02 03:12:38 +000044PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000045PyFunction_GetCode(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000046{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000047 if (!PyFunction_Check(op)) {
48 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049 return NULL;
50 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 return ((PyFunctionObject *) op) -> func_code;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052}
53
Guido van Rossumc0b618a1997-05-02 03:12:38 +000054PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000055PyFunction_GetGlobals(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057 if (!PyFunction_Check(op)) {
58 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059 return NULL;
60 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000061 return ((PyFunctionObject *) op) -> func_globals;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062}
63
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000065PyFunction_GetDefaults(PyObject *op)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000066{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000067 if (!PyFunction_Check(op)) {
68 PyErr_BadInternalCall();
Guido van Rossum1d5735e1994-08-30 08:27:36 +000069 return NULL;
70 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000071 return ((PyFunctionObject *) op) -> func_defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000072}
73
74int
Fred Drakeee238b92000-07-09 06:03:25 +000075PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000076{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000077 if (!PyFunction_Check(op)) {
78 PyErr_BadInternalCall();
Guido van Rossum1d5735e1994-08-30 08:27:36 +000079 return -1;
80 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081 if (defaults == Py_None)
Guido van Rossum2271bf71995-07-18 14:30:34 +000082 defaults = NULL;
Guido van Rossum1109fbc1998-04-10 22:16:39 +000083 else if (PyTuple_Check(defaults)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084 Py_XINCREF(defaults);
Guido van Rossum1109fbc1998-04-10 22:16:39 +000085 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +000086 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000087 PyErr_SetString(PyExc_SystemError, "non-tuple default args");
Guido van Rossum1d5735e1994-08-30 08:27:36 +000088 return -1;
89 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090 Py_XDECREF(((PyFunctionObject *) op) -> func_defaults);
91 ((PyFunctionObject *) op) -> func_defaults = defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000092 return 0;
93}
94
Jeremy Hylton64949cb2001-01-25 20:06:59 +000095PyObject *
96PyFunction_GetClosure(PyObject *op)
97{
98 if (!PyFunction_Check(op)) {
99 PyErr_BadInternalCall();
100 return NULL;
101 }
102 return ((PyFunctionObject *) op) -> func_closure;
103}
104
105int
106PyFunction_SetClosure(PyObject *op, PyObject *closure)
107{
108 if (!PyFunction_Check(op)) {
109 PyErr_BadInternalCall();
110 return -1;
111 }
112 if (closure == Py_None)
113 closure = NULL;
114 else if (PyTuple_Check(closure)) {
115 Py_XINCREF(closure);
116 }
117 else {
118 PyErr_SetString(PyExc_SystemError, "non-tuple closure");
119 return -1;
120 }
121 Py_XDECREF(((PyFunctionObject *) op) -> func_closure);
122 ((PyFunctionObject *) op) -> func_closure = closure;
123 return 0;
124}
125
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126/* Methods */
127
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000128#define OFF(x) offsetof(PyFunctionObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000129
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000130#define RR ()
131
Guido van Rossum3f5da241990-12-20 15:06:42 +0000132static struct memberlist func_memberlist[] = {
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000133 {"func_closure", T_OBJECT, OFF(func_closure),
134 RESTRICTED|READONLY},
135 {"func_doc", T_OBJECT, OFF(func_doc), WRITE_RESTRICTED},
136 {"__doc__", T_OBJECT, OFF(func_doc), WRITE_RESTRICTED},
137 {"func_globals", T_OBJECT, OFF(func_globals),
138 RESTRICTED|READONLY},
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000139 {"func_name", T_OBJECT, OFF(func_name), READONLY},
140 {"__name__", T_OBJECT, OFF(func_name), READONLY},
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000141 {NULL} /* Sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000142};
143
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000144static int
145restricted(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000146{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000147 if (!PyEval_GetRestricted())
148 return 0;
149 PyErr_SetString(PyExc_RuntimeError,
150 "function attributes not accessible in restricted mode");
151 return 1;
152}
153
154static PyObject *
155func_get_dict(PyFunctionObject *op)
156{
157 if (restricted())
Guido van Rossum10393b11995-01-10 10:39:49 +0000158 return NULL;
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000159 if (op->func_dict == NULL) {
160 op->func_dict = PyDict_New();
161 if (op->func_dict == NULL)
Barry Warsaw142865c2001-08-14 18:23:58 +0000162 return NULL;
163 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000164 Py_INCREF(op->func_dict);
165 return op->func_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000166}
167
Guido van Rossum0dabace1998-05-22 00:55:34 +0000168static int
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000169func_set_dict(PyFunctionObject *op, PyObject *value)
Guido van Rossum0dabace1998-05-22 00:55:34 +0000170{
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000171 PyObject *tmp;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000172
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000173 if (restricted())
174 return -1;
175 /* It is illegal to del f.func_dict */
176 if (value == NULL) {
177 PyErr_SetString(PyExc_TypeError,
178 "function's dictionary may not be deleted");
Guido van Rossum0dabace1998-05-22 00:55:34 +0000179 return -1;
180 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000181 /* Can only set func_dict to a dictionary */
182 if (!PyDict_Check(value)) {
183 PyErr_SetString(PyExc_TypeError,
Barry Warsaw142865c2001-08-14 18:23:58 +0000184 "setting function's dictionary to a non-dict");
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000185 return -1;
Barry Warsawd6a9e842001-01-15 20:40:19 +0000186 }
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000187 tmp = op->func_dict;
188 Py_INCREF(value);
189 op->func_dict = value;
190 Py_XDECREF(tmp);
191 return 0;
Guido van Rossum0dabace1998-05-22 00:55:34 +0000192}
193
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000194static PyObject *
195func_get_code(PyFunctionObject *op)
196{
197 if (restricted())
198 return NULL;
199 Py_INCREF(op->func_code);
200 return op->func_code;
201}
202
203static int
204func_set_code(PyFunctionObject *op, PyObject *value)
205{
206 PyObject *tmp;
207
208 if (restricted())
209 return -1;
210 /* Not legal to del f.func_code or to set it to anything
211 * other than a code object. */
212 if (value == NULL || !PyCode_Check(value)) {
213 PyErr_SetString(PyExc_TypeError,
214 "func_code must be set to a code object");
215 return -1;
216 }
217 tmp = op->func_code;
218 Py_INCREF(value);
219 op->func_code = value;
220 Py_DECREF(tmp);
221 return 0;
222}
223
224static PyObject *
225func_get_defaults(PyFunctionObject *op)
226{
227 if (restricted())
228 return NULL;
229 if (op->func_defaults == NULL) {
230 Py_INCREF(Py_None);
231 return Py_None;
232 }
233 Py_INCREF(op->func_defaults);
234 return op->func_defaults;
235}
236
237static int
238func_set_defaults(PyFunctionObject *op, PyObject *value)
239{
240 PyObject *tmp;
241
242 if (restricted())
243 return -1;
244 /* Legal to del f.func_defaults.
245 * Can only set func_defaults to NULL or a tuple. */
246 if (value == Py_None)
247 value = NULL;
248 if (value != NULL && !PyTuple_Check(value)) {
249 PyErr_SetString(PyExc_TypeError,
250 "func_defaults must be set to a tuple object");
251 return -1;
252 }
253 tmp = op->func_defaults;
254 Py_XINCREF(value);
255 op->func_defaults = value;
256 Py_XDECREF(tmp);
257 return 0;
258}
259
260static struct getsetlist func_getsetlist[] = {
261 {"func_code", (getter)func_get_code, (setter)func_set_code},
262 {"func_defaults", (getter)func_get_defaults,
263 (setter)func_set_defaults},
264 {"func_dict", (getter)func_get_dict, (setter)func_set_dict},
265 {"__dict__", (getter)func_get_dict, (setter)func_set_dict},
266 {NULL} /* Sentinel */
267};
268
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269static void
Fred Drakeee238b92000-07-09 06:03:25 +0000270func_dealloc(PyFunctionObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000271{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000272 _PyObject_GC_UNTRACK(op);
Fred Drakedb81e8d2001-03-23 04:19:27 +0000273 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000274 Py_DECREF(op->func_code);
275 Py_DECREF(op->func_globals);
276 Py_DECREF(op->func_name);
277 Py_XDECREF(op->func_defaults);
278 Py_XDECREF(op->func_doc);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000279 Py_XDECREF(op->func_dict);
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000280 Py_XDECREF(op->func_closure);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000281 PyObject_GC_Del(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000282}
283
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000284static PyObject*
Fred Drakeee238b92000-07-09 06:03:25 +0000285func_repr(PyFunctionObject *op)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000286{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000287 if (op->func_name == Py_None)
Barry Warsaw7ce36942001-08-24 18:34:26 +0000288 return PyString_FromFormat("<anonymous function at %p>", op);
289 return PyString_FromFormat("<function %s at %p>",
290 PyString_AsString(op->func_name),
291 op);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000292}
293
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000294static int
Jeremy Hylton8caad492000-06-23 14:18:11 +0000295func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
296{
297 int err;
298 if (f->func_code) {
299 err = visit(f->func_code, arg);
300 if (err)
301 return err;
302 }
303 if (f->func_globals) {
304 err = visit(f->func_globals, arg);
305 if (err)
306 return err;
307 }
308 if (f->func_defaults) {
309 err = visit(f->func_defaults, arg);
310 if (err)
311 return err;
312 }
313 if (f->func_doc) {
314 err = visit(f->func_doc, arg);
315 if (err)
316 return err;
317 }
318 if (f->func_name) {
319 err = visit(f->func_name, arg);
320 if (err)
321 return err;
322 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000323 if (f->func_dict) {
324 err = visit(f->func_dict, arg);
325 if (err)
326 return err;
327 }
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000328 if (f->func_closure) {
329 err = visit(f->func_closure, arg);
330 if (err)
331 return err;
332 }
Jeremy Hylton8caad492000-06-23 14:18:11 +0000333 return 0;
334}
335
Tim Peters6d6c1a32001-08-02 04:15:00 +0000336static PyObject *
337function_call(PyObject *func, PyObject *arg, PyObject *kw)
338{
339 PyObject *result;
340 PyObject *argdefs;
341 PyObject **d, **k;
342 int nk, nd;
343
344 argdefs = PyFunction_GET_DEFAULTS(func);
345 if (argdefs != NULL && PyTuple_Check(argdefs)) {
346 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
347 nd = PyTuple_Size(argdefs);
348 }
349 else {
350 d = NULL;
351 nd = 0;
352 }
353
354 if (kw != NULL && PyDict_Check(kw)) {
355 int pos, i;
356 nk = PyDict_Size(kw);
357 k = PyMem_NEW(PyObject *, 2*nk);
358 if (k == NULL) {
359 PyErr_NoMemory();
360 Py_DECREF(arg);
361 return NULL;
362 }
363 pos = i = 0;
364 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
365 i += 2;
366 nk = i/2;
367 /* XXX This is broken if the caller deletes dict items! */
368 }
369 else {
370 k = NULL;
371 nk = 0;
372 }
373
374 result = PyEval_EvalCodeEx(
375 (PyCodeObject *)PyFunction_GET_CODE(func),
376 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
377 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
378 k, nk, d, nd,
379 PyFunction_GET_CLOSURE(func));
380
381 if (k != NULL)
382 PyMem_DEL(k);
383
384 return result;
385}
386
387/* Bind a function to an object */
388static PyObject *
389func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
390{
391 if (obj == Py_None)
392 obj = NULL;
393 return PyMethod_New(func, obj, type);
394}
395
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396PyTypeObject PyFunction_Type = {
397 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398 0,
399 "function",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000400 sizeof(PyFunctionObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +0000402 (destructor)func_dealloc, /* tp_dealloc */
403 0, /* tp_print */
404 0, /* tp_getattr */
405 0, /* tp_setattr */
406 0, /* tp_compare */
407 (reprfunc)func_repr, /* tp_repr */
408 0, /* tp_as_number */
409 0, /* tp_as_sequence */
410 0, /* tp_as_mapping */
411 0, /* tp_hash */
412 function_call, /* tp_call */
413 0, /* tp_str */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000414 PyObject_GenericGetAttr, /* tp_getattro */
415 PyObject_GenericSetAttr, /* tp_setattro */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000416 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000417 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000418 0, /* tp_doc */
419 (traverseproc)func_traverse, /* tp_traverse */
420 0, /* tp_clear */
421 0, /* tp_richcompare */
Fred Drakedb81e8d2001-03-23 04:19:27 +0000422 offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000423 0, /* tp_iter */
424 0, /* tp_iternext */
425 0, /* tp_methods */
426 func_memberlist, /* tp_members */
Guido van Rossumd9d1d4a2001-09-17 23:46:56 +0000427 func_getsetlist, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000428 0, /* tp_base */
429 0, /* tp_dict */
430 func_descr_get, /* tp_descr_get */
431 0, /* tp_descr_set */
432 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000433};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000434
435
436/* Class method object */
437
438/* A class method receives the class as implicit first argument,
439 just like an instance method receives the instance.
440 To declare a class method, use this idiom:
441
442 class C:
443 def f(cls, arg1, arg2, ...): ...
444 f = classmethod(f)
445
446 It can be called either on the class (e.g. C.f()) or on an instance
447 (e.g. C().f()); the instance is ignored except for its class.
448 If a class method is called for a derived class, the derived class
449 object is passed as the implied first argument.
450
451 Class methods are different than C++ or Java static methods.
452 If you want those, see static methods below.
453*/
454
455typedef struct {
456 PyObject_HEAD
457 PyObject *cm_callable;
458} classmethod;
459
460static void
461cm_dealloc(classmethod *cm)
462{
463 Py_XDECREF(cm->cm_callable);
464 PyObject_DEL(cm);
465}
466
467static PyObject *
468cm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
469{
470 classmethod *cm = (classmethod *)self;
471
472 if (cm->cm_callable == NULL) {
473 PyErr_SetString(PyExc_RuntimeError,
474 "uninitialized classmethod object");
475 return NULL;
476 }
477 return PyMethod_New(cm->cm_callable,
478 type, (PyObject *)(type->ob_type));
479}
480
481static int
482cm_init(PyObject *self, PyObject *args, PyObject *kwds)
483{
484 classmethod *cm = (classmethod *)self;
485 PyObject *callable;
486
487 if (!PyArg_ParseTuple(args, "O:callable", &callable))
488 return -1;
489 Py_INCREF(callable);
490 cm->cm_callable = callable;
491 return 0;
492}
493
494PyTypeObject PyClassMethod_Type = {
495 PyObject_HEAD_INIT(&PyType_Type)
496 0,
497 "classmethod",
498 sizeof(classmethod),
499 0,
500 (destructor)cm_dealloc, /* tp_dealloc */
501 0, /* tp_print */
502 0, /* tp_getattr */
503 0, /* tp_setattr */
504 0, /* tp_compare */
505 0, /* tp_repr */
506 0, /* tp_as_number */
507 0, /* tp_as_sequence */
508 0, /* tp_as_mapping */
509 0, /* tp_hash */
510 0, /* tp_call */
511 0, /* tp_str */
512 PyObject_GenericGetAttr, /* tp_getattro */
513 0, /* tp_setattro */
514 0, /* tp_as_buffer */
515 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
516 0, /* tp_doc */
517 0, /* tp_traverse */
518 0, /* tp_clear */
519 0, /* tp_richcompare */
520 0, /* tp_weaklistoffset */
521 0, /* tp_iter */
522 0, /* tp_iternext */
523 0, /* tp_methods */
524 0, /* tp_members */
525 0, /* tp_getset */
526 0, /* tp_base */
527 0, /* tp_dict */
528 cm_descr_get, /* tp_descr_get */
529 0, /* tp_descr_set */
530 0, /* tp_dictoffset */
531 cm_init, /* tp_init */
532 PyType_GenericAlloc, /* tp_alloc */
533 PyType_GenericNew, /* tp_new */
534};
535
536PyObject *
537PyClassMethod_New(PyObject *callable)
538{
539 classmethod *cm = (classmethod *)
540 PyType_GenericAlloc(&PyClassMethod_Type, 0);
541 if (cm != NULL) {
542 Py_INCREF(callable);
543 cm->cm_callable = callable;
544 }
545 return (PyObject *)cm;
546}
547
548
549/* Static method object */
550
551/* A static method does not receive an implicit first argument.
552 To declare a static method, use this idiom:
553
554 class C:
555 def f(arg1, arg2, ...): ...
556 f = staticmethod(f)
557
558 It can be called either on the class (e.g. C.f()) or on an instance
559 (e.g. C().f()); the instance is ignored except for its class.
560
561 Static methods in Python are similar to those found in Java or C++.
562 For a more advanced concept, see class methods above.
563*/
564
565typedef struct {
566 PyObject_HEAD
567 PyObject *sm_callable;
568} staticmethod;
569
570static void
571sm_dealloc(staticmethod *sm)
572{
573 Py_XDECREF(sm->sm_callable);
574 PyObject_DEL(sm);
575}
576
577static PyObject *
578sm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
579{
580 staticmethod *sm = (staticmethod *)self;
581
582 if (sm->sm_callable == NULL) {
583 PyErr_SetString(PyExc_RuntimeError,
584 "uninitialized staticmethod object");
585 return NULL;
586 }
587 Py_INCREF(sm->sm_callable);
588 return sm->sm_callable;
589}
590
591static int
592sm_init(PyObject *self, PyObject *args, PyObject *kwds)
593{
594 staticmethod *sm = (staticmethod *)self;
595 PyObject *callable;
596
597 if (!PyArg_ParseTuple(args, "O:callable", &callable))
598 return -1;
599 Py_INCREF(callable);
600 sm->sm_callable = callable;
601 return 0;
602}
603
604PyTypeObject PyStaticMethod_Type = {
605 PyObject_HEAD_INIT(&PyType_Type)
606 0,
607 "staticmethod",
608 sizeof(staticmethod),
609 0,
610 (destructor)sm_dealloc, /* tp_dealloc */
611 0, /* tp_print */
612 0, /* tp_getattr */
613 0, /* tp_setattr */
614 0, /* tp_compare */
615 0, /* tp_repr */
616 0, /* tp_as_number */
617 0, /* tp_as_sequence */
618 0, /* tp_as_mapping */
619 0, /* tp_hash */
620 0, /* tp_call */
621 0, /* tp_str */
622 PyObject_GenericGetAttr, /* tp_getattro */
623 0, /* tp_setattro */
624 0, /* tp_as_buffer */
625 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
626 0, /* tp_doc */
627 0, /* tp_traverse */
628 0, /* tp_clear */
629 0, /* tp_richcompare */
630 0, /* tp_weaklistoffset */
631 0, /* tp_iter */
632 0, /* tp_iternext */
633 0, /* tp_methods */
634 0, /* tp_members */
635 0, /* tp_getset */
636 0, /* tp_base */
637 0, /* tp_dict */
638 sm_descr_get, /* tp_descr_get */
639 0, /* tp_descr_set */
640 0, /* tp_dictoffset */
641 sm_init, /* tp_init */
642 PyType_GenericAlloc, /* tp_alloc */
643 PyType_GenericNew, /* tp_new */
644};
645
646PyObject *
647PyStaticMethod_New(PyObject *callable)
648{
649 staticmethod *sm = (staticmethod *)
650 PyType_GenericAlloc(&PyStaticMethod_Type, 0);
651 if (sm != NULL) {
652 Py_INCREF(callable);
653 sm->sm_callable = callable;
654 }
655 return (PyObject *)sm;
656}