1 2 /* Function object interface */ 3 #ifndef Py_LIMITED_API 4 #ifndef Py_FUNCOBJECT_H 5 #define Py_FUNCOBJECT_H 6 #ifdef __cplusplus 7 extern "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 __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 21 typedef struct { 22 PyObject_HEAD 23 PyObject *func_code; /* A code object, the __code__ attribute */ 24 PyObject *func_globals; /* A dictionary (other mappings won't do) */ 25 PyObject *func_defaults; /* NULL or a tuple */ 26 PyObject *func_kwdefaults; /* NULL or a dict */ 27 PyObject *func_closure; /* NULL or a tuple of cell objects */ 28 PyObject *func_doc; /* The __doc__ attribute, can be anything */ 29 PyObject *func_name; /* The __name__ attribute, a string object */ 30 PyObject *func_dict; /* The __dict__ attribute, a dict or NULL */ 31 PyObject *func_weakreflist; /* List of weak references */ 32 PyObject *func_module; /* The __module__ attribute, can be anything */ 33 PyObject *func_annotations; /* Annotations, a dict or NULL */ 34 PyObject *func_qualname; /* The qualified name */ 35 vectorcallfunc vectorcall; 36 37 /* Invariant: 38 * func_closure contains the bindings for func_code->co_freevars, so 39 * PyTuple_Size(func_closure) == PyCode_GetNumFree(func_code) 40 * (func_closure may be NULL if PyCode_GetNumFree(func_code) == 0). 41 */ 42 } PyFunctionObject; 43 44 PyAPI_DATA(PyTypeObject) PyFunction_Type; 45 46 #define PyFunction_Check(op) (Py_TYPE(op) == &PyFunction_Type) 47 48 PyAPI_FUNC(PyObject *) PyFunction_New(PyObject *, PyObject *); 49 PyAPI_FUNC(PyObject *) PyFunction_NewWithQualName(PyObject *, PyObject *, PyObject *); 50 PyAPI_FUNC(PyObject *) PyFunction_GetCode(PyObject *); 51 PyAPI_FUNC(PyObject *) PyFunction_GetGlobals(PyObject *); 52 PyAPI_FUNC(PyObject *) PyFunction_GetModule(PyObject *); 53 PyAPI_FUNC(PyObject *) PyFunction_GetDefaults(PyObject *); 54 PyAPI_FUNC(int) PyFunction_SetDefaults(PyObject *, PyObject *); 55 PyAPI_FUNC(PyObject *) PyFunction_GetKwDefaults(PyObject *); 56 PyAPI_FUNC(int) PyFunction_SetKwDefaults(PyObject *, PyObject *); 57 PyAPI_FUNC(PyObject *) PyFunction_GetClosure(PyObject *); 58 PyAPI_FUNC(int) PyFunction_SetClosure(PyObject *, PyObject *); 59 PyAPI_FUNC(PyObject *) PyFunction_GetAnnotations(PyObject *); 60 PyAPI_FUNC(int) PyFunction_SetAnnotations(PyObject *, PyObject *); 61 62 #ifndef Py_LIMITED_API 63 PyAPI_FUNC(PyObject *) _PyFunction_FastCallDict( 64 PyObject *func, 65 PyObject *const *args, 66 Py_ssize_t nargs, 67 PyObject *kwargs); 68 69 PyAPI_FUNC(PyObject *) _PyFunction_Vectorcall( 70 PyObject *func, 71 PyObject *const *stack, 72 size_t nargsf, 73 PyObject *kwnames); 74 #endif 75 76 /* Macros for direct access to these values. Type checks are *not* 77 done, so use with care. */ 78 #define PyFunction_GET_CODE(func) \ 79 (((PyFunctionObject *)func) -> func_code) 80 #define PyFunction_GET_GLOBALS(func) \ 81 (((PyFunctionObject *)func) -> func_globals) 82 #define PyFunction_GET_MODULE(func) \ 83 (((PyFunctionObject *)func) -> func_module) 84 #define PyFunction_GET_DEFAULTS(func) \ 85 (((PyFunctionObject *)func) -> func_defaults) 86 #define PyFunction_GET_KW_DEFAULTS(func) \ 87 (((PyFunctionObject *)func) -> func_kwdefaults) 88 #define PyFunction_GET_CLOSURE(func) \ 89 (((PyFunctionObject *)func) -> func_closure) 90 #define PyFunction_GET_ANNOTATIONS(func) \ 91 (((PyFunctionObject *)func) -> func_annotations) 92 93 /* The classmethod and staticmethod types lives here, too */ 94 PyAPI_DATA(PyTypeObject) PyClassMethod_Type; 95 PyAPI_DATA(PyTypeObject) PyStaticMethod_Type; 96 97 PyAPI_FUNC(PyObject *) PyClassMethod_New(PyObject *); 98 PyAPI_FUNC(PyObject *) PyStaticMethod_New(PyObject *); 99 100 #ifdef __cplusplus 101 } 102 #endif 103 #endif /* !Py_FUNCOBJECT_H */ 104 #endif /* Py_LIMITED_API */ 105