blob: 027e97fd3585b43d5fc00ffedc87f4ae076bb9ae [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[] = {
Guido van Rossum0dabace1998-05-22 00:55:34 +000097 {"func_code", T_OBJECT, OFF(func_code)},
Guido van Rossuma38c0ff1992-01-14 18:32:20 +000098 {"func_globals",T_OBJECT, OFF(func_globals), READONLY},
Guido van Rossum25831651993-05-19 14:50:45 +000099 {"func_name", T_OBJECT, OFF(func_name), READONLY},
Guido van Rossum10393b11995-01-10 10:39:49 +0000100 {"__name__", T_OBJECT, OFF(func_name), READONLY},
Guido van Rossum0dabace1998-05-22 00:55:34 +0000101 {"func_defaults",T_OBJECT, OFF(func_defaults)},
Guido van Rossum5bd38051995-01-07 12:01:30 +0000102 {"func_doc", T_OBJECT, OFF(func_doc)},
103 {"__doc__", T_OBJECT, OFF(func_doc)},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000104 {NULL} /* Sentinel */
105};
106
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000107static PyObject *
Barry Warsawd6a9e842001-01-15 20:40:19 +0000108func_getattro(PyFunctionObject *op, PyObject *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000109{
Barry Warsawd6a9e842001-01-15 20:40:19 +0000110 PyObject *rtn;
111 char *sname = PyString_AsString(name);
112
113 if (sname[0] != '_' && PyEval_GetRestricted()) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum10393b11995-01-10 10:39:49 +0000115 "function attributes not accessible in restricted mode");
116 return NULL;
117 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000118
119 if (!strcmp(sname, "__dict__") || !strcmp(sname, "func_dict")) {
120 if (op->func_dict == NULL)
121 rtn = Py_None;
122 else
123 rtn = op->func_dict;
124
125 Py_INCREF(rtn);
126 return rtn;
127 }
128
129 /* no API for PyMember_HasAttr() */
130 rtn = PyMember_Get((char *)op, func_memberlist, sname);
131
132 if (rtn == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
133 PyErr_Clear();
134 if (op->func_dict != NULL) {
135 rtn = PyDict_GetItem(op->func_dict, name);
136 Py_XINCREF(rtn);
137 }
138 if (rtn == NULL)
139 PyErr_SetObject(PyExc_AttributeError, name);
140 }
141 return rtn;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000142}
143
Guido van Rossum0dabace1998-05-22 00:55:34 +0000144static int
Barry Warsawd6a9e842001-01-15 20:40:19 +0000145func_setattro(PyFunctionObject *op, PyObject *name, PyObject *value)
Guido van Rossum0dabace1998-05-22 00:55:34 +0000146{
Barry Warsawd6a9e842001-01-15 20:40:19 +0000147 int rtn;
148 char *sname = PyString_AsString(name);
149
Guido van Rossum0dabace1998-05-22 00:55:34 +0000150 if (PyEval_GetRestricted()) {
151 PyErr_SetString(PyExc_RuntimeError,
152 "function attributes not settable in restricted mode");
153 return -1;
154 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000155 if (strcmp(sname, "func_code") == 0) {
Guido van Rossum0dabace1998-05-22 00:55:34 +0000156 if (value == NULL || !PyCode_Check(value)) {
157 PyErr_SetString(
158 PyExc_TypeError,
159 "func_code must be set to a code object");
160 return -1;
161 }
162 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000163 else if (strcmp(sname, "func_defaults") == 0) {
Guido van Rossum0dabace1998-05-22 00:55:34 +0000164 if (value != Py_None && !PyTuple_Check(value)) {
165 PyErr_SetString(
166 PyExc_TypeError,
167 "func_defaults must be set to a tuple object");
168 return -1;
169 }
170 if (value == Py_None)
171 value = NULL;
172 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000173 else if (!strcmp(sname, "func_dict") || !strcmp(sname, "__dict__")) {
174 if (value != Py_None && !PyDict_Check(value)) {
175 PyErr_SetString(
176 PyExc_TypeError,
177 "func_dict must be set to a dict object");
178 return -1;
179 }
180 if (value == Py_None)
181 value = NULL;
182
183 Py_XDECREF(op->func_dict);
184 Py_XINCREF(value);
185 op->func_dict = value;
186 return 0;
187 }
188
189 rtn = PyMember_Set((char *)op, func_memberlist, sname, value);
190 if (rtn < 0 && PyErr_ExceptionMatches(PyExc_AttributeError)) {
191 PyErr_Clear();
192 if (op->func_dict == NULL) {
193 op->func_dict = PyDict_New();
194 if (op->func_dict == NULL)
195 return -1;
196 }
197 rtn = PyDict_SetItem(op->func_dict, name, value);
198 }
199 return rtn;
Guido van Rossum0dabace1998-05-22 00:55:34 +0000200}
201
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202static void
Fred Drakeee238b92000-07-09 06:03:25 +0000203func_dealloc(PyFunctionObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000205 PyObject_GC_Fini(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 Py_DECREF(op->func_code);
207 Py_DECREF(op->func_globals);
208 Py_DECREF(op->func_name);
209 Py_XDECREF(op->func_defaults);
210 Py_XDECREF(op->func_doc);
Barry Warsawd6a9e842001-01-15 20:40:19 +0000211 Py_XDECREF(op->func_dict);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000212 op = (PyFunctionObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000213 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214}
215
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000216static PyObject*
Fred Drakeee238b92000-07-09 06:03:25 +0000217func_repr(PyFunctionObject *op)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000218{
219 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000220 if (op->func_name == Py_None)
Fred Drakea44d3532000-06-30 15:01:00 +0000221 sprintf(buf, "<anonymous function at %p>", op);
Guido van Rossum590baa41993-11-30 13:40:46 +0000222 else
Fred Drakea44d3532000-06-30 15:01:00 +0000223 sprintf(buf, "<function %.100s at %p>",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000224 PyString_AsString(op->func_name),
Fred Drakea44d3532000-06-30 15:01:00 +0000225 op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 return PyString_FromString(buf);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000227}
228
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000229static int
Fred Drakeee238b92000-07-09 06:03:25 +0000230func_compare(PyFunctionObject *f, PyFunctionObject *g)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000231{
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000232 int c;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000233 if (f->func_globals != g->func_globals)
234 return (f->func_globals < g->func_globals) ? -1 : 1;
Guido van Rossum83f9ad81997-08-05 16:51:05 +0000235 if (f->func_defaults != g->func_defaults) {
236 if (f->func_defaults == NULL)
237 return -1;
238 if (g->func_defaults == NULL)
239 return 1;
240 c = PyObject_Compare(f->func_defaults, g->func_defaults);
241 if (c != 0)
242 return c;
243 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000244 return PyObject_Compare(f->func_code, g->func_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000245}
246
247static long
Fred Drakeee238b92000-07-09 06:03:25 +0000248func_hash(PyFunctionObject *f)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000249{
Fred Drake13634cf2000-06-29 19:17:04 +0000250 long h,x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000251 h = PyObject_Hash(f->func_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000252 if (h == -1) return h;
Fred Drake13634cf2000-06-29 19:17:04 +0000253 x = _Py_HashPointer(f->func_globals);
254 if (x == -1) return x;
255 h ^= x;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000256 if (h == -1) h = -2;
257 return h;
258}
259
Jeremy Hylton8caad492000-06-23 14:18:11 +0000260static int
261func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
262{
263 int err;
264 if (f->func_code) {
265 err = visit(f->func_code, arg);
266 if (err)
267 return err;
268 }
269 if (f->func_globals) {
270 err = visit(f->func_globals, arg);
271 if (err)
272 return err;
273 }
274 if (f->func_defaults) {
275 err = visit(f->func_defaults, arg);
276 if (err)
277 return err;
278 }
279 if (f->func_doc) {
280 err = visit(f->func_doc, arg);
281 if (err)
282 return err;
283 }
284 if (f->func_name) {
285 err = visit(f->func_name, arg);
286 if (err)
287 return err;
288 }
Barry Warsawd6a9e842001-01-15 20:40:19 +0000289 if (f->func_dict) {
290 err = visit(f->func_dict, arg);
291 if (err)
292 return err;
293 }
Jeremy Hylton8caad492000-06-23 14:18:11 +0000294 return 0;
295}
296
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000297PyTypeObject PyFunction_Type = {
298 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299 0,
300 "function",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000301 sizeof(PyFunctionObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000302 0,
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000303 (destructor)func_dealloc, /*tp_dealloc*/
Guido van Rossum846e4311990-11-18 17:44:06 +0000304 0, /*tp_print*/
Barry Warsawd6a9e842001-01-15 20:40:19 +0000305 0, /*tp_getattr*/
306 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000307 (cmpfunc)func_compare, /*tp_compare*/
308 (reprfunc)func_repr, /*tp_repr*/
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000309 0, /*tp_as_number*/
310 0, /*tp_as_sequence*/
311 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000312 (hashfunc)func_hash, /*tp_hash*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000313 0, /*tp_call*/
314 0, /*tp_str*/
Barry Warsawd6a9e842001-01-15 20:40:19 +0000315 (getattrofunc)func_getattro, /*tp_getattro*/
316 (setattrofunc)func_setattro, /*tp_setattro*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000317 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000318 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000319 0, /* tp_doc */
320 (traverseproc)func_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321};