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