blob: b166d603695e056d24ac1280618c905711cab3c8 [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;
16 Py_INCREF(code);
Guido van Rossum846e4311990-11-18 17:44:06 +000017 op->func_code = code;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000018 Py_INCREF(globals);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000019 op->func_globals = globals;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000020 op->func_name = ((PyCodeObject *)code)->co_name;
21 Py_INCREF(op->func_name);
Guido van Rossum2271bf71995-07-18 14:30:34 +000022 op->func_defaults = NULL; /* No default arguments */
Jeremy Hylton64949cb2001-01-25 20:06:59 +000023 op->func_closure = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000024 consts = ((PyCodeObject *)code)->co_consts;
25 if (PyTuple_Size(consts) >= 1) {
26 doc = PyTuple_GetItem(consts, 0);
Guido van Rossumec5b7762000-04-27 20:14:13 +000027 if (!PyString_Check(doc) && !PyUnicode_Check(doc))
Guido van Rossumc0b618a1997-05-02 03:12:38 +000028 doc = Py_None;
Guido van Rossum5bd38051995-01-07 12:01:30 +000029 }
30 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000031 doc = Py_None;
32 Py_INCREF(doc);
Guido van Rossum5bd38051995-01-07 12:01:30 +000033 op->func_doc = doc;
Barry Warsawd6a9e842001-01-15 20:40:19 +000034 op->func_dict = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035 }
Barry Warsawd6a9e842001-01-15 20:40:19 +000036 else
37 return NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000038 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000039 return (PyObject *)op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000040}
41
Guido van Rossumc0b618a1997-05-02 03:12:38 +000042PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000043PyFunction_GetCode(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045 if (!PyFunction_Check(op)) {
46 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047 return NULL;
48 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000049 return ((PyFunctionObject *) op) -> func_code;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050}
51
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000053PyFunction_GetGlobals(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000054{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000055 if (!PyFunction_Check(op)) {
56 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057 return NULL;
58 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000059 return ((PyFunctionObject *) op) -> func_globals;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000060}
61
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000063PyFunction_GetDefaults(PyObject *op)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000064{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000065 if (!PyFunction_Check(op)) {
66 PyErr_BadInternalCall();
Guido van Rossum1d5735e1994-08-30 08:27:36 +000067 return NULL;
68 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000069 return ((PyFunctionObject *) op) -> func_defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000070}
71
72int
Fred Drakeee238b92000-07-09 06:03:25 +000073PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000074{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075 if (!PyFunction_Check(op)) {
76 PyErr_BadInternalCall();
Guido van Rossum1d5735e1994-08-30 08:27:36 +000077 return -1;
78 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000079 if (defaults == Py_None)
Guido van Rossum2271bf71995-07-18 14:30:34 +000080 defaults = NULL;
Guido van Rossum1109fbc1998-04-10 22:16:39 +000081 else if (PyTuple_Check(defaults)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000082 Py_XINCREF(defaults);
Guido van Rossum1109fbc1998-04-10 22:16:39 +000083 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +000084 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 PyErr_SetString(PyExc_SystemError, "non-tuple default args");
Guido van Rossum1d5735e1994-08-30 08:27:36 +000086 return -1;
87 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000088 Py_XDECREF(((PyFunctionObject *) op) -> func_defaults);
89 ((PyFunctionObject *) op) -> func_defaults = defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000090 return 0;
91}
92
Jeremy Hylton64949cb2001-01-25 20:06:59 +000093PyObject *
94PyFunction_GetClosure(PyObject *op)
95{
96 if (!PyFunction_Check(op)) {
97 PyErr_BadInternalCall();
98 return NULL;
99 }
100 return ((PyFunctionObject *) op) -> func_closure;
101}
102
103int
104PyFunction_SetClosure(PyObject *op, PyObject *closure)
105{
106 if (!PyFunction_Check(op)) {
107 PyErr_BadInternalCall();
108 return -1;
109 }
110 if (closure == Py_None)
111 closure = NULL;
112 else if (PyTuple_Check(closure)) {
113 Py_XINCREF(closure);
114 }
115 else {
116 PyErr_SetString(PyExc_SystemError, "non-tuple closure");
117 return -1;
118 }
119 Py_XDECREF(((PyFunctionObject *) op) -> func_closure);
120 ((PyFunctionObject *) op) -> func_closure = closure;
121 return 0;
122}
123
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124/* Methods */
125
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000126#define OFF(x) offsetof(PyFunctionObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000127
128static struct memberlist func_memberlist[] = {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000129 {"func_code", T_OBJECT, OFF(func_code)},
130 {"func_globals", T_OBJECT, OFF(func_globals), READONLY},
131 {"func_name", T_OBJECT, OFF(func_name), READONLY},
132 {"__name__", T_OBJECT, OFF(func_name), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000133 {"func_closure", T_OBJECT, OFF(func_closure)},
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000134 {"func_defaults", T_OBJECT, OFF(func_defaults)},
135 {"func_doc", T_OBJECT, OFF(func_doc)},
136 {"__doc__", T_OBJECT, OFF(func_doc)},
137 {"func_dict", T_OBJECT, OFF(func_dict)},
138 {"__dict__", T_OBJECT, OFF(func_dict)},
139 {NULL} /* Sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000140};
141
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142static PyObject *
Barry Warsawd6a9e842001-01-15 20:40:19 +0000143func_getattro(PyFunctionObject *op, PyObject *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000144{
Barry Warsawd6a9e842001-01-15 20:40:19 +0000145 PyObject *rtn;
146 char *sname = PyString_AsString(name);
147
148 if (sname[0] != '_' && PyEval_GetRestricted()) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum10393b11995-01-10 10:39:49 +0000150 "function attributes not accessible in restricted mode");
151 return NULL;
152 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000153
Barry Warsawd6a9e842001-01-15 20:40:19 +0000154 /* no API for PyMember_HasAttr() */
155 rtn = PyMember_Get((char *)op, func_memberlist, sname);
156
157 if (rtn == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
158 PyErr_Clear();
159 if (op->func_dict != NULL) {
160 rtn = PyDict_GetItem(op->func_dict, name);
161 Py_XINCREF(rtn);
162 }
163 if (rtn == NULL)
164 PyErr_SetObject(PyExc_AttributeError, name);
165 }
166 return rtn;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000167}
168
Guido van Rossum0dabace1998-05-22 00:55:34 +0000169static int
Barry Warsawd6a9e842001-01-15 20:40:19 +0000170func_setattro(PyFunctionObject *op, PyObject *name, PyObject *value)
Guido van Rossum0dabace1998-05-22 00:55:34 +0000171{
Barry Warsawd6a9e842001-01-15 20:40:19 +0000172 int rtn;
173 char *sname = PyString_AsString(name);
174
Guido van Rossum0dabace1998-05-22 00:55:34 +0000175 if (PyEval_GetRestricted()) {
176 PyErr_SetString(PyExc_RuntimeError,
177 "function attributes not settable in restricted mode");
178 return -1;
179 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000180 if (strcmp(sname, "func_code") == 0) {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000181 /* not legal to del f.func_code or to set it to anything
182 * other than a code object.
183 */
Guido van Rossum0dabace1998-05-22 00:55:34 +0000184 if (value == NULL || !PyCode_Check(value)) {
185 PyErr_SetString(
186 PyExc_TypeError,
187 "func_code must be set to a code object");
188 return -1;
189 }
190 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000191 else if (strcmp(sname, "func_defaults") == 0) {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000192 /* legal to del f.func_defaults. Can only set
193 * func_defaults to NULL or a tuple.
194 */
195 if (value == Py_None)
196 value = NULL;
197 if (value != NULL && !PyTuple_Check(value)) {
Guido van Rossum0dabace1998-05-22 00:55:34 +0000198 PyErr_SetString(
199 PyExc_TypeError,
200 "func_defaults must be set to a tuple object");
201 return -1;
202 }
Guido van Rossum0dabace1998-05-22 00:55:34 +0000203 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000204 else if (!strcmp(sname, "func_dict") || !strcmp(sname, "__dict__")) {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000205 /* legal to del f.func_dict. Can only set func_dict to
206 * NULL or a dictionary.
207 */
208 if (value == Py_None)
209 value = NULL;
210 if (value != NULL && !PyDict_Check(value)) {
Barry Warsawd6a9e842001-01-15 20:40:19 +0000211 PyErr_SetString(
212 PyExc_TypeError,
213 "func_dict must be set to a dict object");
214 return -1;
215 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000216 }
217
218 rtn = PyMember_Set((char *)op, func_memberlist, sname, value);
219 if (rtn < 0 && PyErr_ExceptionMatches(PyExc_AttributeError)) {
220 PyErr_Clear();
221 if (op->func_dict == NULL) {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000222 /* don't create the dict if we're deleting an
223 * attribute. In that case, we know we'll get an
224 * AttributeError.
225 */
226 if (value == NULL) {
227 PyErr_SetString(PyExc_AttributeError, sname);
228 return -1;
229 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000230 op->func_dict = PyDict_New();
231 if (op->func_dict == NULL)
232 return -1;
233 }
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000234 if (value == NULL)
235 rtn = PyDict_DelItem(op->func_dict, name);
236 else
237 rtn = PyDict_SetItem(op->func_dict, name, value);
238 /* transform KeyError into AttributeError */
239 if (rtn < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
240 PyErr_SetString(PyExc_AttributeError, sname);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000241 }
242 return rtn;
Guido van Rossum0dabace1998-05-22 00:55:34 +0000243}
244
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000245static void
Fred Drakeee238b92000-07-09 06:03:25 +0000246func_dealloc(PyFunctionObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000248 PyObject_GC_Fini(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000249 Py_DECREF(op->func_code);
250 Py_DECREF(op->func_globals);
251 Py_DECREF(op->func_name);
252 Py_XDECREF(op->func_defaults);
253 Py_XDECREF(op->func_doc);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000254 Py_XDECREF(op->func_dict);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000255 op = (PyFunctionObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000256 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257}
258
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000259static PyObject*
Fred Drakeee238b92000-07-09 06:03:25 +0000260func_repr(PyFunctionObject *op)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000261{
262 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000263 if (op->func_name == Py_None)
Fred Drakea44d3532000-06-30 15:01:00 +0000264 sprintf(buf, "<anonymous function at %p>", op);
Guido van Rossum590baa41993-11-30 13:40:46 +0000265 else
Fred Drakea44d3532000-06-30 15:01:00 +0000266 sprintf(buf, "<function %.100s at %p>",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267 PyString_AsString(op->func_name),
Fred Drakea44d3532000-06-30 15:01:00 +0000268 op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000269 return PyString_FromString(buf);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000270}
271
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000272static int
Jeremy Hylton8caad492000-06-23 14:18:11 +0000273func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
274{
275 int err;
276 if (f->func_code) {
277 err = visit(f->func_code, arg);
278 if (err)
279 return err;
280 }
281 if (f->func_globals) {
282 err = visit(f->func_globals, arg);
283 if (err)
284 return err;
285 }
286 if (f->func_defaults) {
287 err = visit(f->func_defaults, arg);
288 if (err)
289 return err;
290 }
291 if (f->func_doc) {
292 err = visit(f->func_doc, arg);
293 if (err)
294 return err;
295 }
296 if (f->func_name) {
297 err = visit(f->func_name, arg);
298 if (err)
299 return err;
300 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000301 if (f->func_dict) {
302 err = visit(f->func_dict, arg);
303 if (err)
304 return err;
305 }
Jeremy Hylton8caad492000-06-23 14:18:11 +0000306 return 0;
307}
308
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309PyTypeObject PyFunction_Type = {
310 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311 0,
312 "function",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000313 sizeof(PyFunctionObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000314 0,
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000315 (destructor)func_dealloc, /*tp_dealloc*/
Guido van Rossum846e4311990-11-18 17:44:06 +0000316 0, /*tp_print*/
Barry Warsawd6a9e842001-01-15 20:40:19 +0000317 0, /*tp_getattr*/
318 0, /*tp_setattr*/
Moshe Zadka497671e2001-01-29 06:21:17 +0000319 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000320 (reprfunc)func_repr, /*tp_repr*/
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000321 0, /*tp_as_number*/
322 0, /*tp_as_sequence*/
323 0, /*tp_as_mapping*/
Moshe Zadka497671e2001-01-29 06:21:17 +0000324 0, /*tp_hash*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000325 0, /*tp_call*/
326 0, /*tp_str*/
Barry Warsawd6a9e842001-01-15 20:40:19 +0000327 (getattrofunc)func_getattro, /*tp_getattro*/
328 (setattrofunc)func_setattro, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000329 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000330 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000331 0, /* tp_doc */
332 (traverseproc)func_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333};