blob: f91cc6d903faf8cc80e64c3ef0f5bc5d87a518d4 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Function object implementation */
33
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
Guido van Rossum9bfef441993-03-29 10:43:31 +000035#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000036#include "structmember.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037
Guido van Rossumc0b618a1997-05-02 03:12:38 +000038PyObject *
39PyFunction_New(code, globals)
40 PyObject *code;
41 PyObject *globals;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000043 PyFunctionObject *op = PyObject_NEW(PyFunctionObject,
44 &PyFunction_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045 if (op != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000046 PyObject *doc;
47 PyObject *consts;
48 Py_INCREF(code);
Guido van Rossum846e4311990-11-18 17:44:06 +000049 op->func_code = code;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000050 Py_INCREF(globals);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051 op->func_globals = globals;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052 op->func_name = ((PyCodeObject *)code)->co_name;
53 Py_INCREF(op->func_name);
Guido van Rossum2271bf71995-07-18 14:30:34 +000054 op->func_defaults = NULL; /* No default arguments */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000055 consts = ((PyCodeObject *)code)->co_consts;
56 if (PyTuple_Size(consts) >= 1) {
57 doc = PyTuple_GetItem(consts, 0);
Guido van Rossumec5b7762000-04-27 20:14:13 +000058 if (!PyString_Check(doc) && !PyUnicode_Check(doc))
Guido van Rossumc0b618a1997-05-02 03:12:38 +000059 doc = Py_None;
Guido van Rossum5bd38051995-01-07 12:01:30 +000060 }
61 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062 doc = Py_None;
63 Py_INCREF(doc);
Guido van Rossum5bd38051995-01-07 12:01:30 +000064 op->func_doc = doc;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000065 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000066 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000067 return (PyObject *)op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000068}
69
Guido van Rossumc0b618a1997-05-02 03:12:38 +000070PyObject *
71PyFunction_GetCode(op)
72 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000074 if (!PyFunction_Check(op)) {
75 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076 return NULL;
77 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000078 return ((PyFunctionObject *) op) -> func_code;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000079}
80
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081PyObject *
82PyFunction_GetGlobals(op)
83 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000084{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 if (!PyFunction_Check(op)) {
86 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087 return NULL;
88 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 return ((PyFunctionObject *) op) -> func_globals;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090}
91
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092PyObject *
Guido van Rossum2271bf71995-07-18 14:30:34 +000093PyFunction_GetDefaults(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094 PyObject *op;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000095{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 if (!PyFunction_Check(op)) {
97 PyErr_BadInternalCall();
Guido van Rossum1d5735e1994-08-30 08:27:36 +000098 return NULL;
99 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100 return ((PyFunctionObject *) op) -> func_defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000101}
102
103int
Guido van Rossum2271bf71995-07-18 14:30:34 +0000104PyFunction_SetDefaults(op, defaults)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 PyObject *op;
106 PyObject *defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000107{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000108 if (!PyFunction_Check(op)) {
109 PyErr_BadInternalCall();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000110 return -1;
111 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112 if (defaults == Py_None)
Guido van Rossum2271bf71995-07-18 14:30:34 +0000113 defaults = NULL;
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000114 else if (PyTuple_Check(defaults)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 Py_XINCREF(defaults);
Guido van Rossum1109fbc1998-04-10 22:16:39 +0000116 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000117 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118 PyErr_SetString(PyExc_SystemError, "non-tuple default args");
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000119 return -1;
120 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 Py_XDECREF(((PyFunctionObject *) op) -> func_defaults);
122 ((PyFunctionObject *) op) -> func_defaults = defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000123 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[] = {
Guido van Rossum0dabace1998-05-22 00:55:34 +0000131 {"func_code", T_OBJECT, OFF(func_code)},
Guido van Rossuma38c0ff1992-01-14 18:32:20 +0000132 {"func_globals",T_OBJECT, OFF(func_globals), READONLY},
Guido van Rossum25831651993-05-19 14:50:45 +0000133 {"func_name", T_OBJECT, OFF(func_name), READONLY},
Guido van Rossum10393b11995-01-10 10:39:49 +0000134 {"__name__", T_OBJECT, OFF(func_name), READONLY},
Guido van Rossum0dabace1998-05-22 00:55:34 +0000135 {"func_defaults",T_OBJECT, OFF(func_defaults)},
Guido van Rossum5bd38051995-01-07 12:01:30 +0000136 {"func_doc", T_OBJECT, OFF(func_doc)},
137 {"__doc__", T_OBJECT, OFF(func_doc)},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000138 {NULL} /* Sentinel */
139};
140
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000142func_getattr(op, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143 PyFunctionObject *op;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000144 char *name;
145{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 if (name[0] != '_' && PyEval_GetRestricted()) {
147 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum10393b11995-01-10 10:39:49 +0000148 "function attributes not accessible in restricted mode");
149 return NULL;
150 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000151 return PyMember_Get((char *)op, func_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000152}
153
Guido van Rossum0dabace1998-05-22 00:55:34 +0000154static int
155func_setattr(op, name, value)
156 PyFunctionObject *op;
157 char *name;
158 PyObject *value;
159{
160 if (PyEval_GetRestricted()) {
161 PyErr_SetString(PyExc_RuntimeError,
162 "function attributes not settable in restricted mode");
163 return -1;
164 }
165 if (strcmp(name, "func_code") == 0) {
166 if (value == NULL || !PyCode_Check(value)) {
167 PyErr_SetString(
168 PyExc_TypeError,
169 "func_code must be set to a code object");
170 return -1;
171 }
172 }
173 else if (strcmp(name, "func_defaults") == 0) {
174 if (value != Py_None && !PyTuple_Check(value)) {
175 PyErr_SetString(
176 PyExc_TypeError,
177 "func_defaults must be set to a tuple object");
178 return -1;
179 }
180 if (value == Py_None)
181 value = NULL;
182 }
183 return PyMember_Set((char *)op, func_memberlist, name, value);
184}
185
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186static void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000187func_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188 PyFunctionObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000189{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000190 PyObject_GC_Fini(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000191 Py_DECREF(op->func_code);
192 Py_DECREF(op->func_globals);
193 Py_DECREF(op->func_name);
194 Py_XDECREF(op->func_defaults);
195 Py_XDECREF(op->func_doc);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000196 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197}
198
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000199static PyObject*
Guido van Rossum9bfef441993-03-29 10:43:31 +0000200func_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000201 PyFunctionObject *op;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000202{
203 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204 if (op->func_name == Py_None)
Fred Drakea44d3532000-06-30 15:01:00 +0000205 sprintf(buf, "<anonymous function at %p>", op);
Guido van Rossum590baa41993-11-30 13:40:46 +0000206 else
Fred Drakea44d3532000-06-30 15:01:00 +0000207 sprintf(buf, "<function %.100s at %p>",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000208 PyString_AsString(op->func_name),
Fred Drakea44d3532000-06-30 15:01:00 +0000209 op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210 return PyString_FromString(buf);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000211}
212
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000213static int
214func_compare(f, g)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000215 PyFunctionObject *f, *g;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000216{
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000217 int c;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000218 if (f->func_globals != g->func_globals)
219 return (f->func_globals < g->func_globals) ? -1 : 1;
Guido van Rossum83f9ad81997-08-05 16:51:05 +0000220 if (f->func_defaults != g->func_defaults) {
221 if (f->func_defaults == NULL)
222 return -1;
223 if (g->func_defaults == NULL)
224 return 1;
225 c = PyObject_Compare(f->func_defaults, g->func_defaults);
226 if (c != 0)
227 return c;
228 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000229 return PyObject_Compare(f->func_code, g->func_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000230}
231
232static long
233func_hash(f)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000234 PyFunctionObject *f;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000235{
Fred Drake13634cf2000-06-29 19:17:04 +0000236 long h,x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 h = PyObject_Hash(f->func_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000238 if (h == -1) return h;
Fred Drake13634cf2000-06-29 19:17:04 +0000239 x = _Py_HashPointer(f->func_globals);
240 if (x == -1) return x;
241 h ^= x;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000242 if (h == -1) h = -2;
243 return h;
244}
245
Jeremy Hylton8caad492000-06-23 14:18:11 +0000246static int
247func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
248{
249 int err;
250 if (f->func_code) {
251 err = visit(f->func_code, arg);
252 if (err)
253 return err;
254 }
255 if (f->func_globals) {
256 err = visit(f->func_globals, arg);
257 if (err)
258 return err;
259 }
260 if (f->func_defaults) {
261 err = visit(f->func_defaults, arg);
262 if (err)
263 return err;
264 }
265 if (f->func_doc) {
266 err = visit(f->func_doc, arg);
267 if (err)
268 return err;
269 }
270 if (f->func_name) {
271 err = visit(f->func_name, arg);
272 if (err)
273 return err;
274 }
275 return 0;
276}
277
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000278PyTypeObject PyFunction_Type = {
279 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000280 0,
281 "function",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000282 sizeof(PyFunctionObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000283 0,
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000284 (destructor)func_dealloc, /*tp_dealloc*/
Guido van Rossum846e4311990-11-18 17:44:06 +0000285 0, /*tp_print*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000286 (getattrfunc)func_getattr, /*tp_getattr*/
Guido van Rossum0dabace1998-05-22 00:55:34 +0000287 (setattrfunc)func_setattr, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000288 (cmpfunc)func_compare, /*tp_compare*/
289 (reprfunc)func_repr, /*tp_repr*/
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000290 0, /*tp_as_number*/
291 0, /*tp_as_sequence*/
292 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000293 (hashfunc)func_hash, /*tp_hash*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000294 0, /*tp_call*/
295 0, /*tp_str*/
296 0, /*tp_getattro*/
297 0, /*tp_setattro*/
298 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000299 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000300 0, /* tp_doc */
301 (traverseproc)func_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000302};