1 2/* Function object interface */ 3 4#ifndef Py_FUNCOBJECT_H 5#define Py_FUNCOBJECT_H 6#ifdef __cplusplus 7extern "C" { 8#endif 9 10/* Function objects and code objects should not be confused with each other: 11 * 12 * Function objects are created by the execution of the 'def' statement. 13 * They reference a code object in their func_code attribute, which is a 14 * purely syntactic object, i.e. nothing more than a compiled version of some 15 * source code lines. There is one code object per source code "fragment", 16 * but each code object can be referenced by zero or many function objects 17 * depending only on how many times the 'def' statement in the source was 18 * executed so far. 19 */ 20 21typedef struct { 22 PyObject_HEAD 23 PyObject *func_code; /* A code object */ 24 PyObject *func_globals; /* A dictionary (other mappings won't do) */ 25 PyObject *func_defaults; /* NULL or a tuple */ 26 PyObject *func_closure; /* NULL or a tuple of cell objects */ 27 PyObject *func_doc; /* The __doc__ attribute, can be anything */ 28 PyObject *func_name; /* The __name__ attribute, a string object */ 29 PyObject *func_dict; /* The __dict__ attribute, a dict or NULL */ 30 PyObject *func_weakreflist; /* List of weak references */ 31 PyObject *func_module; /* The __module__ attribute, can be anything */ 32 33 /* Invariant: 34 * func_closure contains the bindings for func_code->co_freevars, so 35 * PyTuple_Size(func_closure) == PyCode_GetNumFree(func_code) 36 * (func_closure may be NULL if PyCode_GetNumFree(func_code) == 0). 37 */ 38} PyFunctionObject; 39 40PyAPI_DATA(PyTypeObject) PyFunction_Type; 41 42#define PyFunction_Check(op) (Py_TYPE(op) == &PyFunction_Type) 43 44PyAPI_FUNC(PyObject *) PyFunction_New(PyObject *, PyObject *); 45PyAPI_FUNC(PyObject *) PyFunction_GetCode(PyObject *); 46PyAPI_FUNC(PyObject *) PyFunction_GetGlobals(PyObject *); 47PyAPI_FUNC(PyObject *) PyFunction_GetModule(PyObject *); 48PyAPI_FUNC(PyObject *) PyFunction_GetDefaults(PyObject *); 49PyAPI_FUNC(int) PyFunction_SetDefaults(PyObject *, PyObject *); 50PyAPI_FUNC(PyObject *) PyFunction_GetClosure(PyObject *); 51PyAPI_FUNC(int) PyFunction_SetClosure(PyObject *, PyObject *); 52 53/* Macros for direct access to these values. Type checks are *not* 54 done, so use with care. */ 55#define PyFunction_GET_CODE(func) \ 56 (((PyFunctionObject *)func) -> func_code) 57#define PyFunction_GET_GLOBALS(func) \ 58 (((PyFunctionObject *)func) -> func_globals) 59#define PyFunction_GET_MODULE(func) \ 60 (((PyFunctionObject *)func) -> func_module) 61#define PyFunction_GET_DEFAULTS(func) \ 62 (((PyFunctionObject *)func) -> func_defaults) 63#define PyFunction_GET_CLOSURE(func) \ 64 (((PyFunctionObject *)func) -> func_closure) 65 66/* The classmethod and staticmethod types lives here, too */ 67PyAPI_DATA(PyTypeObject) PyClassMethod_Type; 68PyAPI_DATA(PyTypeObject) PyStaticMethod_Type; 69 70PyAPI_FUNC(PyObject *) PyClassMethod_New(PyObject *); 71PyAPI_FUNC(PyObject *) PyStaticMethod_New(PyObject *); 72 73#ifdef __cplusplus 74} 75#endif 76#endif /* !Py_FUNCOBJECT_H */ 77