blob: 09c6cb80217d4fec6fc9bb705326d1d7ef1d64c1 [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"
Guido van Rossum3f5da241990-12-20 15:06:42 +00006#include "structmember.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00007
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +00009PyFunction_New(PyObject *code, PyObject *globals)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000010{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000011 PyFunctionObject *op = PyObject_NEW(PyFunctionObject,
12 &PyFunction_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000013 if (op != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000014 PyObject *doc;
15 PyObject *consts;
Fred Drakedb81e8d2001-03-23 04:19:27 +000016 op->func_weakreflist = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000017 Py_INCREF(code);
Guido van Rossum846e4311990-11-18 17:44:06 +000018 op->func_code = code;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000019 Py_INCREF(globals);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000020 op->func_globals = globals;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000021 op->func_name = ((PyCodeObject *)code)->co_name;
22 Py_INCREF(op->func_name);
Guido van Rossum2271bf71995-07-18 14:30:34 +000023 op->func_defaults = NULL; /* No default arguments */
Jeremy Hylton64949cb2001-01-25 20:06:59 +000024 op->func_closure = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000025 consts = ((PyCodeObject *)code)->co_consts;
26 if (PyTuple_Size(consts) >= 1) {
27 doc = PyTuple_GetItem(consts, 0);
Guido van Rossumec5b7762000-04-27 20:14:13 +000028 if (!PyString_Check(doc) && !PyUnicode_Check(doc))
Guido van Rossumc0b618a1997-05-02 03:12:38 +000029 doc = Py_None;
Guido van Rossum5bd38051995-01-07 12:01:30 +000030 }
31 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000032 doc = Py_None;
33 Py_INCREF(doc);
Guido van Rossum5bd38051995-01-07 12:01:30 +000034 op->func_doc = doc;
Barry Warsawd6a9e842001-01-15 20:40:19 +000035 op->func_dict = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036 }
Barry Warsawd6a9e842001-01-15 20:40:19 +000037 else
38 return NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000039 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000040 return (PyObject *)op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041}
42
Guido van Rossumc0b618a1997-05-02 03:12:38 +000043PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000044PyFunction_GetCode(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000046 if (!PyFunction_Check(op)) {
47 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048 return NULL;
49 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000050 return ((PyFunctionObject *) op) -> func_code;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051}
52
Guido van Rossumc0b618a1997-05-02 03:12:38 +000053PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000054PyFunction_GetGlobals(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000056 if (!PyFunction_Check(op)) {
57 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058 return NULL;
59 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000060 return ((PyFunctionObject *) op) -> func_globals;
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_GetDefaults(PyObject *op)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000065{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 if (!PyFunction_Check(op)) {
67 PyErr_BadInternalCall();
Guido van Rossum1d5735e1994-08-30 08:27:36 +000068 return NULL;
69 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000070 return ((PyFunctionObject *) op) -> func_defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000071}
72
73int
Fred Drakeee238b92000-07-09 06:03:25 +000074PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000075{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000076 if (!PyFunction_Check(op)) {
77 PyErr_BadInternalCall();
Guido van Rossum1d5735e1994-08-30 08:27:36 +000078 return -1;
79 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000080 if (defaults == Py_None)
Guido van Rossum2271bf71995-07-18 14:30:34 +000081 defaults = NULL;
Guido van Rossum1109fbc1998-04-10 22:16:39 +000082 else if (PyTuple_Check(defaults)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000083 Py_XINCREF(defaults);
Guido van Rossum1109fbc1998-04-10 22:16:39 +000084 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +000085 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086 PyErr_SetString(PyExc_SystemError, "non-tuple default args");
Guido van Rossum1d5735e1994-08-30 08:27:36 +000087 return -1;
88 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 Py_XDECREF(((PyFunctionObject *) op) -> func_defaults);
90 ((PyFunctionObject *) op) -> func_defaults = defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000091 return 0;
92}
93
Jeremy Hylton64949cb2001-01-25 20:06:59 +000094PyObject *
95PyFunction_GetClosure(PyObject *op)
96{
97 if (!PyFunction_Check(op)) {
98 PyErr_BadInternalCall();
99 return NULL;
100 }
101 return ((PyFunctionObject *) op) -> func_closure;
102}
103
104int
105PyFunction_SetClosure(PyObject *op, PyObject *closure)
106{
107 if (!PyFunction_Check(op)) {
108 PyErr_BadInternalCall();
109 return -1;
110 }
111 if (closure == Py_None)
112 closure = NULL;
113 else if (PyTuple_Check(closure)) {
114 Py_XINCREF(closure);
115 }
116 else {
117 PyErr_SetString(PyExc_SystemError, "non-tuple closure");
118 return -1;
119 }
120 Py_XDECREF(((PyFunctionObject *) op) -> func_closure);
121 ((PyFunctionObject *) op) -> func_closure = closure;
122 return 0;
123}
124
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125/* Methods */
126
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000127#define OFF(x) offsetof(PyFunctionObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000128
129static struct memberlist func_memberlist[] = {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000130 {"func_code", T_OBJECT, OFF(func_code)},
131 {"func_globals", T_OBJECT, OFF(func_globals), READONLY},
132 {"func_name", T_OBJECT, OFF(func_name), READONLY},
133 {"__name__", T_OBJECT, OFF(func_name), READONLY},
Jeremy Hylton3f571d62001-02-28 02:42:56 +0000134 {"func_closure", T_OBJECT, OFF(func_closure), READONLY},
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000135 {"func_defaults", T_OBJECT, OFF(func_defaults)},
136 {"func_doc", T_OBJECT, OFF(func_doc)},
137 {"__doc__", T_OBJECT, OFF(func_doc)},
138 {"func_dict", T_OBJECT, OFF(func_dict)},
139 {"__dict__", T_OBJECT, OFF(func_dict)},
140 {NULL} /* Sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000141};
142
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143static PyObject *
Barry Warsawd6a9e842001-01-15 20:40:19 +0000144func_getattro(PyFunctionObject *op, PyObject *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000145{
Barry Warsawd6a9e842001-01-15 20:40:19 +0000146 PyObject *rtn;
147 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 Warsawd6a9e842001-01-15 20:40:19 +0000154
Barry Warsawd6a9e842001-01-15 20:40:19 +0000155 /* no API for PyMember_HasAttr() */
156 rtn = PyMember_Get((char *)op, func_memberlist, sname);
157
158 if (rtn == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
159 PyErr_Clear();
160 if (op->func_dict != NULL) {
161 rtn = PyDict_GetItem(op->func_dict, name);
162 Py_XINCREF(rtn);
163 }
164 if (rtn == NULL)
165 PyErr_SetObject(PyExc_AttributeError, name);
166 }
167 return rtn;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000168}
169
Guido van Rossum0dabace1998-05-22 00:55:34 +0000170static int
Barry Warsawd6a9e842001-01-15 20:40:19 +0000171func_setattro(PyFunctionObject *op, PyObject *name, PyObject *value)
Guido van Rossum0dabace1998-05-22 00:55:34 +0000172{
Barry Warsawd6a9e842001-01-15 20:40:19 +0000173 int rtn;
174 char *sname = PyString_AsString(name);
175
Guido van Rossum0dabace1998-05-22 00:55:34 +0000176 if (PyEval_GetRestricted()) {
177 PyErr_SetString(PyExc_RuntimeError,
178 "function attributes not settable in restricted mode");
179 return -1;
180 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000181 if (strcmp(sname, "func_code") == 0) {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000182 /* not legal to del f.func_code or to set it to anything
183 * other than a code object.
184 */
Guido van Rossum0dabace1998-05-22 00:55:34 +0000185 if (value == NULL || !PyCode_Check(value)) {
186 PyErr_SetString(
187 PyExc_TypeError,
188 "func_code must be set to a code object");
189 return -1;
190 }
191 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000192 else if (strcmp(sname, "func_defaults") == 0) {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000193 /* legal to del f.func_defaults. Can only set
194 * func_defaults to NULL or a tuple.
195 */
196 if (value == Py_None)
197 value = NULL;
198 if (value != NULL && !PyTuple_Check(value)) {
Guido van Rossum0dabace1998-05-22 00:55:34 +0000199 PyErr_SetString(
200 PyExc_TypeError,
201 "func_defaults must be set to a tuple object");
202 return -1;
203 }
Guido van Rossum0dabace1998-05-22 00:55:34 +0000204 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000205 else if (!strcmp(sname, "func_dict") || !strcmp(sname, "__dict__")) {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000206 /* legal to del f.func_dict. Can only set func_dict to
207 * NULL or a dictionary.
208 */
209 if (value == Py_None)
210 value = NULL;
211 if (value != NULL && !PyDict_Check(value)) {
Barry Warsawd6a9e842001-01-15 20:40:19 +0000212 PyErr_SetString(
213 PyExc_TypeError,
214 "func_dict must be set to a dict object");
215 return -1;
216 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000217 }
218
219 rtn = PyMember_Set((char *)op, func_memberlist, sname, value);
220 if (rtn < 0 && PyErr_ExceptionMatches(PyExc_AttributeError)) {
221 PyErr_Clear();
222 if (op->func_dict == NULL) {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000223 /* don't create the dict if we're deleting an
224 * attribute. In that case, we know we'll get an
225 * AttributeError.
226 */
227 if (value == NULL) {
228 PyErr_SetString(PyExc_AttributeError, sname);
229 return -1;
230 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000231 op->func_dict = PyDict_New();
232 if (op->func_dict == NULL)
233 return -1;
234 }
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000235 if (value == NULL)
236 rtn = PyDict_DelItem(op->func_dict, name);
237 else
238 rtn = PyDict_SetItem(op->func_dict, name, value);
239 /* transform KeyError into AttributeError */
240 if (rtn < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
241 PyErr_SetString(PyExc_AttributeError, sname);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000242 }
243 return rtn;
Guido van Rossum0dabace1998-05-22 00:55:34 +0000244}
245
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246static void
Fred Drakeee238b92000-07-09 06:03:25 +0000247func_dealloc(PyFunctionObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248{
Fred Drakedb81e8d2001-03-23 04:19:27 +0000249 PyObject_ClearWeakRefs((PyObject *) op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000250 PyObject_GC_Fini(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000251 Py_DECREF(op->func_code);
252 Py_DECREF(op->func_globals);
253 Py_DECREF(op->func_name);
254 Py_XDECREF(op->func_defaults);
255 Py_XDECREF(op->func_doc);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000256 Py_XDECREF(op->func_dict);
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000257 Py_XDECREF(op->func_closure);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000258 op = (PyFunctionObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000259 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260}
261
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262static PyObject*
Fred Drakeee238b92000-07-09 06:03:25 +0000263func_repr(PyFunctionObject *op)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000264{
265 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000266 if (op->func_name == Py_None)
Fred Drakea44d3532000-06-30 15:01:00 +0000267 sprintf(buf, "<anonymous function at %p>", op);
Guido van Rossum590baa41993-11-30 13:40:46 +0000268 else
Fred Drakea44d3532000-06-30 15:01:00 +0000269 sprintf(buf, "<function %.100s at %p>",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000270 PyString_AsString(op->func_name),
Fred Drakea44d3532000-06-30 15:01:00 +0000271 op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000272 return PyString_FromString(buf);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000273}
274
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000275static int
Jeremy Hylton8caad492000-06-23 14:18:11 +0000276func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
277{
278 int err;
279 if (f->func_code) {
280 err = visit(f->func_code, arg);
281 if (err)
282 return err;
283 }
284 if (f->func_globals) {
285 err = visit(f->func_globals, arg);
286 if (err)
287 return err;
288 }
289 if (f->func_defaults) {
290 err = visit(f->func_defaults, arg);
291 if (err)
292 return err;
293 }
294 if (f->func_doc) {
295 err = visit(f->func_doc, arg);
296 if (err)
297 return err;
298 }
299 if (f->func_name) {
300 err = visit(f->func_name, arg);
301 if (err)
302 return err;
303 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000304 if (f->func_dict) {
305 err = visit(f->func_dict, arg);
306 if (err)
307 return err;
308 }
Jeremy Hyltona52e8fe2001-03-01 06:06:37 +0000309 if (f->func_closure) {
310 err = visit(f->func_closure, arg);
311 if (err)
312 return err;
313 }
Jeremy Hylton8caad492000-06-23 14:18:11 +0000314 return 0;
315}
316
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000317PyTypeObject PyFunction_Type = {
318 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319 0,
320 "function",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000321 sizeof(PyFunctionObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322 0,
Fred Drake4dcb85b2001-05-03 16:04:13 +0000323 (destructor)func_dealloc, /* tp_dealloc */
324 0, /* tp_print */
325 0, /* tp_getattr */
326 0, /* tp_setattr */
327 0, /* tp_compare */
328 (reprfunc)func_repr, /* tp_repr */
329 0, /* tp_as_number */
330 0, /* tp_as_sequence */
331 0, /* tp_as_mapping */
332 0, /* tp_hash */
333 0, /* tp_call */
334 0, /* tp_str */
335 (getattrofunc)func_getattro, /* tp_getattro */
336 (setattrofunc)func_setattro, /* tp_setattro */
337 0, /* tp_as_buffer */
338 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
339 0, /* tp_doc */
340 (traverseproc)func_traverse, /* tp_traverse */
341 0, /* tp_clear */
342 0, /* tp_richcompare */
Fred Drakedb81e8d2001-03-23 04:19:27 +0000343 offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000344};