blob: c45f318f55ea4231a84799de7bce000cceeb1900 [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 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000023 consts = ((PyCodeObject *)code)->co_consts;
24 if (PyTuple_Size(consts) >= 1) {
25 doc = PyTuple_GetItem(consts, 0);
Guido van Rossumec5b7762000-04-27 20:14:13 +000026 if (!PyString_Check(doc) && !PyUnicode_Check(doc))
Guido van Rossumc0b618a1997-05-02 03:12:38 +000027 doc = Py_None;
Guido van Rossum5bd38051995-01-07 12:01:30 +000028 }
29 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000030 doc = Py_None;
31 Py_INCREF(doc);
Guido van Rossum5bd38051995-01-07 12:01:30 +000032 op->func_doc = doc;
Barry Warsawd6a9e842001-01-15 20:40:19 +000033 op->func_dict = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000034 }
Barry Warsawd6a9e842001-01-15 20:40:19 +000035 else
36 return NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000037 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000038 return (PyObject *)op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039}
40
Guido van Rossumc0b618a1997-05-02 03:12:38 +000041PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000042PyFunction_GetCode(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000044 if (!PyFunction_Check(op)) {
45 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000046 return NULL;
47 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048 return ((PyFunctionObject *) op) -> func_code;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049}
50
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000052PyFunction_GetGlobals(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000054 if (!PyFunction_Check(op)) {
55 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056 return NULL;
57 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000058 return ((PyFunctionObject *) op) -> func_globals;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059}
60
Guido van Rossumc0b618a1997-05-02 03:12:38 +000061PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000062PyFunction_GetDefaults(PyObject *op)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000063{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064 if (!PyFunction_Check(op)) {
65 PyErr_BadInternalCall();
Guido van Rossum1d5735e1994-08-30 08:27:36 +000066 return NULL;
67 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000068 return ((PyFunctionObject *) op) -> func_defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000069}
70
71int
Fred Drakeee238b92000-07-09 06:03:25 +000072PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000073{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000074 if (!PyFunction_Check(op)) {
75 PyErr_BadInternalCall();
Guido van Rossum1d5735e1994-08-30 08:27:36 +000076 return -1;
77 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000078 if (defaults == Py_None)
Guido van Rossum2271bf71995-07-18 14:30:34 +000079 defaults = NULL;
Guido van Rossum1109fbc1998-04-10 22:16:39 +000080 else if (PyTuple_Check(defaults)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081 Py_XINCREF(defaults);
Guido van Rossum1109fbc1998-04-10 22:16:39 +000082 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +000083 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084 PyErr_SetString(PyExc_SystemError, "non-tuple default args");
Guido van Rossum1d5735e1994-08-30 08:27:36 +000085 return -1;
86 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000087 Py_XDECREF(((PyFunctionObject *) op) -> func_defaults);
88 ((PyFunctionObject *) op) -> func_defaults = defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000089 return 0;
90}
91
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092/* Methods */
93
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094#define OFF(x) offsetof(PyFunctionObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000095
96static struct memberlist func_memberlist[] = {
Barry Warsaw0395fdd2001-01-19 19:53:29 +000097 {"func_code", T_OBJECT, OFF(func_code)},
98 {"func_globals", T_OBJECT, OFF(func_globals), READONLY},
99 {"func_name", T_OBJECT, OFF(func_name), READONLY},
100 {"__name__", T_OBJECT, OFF(func_name), READONLY},
101 {"func_defaults", T_OBJECT, OFF(func_defaults)},
102 {"func_doc", T_OBJECT, OFF(func_doc)},
103 {"__doc__", T_OBJECT, OFF(func_doc)},
104 {"func_dict", T_OBJECT, OFF(func_dict)},
105 {"__dict__", T_OBJECT, OFF(func_dict)},
106 {NULL} /* Sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000107};
108
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000109static PyObject *
Barry Warsawd6a9e842001-01-15 20:40:19 +0000110func_getattro(PyFunctionObject *op, PyObject *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000111{
Barry Warsawd6a9e842001-01-15 20:40:19 +0000112 PyObject *rtn;
113 char *sname = PyString_AsString(name);
114
115 if (sname[0] != '_' && PyEval_GetRestricted()) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum10393b11995-01-10 10:39:49 +0000117 "function attributes not accessible in restricted mode");
118 return NULL;
119 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000120
Barry Warsawd6a9e842001-01-15 20:40:19 +0000121 /* no API for PyMember_HasAttr() */
122 rtn = PyMember_Get((char *)op, func_memberlist, sname);
123
124 if (rtn == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
125 PyErr_Clear();
126 if (op->func_dict != NULL) {
127 rtn = PyDict_GetItem(op->func_dict, name);
128 Py_XINCREF(rtn);
129 }
130 if (rtn == NULL)
131 PyErr_SetObject(PyExc_AttributeError, name);
132 }
133 return rtn;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000134}
135
Guido van Rossum0dabace1998-05-22 00:55:34 +0000136static int
Barry Warsawd6a9e842001-01-15 20:40:19 +0000137func_setattro(PyFunctionObject *op, PyObject *name, PyObject *value)
Guido van Rossum0dabace1998-05-22 00:55:34 +0000138{
Barry Warsawd6a9e842001-01-15 20:40:19 +0000139 int rtn;
140 char *sname = PyString_AsString(name);
141
Guido van Rossum0dabace1998-05-22 00:55:34 +0000142 if (PyEval_GetRestricted()) {
143 PyErr_SetString(PyExc_RuntimeError,
144 "function attributes not settable in restricted mode");
145 return -1;
146 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000147 if (strcmp(sname, "func_code") == 0) {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000148 /* not legal to del f.func_code or to set it to anything
149 * other than a code object.
150 */
Guido van Rossum0dabace1998-05-22 00:55:34 +0000151 if (value == NULL || !PyCode_Check(value)) {
152 PyErr_SetString(
153 PyExc_TypeError,
154 "func_code must be set to a code object");
155 return -1;
156 }
157 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000158 else if (strcmp(sname, "func_defaults") == 0) {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000159 /* legal to del f.func_defaults. Can only set
160 * func_defaults to NULL or a tuple.
161 */
162 if (value == Py_None)
163 value = NULL;
164 if (value != NULL && !PyTuple_Check(value)) {
Guido van Rossum0dabace1998-05-22 00:55:34 +0000165 PyErr_SetString(
166 PyExc_TypeError,
167 "func_defaults must be set to a tuple object");
168 return -1;
169 }
Guido van Rossum0dabace1998-05-22 00:55:34 +0000170 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000171 else if (!strcmp(sname, "func_dict") || !strcmp(sname, "__dict__")) {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000172 /* legal to del f.func_dict. Can only set func_dict to
173 * NULL or a dictionary.
174 */
175 if (value == Py_None)
176 value = NULL;
177 if (value != NULL && !PyDict_Check(value)) {
Barry Warsawd6a9e842001-01-15 20:40:19 +0000178 PyErr_SetString(
179 PyExc_TypeError,
180 "func_dict must be set to a dict object");
181 return -1;
182 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000183 }
184
185 rtn = PyMember_Set((char *)op, func_memberlist, sname, value);
186 if (rtn < 0 && PyErr_ExceptionMatches(PyExc_AttributeError)) {
187 PyErr_Clear();
188 if (op->func_dict == NULL) {
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000189 /* don't create the dict if we're deleting an
190 * attribute. In that case, we know we'll get an
191 * AttributeError.
192 */
193 if (value == NULL) {
194 PyErr_SetString(PyExc_AttributeError, sname);
195 return -1;
196 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000197 op->func_dict = PyDict_New();
198 if (op->func_dict == NULL)
199 return -1;
200 }
Barry Warsaw0395fdd2001-01-19 19:53:29 +0000201 if (value == NULL)
202 rtn = PyDict_DelItem(op->func_dict, name);
203 else
204 rtn = PyDict_SetItem(op->func_dict, name, value);
205 /* transform KeyError into AttributeError */
206 if (rtn < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
207 PyErr_SetString(PyExc_AttributeError, sname);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000208 }
209 return rtn;
Guido van Rossum0dabace1998-05-22 00:55:34 +0000210}
211
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212static void
Fred Drakeee238b92000-07-09 06:03:25 +0000213func_dealloc(PyFunctionObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000215 PyObject_GC_Fini(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000216 Py_DECREF(op->func_code);
217 Py_DECREF(op->func_globals);
218 Py_DECREF(op->func_name);
219 Py_XDECREF(op->func_defaults);
220 Py_XDECREF(op->func_doc);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000221 Py_XDECREF(op->func_dict);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000222 op = (PyFunctionObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000223 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224}
225
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226static PyObject*
Fred Drakeee238b92000-07-09 06:03:25 +0000227func_repr(PyFunctionObject *op)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000228{
229 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230 if (op->func_name == Py_None)
Fred Drakea44d3532000-06-30 15:01:00 +0000231 sprintf(buf, "<anonymous function at %p>", op);
Guido van Rossum590baa41993-11-30 13:40:46 +0000232 else
Fred Drakea44d3532000-06-30 15:01:00 +0000233 sprintf(buf, "<function %.100s at %p>",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000234 PyString_AsString(op->func_name),
Fred Drakea44d3532000-06-30 15:01:00 +0000235 op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000236 return PyString_FromString(buf);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000237}
238
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000239static int
Fred Drakeee238b92000-07-09 06:03:25 +0000240func_compare(PyFunctionObject *f, PyFunctionObject *g)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000241{
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000242 int c;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000243 if (f->func_globals != g->func_globals)
244 return (f->func_globals < g->func_globals) ? -1 : 1;
Guido van Rossum83f9ad81997-08-05 16:51:05 +0000245 if (f->func_defaults != g->func_defaults) {
246 if (f->func_defaults == NULL)
247 return -1;
248 if (g->func_defaults == NULL)
249 return 1;
250 c = PyObject_Compare(f->func_defaults, g->func_defaults);
251 if (c != 0)
252 return c;
253 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000254 return PyObject_Compare(f->func_code, g->func_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000255}
256
257static long
Fred Drakeee238b92000-07-09 06:03:25 +0000258func_hash(PyFunctionObject *f)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000259{
Fred Drake13634cf2000-06-29 19:17:04 +0000260 long h,x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000261 h = PyObject_Hash(f->func_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000262 if (h == -1) return h;
Fred Drake13634cf2000-06-29 19:17:04 +0000263 x = _Py_HashPointer(f->func_globals);
264 if (x == -1) return x;
265 h ^= x;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000266 if (h == -1) h = -2;
267 return h;
268}
269
Jeremy Hylton8caad492000-06-23 14:18:11 +0000270static int
271func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
272{
273 int err;
274 if (f->func_code) {
275 err = visit(f->func_code, arg);
276 if (err)
277 return err;
278 }
279 if (f->func_globals) {
280 err = visit(f->func_globals, arg);
281 if (err)
282 return err;
283 }
284 if (f->func_defaults) {
285 err = visit(f->func_defaults, arg);
286 if (err)
287 return err;
288 }
289 if (f->func_doc) {
290 err = visit(f->func_doc, arg);
291 if (err)
292 return err;
293 }
294 if (f->func_name) {
295 err = visit(f->func_name, arg);
296 if (err)
297 return err;
298 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000299 if (f->func_dict) {
300 err = visit(f->func_dict, arg);
301 if (err)
302 return err;
303 }
Jeremy Hylton8caad492000-06-23 14:18:11 +0000304 return 0;
305}
306
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000307PyTypeObject PyFunction_Type = {
308 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309 0,
310 "function",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000311 sizeof(PyFunctionObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000312 0,
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000313 (destructor)func_dealloc, /*tp_dealloc*/
Guido van Rossum846e4311990-11-18 17:44:06 +0000314 0, /*tp_print*/
Barry Warsawd6a9e842001-01-15 20:40:19 +0000315 0, /*tp_getattr*/
316 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000317 (cmpfunc)func_compare, /*tp_compare*/
318 (reprfunc)func_repr, /*tp_repr*/
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000319 0, /*tp_as_number*/
320 0, /*tp_as_sequence*/
321 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000322 (hashfunc)func_hash, /*tp_hash*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000323 0, /*tp_call*/
324 0, /*tp_str*/
Barry Warsawd6a9e842001-01-15 20:40:19 +0000325 (getattrofunc)func_getattro, /*tp_getattro*/
326 (setattrofunc)func_setattro, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000327 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000328 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000329 0, /* tp_doc */
330 (traverseproc)func_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000331};