blob: b6c008906e7d3ca93c1460bd62ddd00830a01b71 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Function object implementation */
12
Guido van Rossumc0b618a1997-05-02 03:12:38 +000013#include "Python.h"
Guido van Rossum9bfef441993-03-29 10:43:31 +000014#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000015#include "structmember.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000016
Guido van Rossumc0b618a1997-05-02 03:12:38 +000017PyObject *
18PyFunction_New(code, globals)
19 PyObject *code;
20 PyObject *globals;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000021{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000022 PyFunctionObject *op = PyObject_NEW(PyFunctionObject,
23 &PyFunction_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000024 if (op != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000025 PyObject *doc;
26 PyObject *consts;
27 Py_INCREF(code);
Guido van Rossum846e4311990-11-18 17:44:06 +000028 op->func_code = code;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000029 Py_INCREF(globals);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000030 op->func_globals = globals;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000031 op->func_name = ((PyCodeObject *)code)->co_name;
32 Py_INCREF(op->func_name);
Guido van Rossum2271bf71995-07-18 14:30:34 +000033 op->func_defaults = NULL; /* No default arguments */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034 consts = ((PyCodeObject *)code)->co_consts;
35 if (PyTuple_Size(consts) >= 1) {
36 doc = PyTuple_GetItem(consts, 0);
Guido van Rossumec5b7762000-04-27 20:14:13 +000037 if (!PyString_Check(doc) && !PyUnicode_Check(doc))
Guido van Rossumc0b618a1997-05-02 03:12:38 +000038 doc = Py_None;
Guido van Rossum5bd38051995-01-07 12:01:30 +000039 }
40 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000041 doc = Py_None;
42 Py_INCREF(doc);
Guido van Rossum5bd38051995-01-07 12:01:30 +000043 op->func_doc = doc;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000045 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000046 return (PyObject *)op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047}
48
Guido van Rossumc0b618a1997-05-02 03:12:38 +000049PyObject *
50PyFunction_GetCode(op)
51 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000053 if (!PyFunction_Check(op)) {
54 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055 return NULL;
56 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057 return ((PyFunctionObject *) op) -> func_code;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058}
59
Guido van Rossumc0b618a1997-05-02 03:12:38 +000060PyObject *
61PyFunction_GetGlobals(op)
62 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064 if (!PyFunction_Check(op)) {
65 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066 return NULL;
67 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000068 return ((PyFunctionObject *) op) -> func_globals;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069}
70
Guido van Rossumc0b618a1997-05-02 03:12:38 +000071PyObject *
Guido van Rossum2271bf71995-07-18 14:30:34 +000072PyFunction_GetDefaults(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000073 PyObject *op;
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 NULL;
78 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000079 return ((PyFunctionObject *) op) -> func_defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000080}
81
82int
Guido van Rossum2271bf71995-07-18 14:30:34 +000083PyFunction_SetDefaults(op, defaults)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084 PyObject *op;
85 PyObject *defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000086{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000087 if (!PyFunction_Check(op)) {
88 PyErr_BadInternalCall();
Guido van Rossum1d5735e1994-08-30 08:27:36 +000089 return -1;
90 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 if (defaults == Py_None)
Guido van Rossum2271bf71995-07-18 14:30:34 +000092 defaults = NULL;
Guido van Rossum1109fbc1998-04-10 22:16:39 +000093 else if (PyTuple_Check(defaults)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094 Py_XINCREF(defaults);
Guido van Rossum1109fbc1998-04-10 22:16:39 +000095 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +000096 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000097 PyErr_SetString(PyExc_SystemError, "non-tuple default args");
Guido van Rossum1d5735e1994-08-30 08:27:36 +000098 return -1;
99 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100 Py_XDECREF(((PyFunctionObject *) op) -> func_defaults);
101 ((PyFunctionObject *) op) -> func_defaults = defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000102 return 0;
103}
104
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000105/* Methods */
106
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000107#define OFF(x) offsetof(PyFunctionObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000108
109static struct memberlist func_memberlist[] = {
Guido van Rossum0dabace1998-05-22 00:55:34 +0000110 {"func_code", T_OBJECT, OFF(func_code)},
Guido van Rossuma38c0ff1992-01-14 18:32:20 +0000111 {"func_globals",T_OBJECT, OFF(func_globals), READONLY},
Guido van Rossum25831651993-05-19 14:50:45 +0000112 {"func_name", T_OBJECT, OFF(func_name), READONLY},
Guido van Rossum10393b11995-01-10 10:39:49 +0000113 {"__name__", T_OBJECT, OFF(func_name), READONLY},
Guido van Rossum0dabace1998-05-22 00:55:34 +0000114 {"func_defaults",T_OBJECT, OFF(func_defaults)},
Guido van Rossum5bd38051995-01-07 12:01:30 +0000115 {"func_doc", T_OBJECT, OFF(func_doc)},
116 {"__doc__", T_OBJECT, OFF(func_doc)},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000117 {NULL} /* Sentinel */
118};
119
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000121func_getattr(op, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 PyFunctionObject *op;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000123 char *name;
124{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125 if (name[0] != '_' && PyEval_GetRestricted()) {
126 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum10393b11995-01-10 10:39:49 +0000127 "function attributes not accessible in restricted mode");
128 return NULL;
129 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000130 return PyMember_Get((char *)op, func_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000131}
132
Guido van Rossum0dabace1998-05-22 00:55:34 +0000133static int
134func_setattr(op, name, value)
135 PyFunctionObject *op;
136 char *name;
137 PyObject *value;
138{
139 if (PyEval_GetRestricted()) {
140 PyErr_SetString(PyExc_RuntimeError,
141 "function attributes not settable in restricted mode");
142 return -1;
143 }
144 if (strcmp(name, "func_code") == 0) {
145 if (value == NULL || !PyCode_Check(value)) {
146 PyErr_SetString(
147 PyExc_TypeError,
148 "func_code must be set to a code object");
149 return -1;
150 }
151 }
152 else if (strcmp(name, "func_defaults") == 0) {
153 if (value != Py_None && !PyTuple_Check(value)) {
154 PyErr_SetString(
155 PyExc_TypeError,
156 "func_defaults must be set to a tuple object");
157 return -1;
158 }
159 if (value == Py_None)
160 value = NULL;
161 }
162 return PyMember_Set((char *)op, func_memberlist, name, value);
163}
164
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165static void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000166func_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 PyFunctionObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000168{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000169 PyObject_GC_Fini(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 Py_DECREF(op->func_code);
171 Py_DECREF(op->func_globals);
172 Py_DECREF(op->func_name);
173 Py_XDECREF(op->func_defaults);
174 Py_XDECREF(op->func_doc);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000175 op = (PyFunctionObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000176 PyObject_DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000177}
178
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179static PyObject*
Guido van Rossum9bfef441993-03-29 10:43:31 +0000180func_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181 PyFunctionObject *op;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000182{
183 char buf[140];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000184 if (op->func_name == Py_None)
Fred Drakea44d3532000-06-30 15:01:00 +0000185 sprintf(buf, "<anonymous function at %p>", op);
Guido van Rossum590baa41993-11-30 13:40:46 +0000186 else
Fred Drakea44d3532000-06-30 15:01:00 +0000187 sprintf(buf, "<function %.100s at %p>",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188 PyString_AsString(op->func_name),
Fred Drakea44d3532000-06-30 15:01:00 +0000189 op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000190 return PyString_FromString(buf);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000191}
192
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000193static int
194func_compare(f, g)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 PyFunctionObject *f, *g;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000196{
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000197 int c;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000198 if (f->func_globals != g->func_globals)
199 return (f->func_globals < g->func_globals) ? -1 : 1;
Guido van Rossum83f9ad81997-08-05 16:51:05 +0000200 if (f->func_defaults != g->func_defaults) {
201 if (f->func_defaults == NULL)
202 return -1;
203 if (g->func_defaults == NULL)
204 return 1;
205 c = PyObject_Compare(f->func_defaults, g->func_defaults);
206 if (c != 0)
207 return c;
208 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 return PyObject_Compare(f->func_code, g->func_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000210}
211
212static long
213func_hash(f)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000214 PyFunctionObject *f;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000215{
Fred Drake13634cf2000-06-29 19:17:04 +0000216 long h,x;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 h = PyObject_Hash(f->func_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000218 if (h == -1) return h;
Fred Drake13634cf2000-06-29 19:17:04 +0000219 x = _Py_HashPointer(f->func_globals);
220 if (x == -1) return x;
221 h ^= x;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000222 if (h == -1) h = -2;
223 return h;
224}
225
Jeremy Hylton8caad492000-06-23 14:18:11 +0000226static int
227func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
228{
229 int err;
230 if (f->func_code) {
231 err = visit(f->func_code, arg);
232 if (err)
233 return err;
234 }
235 if (f->func_globals) {
236 err = visit(f->func_globals, arg);
237 if (err)
238 return err;
239 }
240 if (f->func_defaults) {
241 err = visit(f->func_defaults, arg);
242 if (err)
243 return err;
244 }
245 if (f->func_doc) {
246 err = visit(f->func_doc, arg);
247 if (err)
248 return err;
249 }
250 if (f->func_name) {
251 err = visit(f->func_name, arg);
252 if (err)
253 return err;
254 }
255 return 0;
256}
257
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000258PyTypeObject PyFunction_Type = {
259 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260 0,
261 "function",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000262 sizeof(PyFunctionObject) + PyGC_HEAD_SIZE,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000263 0,
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000264 (destructor)func_dealloc, /*tp_dealloc*/
Guido van Rossum846e4311990-11-18 17:44:06 +0000265 0, /*tp_print*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000266 (getattrfunc)func_getattr, /*tp_getattr*/
Guido van Rossum0dabace1998-05-22 00:55:34 +0000267 (setattrfunc)func_setattr, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000268 (cmpfunc)func_compare, /*tp_compare*/
269 (reprfunc)func_repr, /*tp_repr*/
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000270 0, /*tp_as_number*/
271 0, /*tp_as_sequence*/
272 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000273 (hashfunc)func_hash, /*tp_hash*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000274 0, /*tp_call*/
275 0, /*tp_str*/
276 0, /*tp_getattro*/
277 0, /*tp_setattro*/
278 0, /* tp_as_buffer */
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000279 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000280 0, /* tp_doc */
281 (traverseproc)func_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000282};