1 /***********************************************************
2 Copyright (c) 2000, BeOpen.com.
3 Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4 Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
7 See the file "Misc/COPYRIGHT" for information on usage and
8 redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
9 ******************************************************************/
11 /* Function object implementation */
15 #include "structmember.h"
18 PyFunction_New(PyObject
*code
, PyObject
*globals
)
20 PyFunctionObject
*op
= PyObject_NEW(PyFunctionObject
,
28 op
->func_globals
= globals
;
29 op
->func_name
= ((PyCodeObject
*)code
)->co_name
;
30 Py_INCREF(op
->func_name
);
31 op
->func_defaults
= NULL
; /* No default arguments */
32 consts
= ((PyCodeObject
*)code
)->co_consts
;
33 if (PyTuple_Size(consts
) >= 1) {
34 doc
= PyTuple_GetItem(consts
, 0);
35 if (!PyString_Check(doc
) && !PyUnicode_Check(doc
))
44 return (PyObject
*)op
;
48 PyFunction_GetCode(PyObject
*op
)
50 if (!PyFunction_Check(op
)) {
51 PyErr_BadInternalCall();
54 return ((PyFunctionObject
*) op
) -> func_code
;
58 PyFunction_GetGlobals(PyObject
*op
)
60 if (!PyFunction_Check(op
)) {
61 PyErr_BadInternalCall();
64 return ((PyFunctionObject
*) op
) -> func_globals
;
68 PyFunction_GetDefaults(PyObject
*op
)
70 if (!PyFunction_Check(op
)) {
71 PyErr_BadInternalCall();
74 return ((PyFunctionObject
*) op
) -> func_defaults
;
78 PyFunction_SetDefaults(PyObject
*op
, PyObject
*defaults
)
80 if (!PyFunction_Check(op
)) {
81 PyErr_BadInternalCall();
84 if (defaults
== Py_None
)
86 else if (PyTuple_Check(defaults
)) {
90 PyErr_SetString(PyExc_SystemError
, "non-tuple default args");
93 Py_XDECREF(((PyFunctionObject
*) op
) -> func_defaults
);
94 ((PyFunctionObject
*) op
) -> func_defaults
= defaults
;
100 #define OFF(x) offsetof(PyFunctionObject, x)
102 static struct memberlist func_memberlist
[] = {
103 {"func_code", T_OBJECT
, OFF(func_code
)},
104 {"func_globals",T_OBJECT
, OFF(func_globals
), READONLY
},
105 {"func_name", T_OBJECT
, OFF(func_name
), READONLY
},
106 {"__name__", T_OBJECT
, OFF(func_name
), READONLY
},
107 {"func_defaults",T_OBJECT
, OFF(func_defaults
)},
108 {"func_doc", T_OBJECT
, OFF(func_doc
)},
109 {"__doc__", T_OBJECT
, OFF(func_doc
)},
110 {NULL
} /* Sentinel */
114 func_getattr(PyFunctionObject
*op
, char *name
)
116 if (name
[0] != '_' && PyEval_GetRestricted()) {
117 PyErr_SetString(PyExc_RuntimeError
,
118 "function attributes not accessible in restricted mode");
121 return PyMember_Get((char *)op
, func_memberlist
, name
);
125 func_setattr(PyFunctionObject
*op
, char *name
, PyObject
*value
)
127 if (PyEval_GetRestricted()) {
128 PyErr_SetString(PyExc_RuntimeError
,
129 "function attributes not settable in restricted mode");
132 if (strcmp(name
, "func_code") == 0) {
133 if (value
== NULL
|| !PyCode_Check(value
)) {
136 "func_code must be set to a code object");
140 else if (strcmp(name
, "func_defaults") == 0) {
141 if (value
!= Py_None
&& !PyTuple_Check(value
)) {
144 "func_defaults must be set to a tuple object");
147 if (value
== Py_None
)
150 return PyMember_Set((char *)op
, func_memberlist
, name
, value
);
154 func_dealloc(PyFunctionObject
*op
)
156 PyObject_GC_Fini(op
);
157 Py_DECREF(op
->func_code
);
158 Py_DECREF(op
->func_globals
);
159 Py_DECREF(op
->func_name
);
160 Py_XDECREF(op
->func_defaults
);
161 Py_XDECREF(op
->func_doc
);
162 op
= (PyFunctionObject
*) PyObject_AS_GC(op
);
167 func_repr(PyFunctionObject
*op
)
170 if (op
->func_name
== Py_None
)
171 sprintf(buf
, "<anonymous function at %p>", op
);
173 sprintf(buf
, "<function %.100s at %p>",
174 PyString_AsString(op
->func_name
),
176 return PyString_FromString(buf
);
180 func_compare(PyFunctionObject
*f
, PyFunctionObject
*g
)
183 if (f
->func_globals
!= g
->func_globals
)
184 return (f
->func_globals
< g
->func_globals
) ? -1 : 1;
185 if (f
->func_defaults
!= g
->func_defaults
) {
186 if (f
->func_defaults
== NULL
)
188 if (g
->func_defaults
== NULL
)
190 c
= PyObject_Compare(f
->func_defaults
, g
->func_defaults
);
194 return PyObject_Compare(f
->func_code
, g
->func_code
);
198 func_hash(PyFunctionObject
*f
)
201 h
= PyObject_Hash(f
->func_code
);
202 if (h
== -1) return h
;
203 x
= _Py_HashPointer(f
->func_globals
);
204 if (x
== -1) return x
;
211 func_traverse(PyFunctionObject
*f
, visitproc visit
, void *arg
)
215 err
= visit(f
->func_code
, arg
);
219 if (f
->func_globals
) {
220 err
= visit(f
->func_globals
, arg
);
224 if (f
->func_defaults
) {
225 err
= visit(f
->func_defaults
, arg
);
230 err
= visit(f
->func_doc
, arg
);
235 err
= visit(f
->func_name
, arg
);
242 PyTypeObject PyFunction_Type
= {
243 PyObject_HEAD_INIT(&PyType_Type
)
246 sizeof(PyFunctionObject
) + PyGC_HEAD_SIZE
,
248 (destructor
)func_dealloc
, /*tp_dealloc*/
250 (getattrfunc
)func_getattr
, /*tp_getattr*/
251 (setattrfunc
)func_setattr
, /*tp_setattr*/
252 (cmpfunc
)func_compare
, /*tp_compare*/
253 (reprfunc
)func_repr
, /*tp_repr*/
255 0, /*tp_as_sequence*/
257 (hashfunc
)func_hash
, /*tp_hash*/
262 0, /* tp_as_buffer */
263 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_GC
, /*tp_flags*/
265 (traverseproc
)func_traverse
, /* tp_traverse */