blob: 6532e58c43e2fc2e5879ac1f1dccdc26275a9974 [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{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000012 PyFunctionObject *op = PyObject_NEW(PyFunctionObject,
13 &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;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000040 PyObject_GC_Init(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
130static struct memberlist func_memberlist[] = {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000131 {"func_code", T_OBJECT, OFF(func_code)},
132 {"func_globals", T_OBJECT, OFF(func_globals), READONLY},
133 {"func_name", T_OBJECT, OFF(func_name), READONLY},
134 {"__name__", T_OBJECT, OFF(func_name), READONLY},
Jeremy Hylton3f571d62001-02-28 02:42:56 +0000135 {"func_closure", T_OBJECT, OFF(func_closure), READONLY},
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000136 {"func_defaults", T_OBJECT, OFF(func_defaults)},
137 {"func_doc", T_OBJECT, OFF(func_doc)},
138 {"__doc__", T_OBJECT, OFF(func_doc)},
139 {"func_dict", T_OBJECT, OFF(func_dict)},
140 {"__dict__", T_OBJECT, OFF(func_dict)},
141 {NULL} /* Sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000142};
143
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000144static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000145func_getattro(PyObject *op, PyObject *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000146{
Barry Warsawd6a9e842001-01-15 20:40:19 +0000147 char *sname = PyString_AsString(name);
148
149 if (sname[0] != '_' && PyEval_GetRestricted()) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum10393b11995-01-10 10:39:49 +0000151 "function attributes not accessible in restricted mode");
152 return NULL;
153 }
Barry Warsaw142865c2001-08-14 18:23:58 +0000154 /* If func_dict is being accessed but no attribute has been set
155 * yet, then initialize it to the empty dictionary.
156 */
157 if ((!strcmp(sname, "func_dict") || !strcmp(sname, "__dict__"))
158 && ((PyFunctionObject*)op)->func_dict == NULL)
159 {
160 PyFunctionObject* funcop = (PyFunctionObject*)op;
161
162 funcop->func_dict = PyDict_New();
163 if (funcop->func_dict == NULL)
164 return NULL;
165 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000166 return PyObject_GenericGetAttr(op, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000167}
168
Guido van Rossum0dabace1998-05-22 00:55:34 +0000169static int
Tim Peters6d6c1a32001-08-02 04:15:00 +0000170func_setattro(PyObject *op, PyObject *name, PyObject *value)
Guido van Rossum0dabace1998-05-22 00:55:34 +0000171{
Barry Warsawd6a9e842001-01-15 20:40:19 +0000172 char *sname = PyString_AsString(name);
173
Guido van Rossum0dabace1998-05-22 00:55:34 +0000174 if (PyEval_GetRestricted()) {
175 PyErr_SetString(PyExc_RuntimeError,
176 "function attributes not settable in restricted mode");
177 return -1;
178 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000179 if (strcmp(sname, "func_code") == 0) {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000180 /* not legal to del f.func_code or to set it to anything
181 * other than a code object.
182 */
Guido van Rossum0dabace1998-05-22 00:55:34 +0000183 if (value == NULL || !PyCode_Check(value)) {
184 PyErr_SetString(
185 PyExc_TypeError,
186 "func_code must be set to a code object");
187 return -1;
188 }
189 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000190 else if (strcmp(sname, "func_defaults") == 0) {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000191 /* legal to del f.func_defaults. Can only set
192 * func_defaults to NULL or a tuple.
193 */
194 if (value == Py_None)
195 value = NULL;
196 if (value != NULL && !PyTuple_Check(value)) {
Guido van Rossum0dabace1998-05-22 00:55:34 +0000197 PyErr_SetString(
198 PyExc_TypeError,
199 "func_defaults must be set to a tuple object");
200 return -1;
201 }
Guido van Rossum0dabace1998-05-22 00:55:34 +0000202 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000203 else if (!strcmp(sname, "func_dict") || !strcmp(sname, "__dict__")) {
Barry Warsaw142865c2001-08-14 18:23:58 +0000204 /* It is illegal to del f.func_dict. Can only set
205 * func_dict to a dictionary.
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000206 */
Barry Warsaw142865c2001-08-14 18:23:58 +0000207 if (value == NULL) {
Barry Warsawd6a9e842001-01-15 20:40:19 +0000208 PyErr_SetString(
209 PyExc_TypeError,
Barry Warsaw142865c2001-08-14 18:23:58 +0000210 "function's dictionary may not be deleted");
211 return -1;
212 }
213 if (!PyDict_Check(value)) {
214 PyErr_SetString(
215 PyExc_TypeError,
216 "setting function's dictionary to a non-dict");
Barry Warsawd6a9e842001-01-15 20:40:19 +0000217 return -1;
218 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000219 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000220 return PyObject_GenericSetAttr(op, name, value);
Guido van Rossum0dabace1998-05-22 00:55:34 +0000221}
222
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223static void
Fred Drakeee238b92000-07-09 06:03:25 +0000224func_dealloc(PyFunctionObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225{
Fred Drakedb81e8d2001-03-23 04:19:27 +0000226 PyObject_ClearWeakRefs((PyObject *) op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000227 PyObject_GC_Fini(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 Py_DECREF(op->func_code);
229 Py_DECREF(op->func_globals);
230 Py_DECREF(op->func_name);
231 Py_XDECREF(op->func_defaults);
232 Py_XDECREF(op->func_doc);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000233 Py_XDECREF(op->func_dict);
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000234 Py_XDECREF(op->func_closure);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000235 op = (PyFunctionObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000236 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237}
238
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000239static PyObject*
Fred Drakeee238b92000-07-09 06:03:25 +0000240func_repr(PyFunctionObject *op)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000241{
242 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243 if (op->func_name == Py_None)
Fred Drakea44d3532000-06-30 15:01:00 +0000244 sprintf(buf, "<anonymous function at %p>", op);
Guido van Rossum590baa41993-11-30 13:40:46 +0000245 else
Fred Drakea44d3532000-06-30 15:01:00 +0000246 sprintf(buf, "<function %.100s at %p>",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000247 PyString_AsString(op->func_name),
Fred Drakea44d3532000-06-30 15:01:00 +0000248 op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000249 return PyString_FromString(buf);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000250}
251
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000252static int
Jeremy Hylton8caad492000-06-23 14:18:11 +0000253func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
254{
255 int err;
256 if (f->func_code) {
257 err = visit(f->func_code, arg);
258 if (err)
259 return err;
260 }
261 if (f->func_globals) {
262 err = visit(f->func_globals, arg);
263 if (err)
264 return err;
265 }
266 if (f->func_defaults) {
267 err = visit(f->func_defaults, arg);
268 if (err)
269 return err;
270 }
271 if (f->func_doc) {
272 err = visit(f->func_doc, arg);
273 if (err)
274 return err;
275 }
276 if (f->func_name) {
277 err = visit(f->func_name, arg);
278 if (err)
279 return err;
280 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000281 if (f->func_dict) {
282 err = visit(f->func_dict, arg);
283 if (err)
284 return err;
285 }
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000286 if (f->func_closure) {
287 err = visit(f->func_closure, arg);
288 if (err)
289 return err;
290 }
Jeremy Hylton8caad492000-06-23 14:18:11 +0000291 return 0;
292}
293
Tim Peters6d6c1a32001-08-02 04:15:00 +0000294static PyObject *
295function_call(PyObject *func, PyObject *arg, PyObject *kw)
296{
297 PyObject *result;
298 PyObject *argdefs;
299 PyObject **d, **k;
300 int nk, nd;
301
302 argdefs = PyFunction_GET_DEFAULTS(func);
303 if (argdefs != NULL && PyTuple_Check(argdefs)) {
304 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
305 nd = PyTuple_Size(argdefs);
306 }
307 else {
308 d = NULL;
309 nd = 0;
310 }
311
312 if (kw != NULL && PyDict_Check(kw)) {
313 int pos, i;
314 nk = PyDict_Size(kw);
315 k = PyMem_NEW(PyObject *, 2*nk);
316 if (k == NULL) {
317 PyErr_NoMemory();
318 Py_DECREF(arg);
319 return NULL;
320 }
321 pos = i = 0;
322 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
323 i += 2;
324 nk = i/2;
325 /* XXX This is broken if the caller deletes dict items! */
326 }
327 else {
328 k = NULL;
329 nk = 0;
330 }
331
332 result = PyEval_EvalCodeEx(
333 (PyCodeObject *)PyFunction_GET_CODE(func),
334 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
335 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
336 k, nk, d, nd,
337 PyFunction_GET_CLOSURE(func));
338
339 if (k != NULL)
340 PyMem_DEL(k);
341
342 return result;
343}
344
345/* Bind a function to an object */
346static PyObject *
347func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
348{
349 if (obj == Py_None)
350 obj = NULL;
351 return PyMethod_New(func, obj, type);
352}
353
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354PyTypeObject PyFunction_Type = {
355 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000356 0,
357 "function",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000358 sizeof(PyFunctionObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000359 0,
Tim Peters6d6c1a32001-08-02 04:15:00 +0000360 (destructor)func_dealloc, /* tp_dealloc */
361 0, /* tp_print */
362 0, /* tp_getattr */
363 0, /* tp_setattr */
364 0, /* tp_compare */
365 (reprfunc)func_repr, /* tp_repr */
366 0, /* tp_as_number */
367 0, /* tp_as_sequence */
368 0, /* tp_as_mapping */
369 0, /* tp_hash */
370 function_call, /* tp_call */
371 0, /* tp_str */
372 func_getattro, /* tp_getattro */
373 func_setattro, /* tp_setattro */
374 0, /* tp_as_buffer */
375 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
376 0, /* tp_doc */
377 (traverseproc)func_traverse, /* tp_traverse */
378 0, /* tp_clear */
379 0, /* tp_richcompare */
Fred Drakedb81e8d2001-03-23 04:19:27 +0000380 offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000381 0, /* tp_iter */
382 0, /* tp_iternext */
383 0, /* tp_methods */
384 func_memberlist, /* tp_members */
385 0, /* tp_getset */
386 0, /* tp_base */
387 0, /* tp_dict */
388 func_descr_get, /* tp_descr_get */
389 0, /* tp_descr_set */
390 offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000392
393
394/* Class method object */
395
396/* A class method receives the class as implicit first argument,
397 just like an instance method receives the instance.
398 To declare a class method, use this idiom:
399
400 class C:
401 def f(cls, arg1, arg2, ...): ...
402 f = classmethod(f)
403
404 It can be called either on the class (e.g. C.f()) or on an instance
405 (e.g. C().f()); the instance is ignored except for its class.
406 If a class method is called for a derived class, the derived class
407 object is passed as the implied first argument.
408
409 Class methods are different than C++ or Java static methods.
410 If you want those, see static methods below.
411*/
412
413typedef struct {
414 PyObject_HEAD
415 PyObject *cm_callable;
416} classmethod;
417
418static void
419cm_dealloc(classmethod *cm)
420{
421 Py_XDECREF(cm->cm_callable);
422 PyObject_DEL(cm);
423}
424
425static PyObject *
426cm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
427{
428 classmethod *cm = (classmethod *)self;
429
430 if (cm->cm_callable == NULL) {
431 PyErr_SetString(PyExc_RuntimeError,
432 "uninitialized classmethod object");
433 return NULL;
434 }
435 return PyMethod_New(cm->cm_callable,
436 type, (PyObject *)(type->ob_type));
437}
438
439static int
440cm_init(PyObject *self, PyObject *args, PyObject *kwds)
441{
442 classmethod *cm = (classmethod *)self;
443 PyObject *callable;
444
445 if (!PyArg_ParseTuple(args, "O:callable", &callable))
446 return -1;
447 Py_INCREF(callable);
448 cm->cm_callable = callable;
449 return 0;
450}
451
452PyTypeObject PyClassMethod_Type = {
453 PyObject_HEAD_INIT(&PyType_Type)
454 0,
455 "classmethod",
456 sizeof(classmethod),
457 0,
458 (destructor)cm_dealloc, /* tp_dealloc */
459 0, /* tp_print */
460 0, /* tp_getattr */
461 0, /* tp_setattr */
462 0, /* tp_compare */
463 0, /* tp_repr */
464 0, /* tp_as_number */
465 0, /* tp_as_sequence */
466 0, /* tp_as_mapping */
467 0, /* tp_hash */
468 0, /* tp_call */
469 0, /* tp_str */
470 PyObject_GenericGetAttr, /* tp_getattro */
471 0, /* tp_setattro */
472 0, /* tp_as_buffer */
473 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
474 0, /* tp_doc */
475 0, /* tp_traverse */
476 0, /* tp_clear */
477 0, /* tp_richcompare */
478 0, /* tp_weaklistoffset */
479 0, /* tp_iter */
480 0, /* tp_iternext */
481 0, /* tp_methods */
482 0, /* tp_members */
483 0, /* tp_getset */
484 0, /* tp_base */
485 0, /* tp_dict */
486 cm_descr_get, /* tp_descr_get */
487 0, /* tp_descr_set */
488 0, /* tp_dictoffset */
489 cm_init, /* tp_init */
490 PyType_GenericAlloc, /* tp_alloc */
491 PyType_GenericNew, /* tp_new */
492};
493
494PyObject *
495PyClassMethod_New(PyObject *callable)
496{
497 classmethod *cm = (classmethod *)
498 PyType_GenericAlloc(&PyClassMethod_Type, 0);
499 if (cm != NULL) {
500 Py_INCREF(callable);
501 cm->cm_callable = callable;
502 }
503 return (PyObject *)cm;
504}
505
506
507/* Static method object */
508
509/* A static method does not receive an implicit first argument.
510 To declare a static method, use this idiom:
511
512 class C:
513 def f(arg1, arg2, ...): ...
514 f = staticmethod(f)
515
516 It can be called either on the class (e.g. C.f()) or on an instance
517 (e.g. C().f()); the instance is ignored except for its class.
518
519 Static methods in Python are similar to those found in Java or C++.
520 For a more advanced concept, see class methods above.
521*/
522
523typedef struct {
524 PyObject_HEAD
525 PyObject *sm_callable;
526} staticmethod;
527
528static void
529sm_dealloc(staticmethod *sm)
530{
531 Py_XDECREF(sm->sm_callable);
532 PyObject_DEL(sm);
533}
534
535static PyObject *
536sm_descr_get(PyObject *self, PyObject *obj, PyObject *type)
537{
538 staticmethod *sm = (staticmethod *)self;
539
540 if (sm->sm_callable == NULL) {
541 PyErr_SetString(PyExc_RuntimeError,
542 "uninitialized staticmethod object");
543 return NULL;
544 }
545 Py_INCREF(sm->sm_callable);
546 return sm->sm_callable;
547}
548
549static int
550sm_init(PyObject *self, PyObject *args, PyObject *kwds)
551{
552 staticmethod *sm = (staticmethod *)self;
553 PyObject *callable;
554
555 if (!PyArg_ParseTuple(args, "O:callable", &callable))
556 return -1;
557 Py_INCREF(callable);
558 sm->sm_callable = callable;
559 return 0;
560}
561
562PyTypeObject PyStaticMethod_Type = {
563 PyObject_HEAD_INIT(&PyType_Type)
564 0,
565 "staticmethod",
566 sizeof(staticmethod),
567 0,
568 (destructor)sm_dealloc, /* tp_dealloc */
569 0, /* tp_print */
570 0, /* tp_getattr */
571 0, /* tp_setattr */
572 0, /* tp_compare */
573 0, /* tp_repr */
574 0, /* tp_as_number */
575 0, /* tp_as_sequence */
576 0, /* tp_as_mapping */
577 0, /* tp_hash */
578 0, /* tp_call */
579 0, /* tp_str */
580 PyObject_GenericGetAttr, /* tp_getattro */
581 0, /* tp_setattro */
582 0, /* tp_as_buffer */
583 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
584 0, /* tp_doc */
585 0, /* tp_traverse */
586 0, /* tp_clear */
587 0, /* tp_richcompare */
588 0, /* tp_weaklistoffset */
589 0, /* tp_iter */
590 0, /* tp_iternext */
591 0, /* tp_methods */
592 0, /* tp_members */
593 0, /* tp_getset */
594 0, /* tp_base */
595 0, /* tp_dict */
596 sm_descr_get, /* tp_descr_get */
597 0, /* tp_descr_set */
598 0, /* tp_dictoffset */
599 sm_init, /* tp_init */
600 PyType_GenericAlloc, /* tp_alloc */
601 PyType_GenericNew, /* tp_new */
602};
603
604PyObject *
605PyStaticMethod_New(PyObject *callable)
606{
607 staticmethod *sm = (staticmethod *)
608 PyType_GenericAlloc(&PyStaticMethod_Type, 0);
609 if (sm != NULL) {
610 Py_INCREF(callable);
611 sm->sm_callable = callable;
612 }
613 return (PyObject *)sm;
614}