17db96d56Sopenharmony_ci/* Function object interface */ 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ci#ifndef Py_LIMITED_API 47db96d56Sopenharmony_ci#ifndef Py_FUNCOBJECT_H 57db96d56Sopenharmony_ci#define Py_FUNCOBJECT_H 67db96d56Sopenharmony_ci#ifdef __cplusplus 77db96d56Sopenharmony_ciextern "C" { 87db96d56Sopenharmony_ci#endif 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci#define COMMON_FIELDS(PREFIX) \ 127db96d56Sopenharmony_ci PyObject *PREFIX ## globals; \ 137db96d56Sopenharmony_ci PyObject *PREFIX ## builtins; \ 147db96d56Sopenharmony_ci PyObject *PREFIX ## name; \ 157db96d56Sopenharmony_ci PyObject *PREFIX ## qualname; \ 167db96d56Sopenharmony_ci PyObject *PREFIX ## code; /* A code object, the __code__ attribute */ \ 177db96d56Sopenharmony_ci PyObject *PREFIX ## defaults; /* NULL or a tuple */ \ 187db96d56Sopenharmony_ci PyObject *PREFIX ## kwdefaults; /* NULL or a dict */ \ 197db96d56Sopenharmony_ci PyObject *PREFIX ## closure; /* NULL or a tuple of cell objects */ 207db96d56Sopenharmony_ci 217db96d56Sopenharmony_citypedef struct { 227db96d56Sopenharmony_ci COMMON_FIELDS(fc_) 237db96d56Sopenharmony_ci} PyFrameConstructor; 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_ci/* Function objects and code objects should not be confused with each other: 267db96d56Sopenharmony_ci * 277db96d56Sopenharmony_ci * Function objects are created by the execution of the 'def' statement. 287db96d56Sopenharmony_ci * They reference a code object in their __code__ attribute, which is a 297db96d56Sopenharmony_ci * purely syntactic object, i.e. nothing more than a compiled version of some 307db96d56Sopenharmony_ci * source code lines. There is one code object per source code "fragment", 317db96d56Sopenharmony_ci * but each code object can be referenced by zero or many function objects 327db96d56Sopenharmony_ci * depending only on how many times the 'def' statement in the source was 337db96d56Sopenharmony_ci * executed so far. 347db96d56Sopenharmony_ci */ 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_citypedef struct { 377db96d56Sopenharmony_ci PyObject_HEAD 387db96d56Sopenharmony_ci COMMON_FIELDS(func_) 397db96d56Sopenharmony_ci PyObject *func_doc; /* The __doc__ attribute, can be anything */ 407db96d56Sopenharmony_ci PyObject *func_dict; /* The __dict__ attribute, a dict or NULL */ 417db96d56Sopenharmony_ci PyObject *func_weakreflist; /* List of weak references */ 427db96d56Sopenharmony_ci PyObject *func_module; /* The __module__ attribute, can be anything */ 437db96d56Sopenharmony_ci PyObject *func_annotations; /* Annotations, a dict or NULL */ 447db96d56Sopenharmony_ci vectorcallfunc vectorcall; 457db96d56Sopenharmony_ci /* Version number for use by specializer. 467db96d56Sopenharmony_ci * Can set to non-zero when we want to specialize. 477db96d56Sopenharmony_ci * Will be set to zero if any of these change: 487db96d56Sopenharmony_ci * defaults 497db96d56Sopenharmony_ci * kwdefaults (only if the object changes, not the contents of the dict) 507db96d56Sopenharmony_ci * code 517db96d56Sopenharmony_ci * annotations */ 527db96d56Sopenharmony_ci uint32_t func_version; 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci /* Invariant: 557db96d56Sopenharmony_ci * func_closure contains the bindings for func_code->co_freevars, so 567db96d56Sopenharmony_ci * PyTuple_Size(func_closure) == PyCode_GetNumFree(func_code) 577db96d56Sopenharmony_ci * (func_closure may be NULL if PyCode_GetNumFree(func_code) == 0). 587db96d56Sopenharmony_ci */ 597db96d56Sopenharmony_ci} PyFunctionObject; 607db96d56Sopenharmony_ci 617db96d56Sopenharmony_ciPyAPI_DATA(PyTypeObject) PyFunction_Type; 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci#define PyFunction_Check(op) Py_IS_TYPE(op, &PyFunction_Type) 647db96d56Sopenharmony_ci 657db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyFunction_New(PyObject *, PyObject *); 667db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyFunction_NewWithQualName(PyObject *, PyObject *, PyObject *); 677db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyFunction_GetCode(PyObject *); 687db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyFunction_GetGlobals(PyObject *); 697db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyFunction_GetModule(PyObject *); 707db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyFunction_GetDefaults(PyObject *); 717db96d56Sopenharmony_ciPyAPI_FUNC(int) PyFunction_SetDefaults(PyObject *, PyObject *); 727db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyFunction_GetKwDefaults(PyObject *); 737db96d56Sopenharmony_ciPyAPI_FUNC(int) PyFunction_SetKwDefaults(PyObject *, PyObject *); 747db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyFunction_GetClosure(PyObject *); 757db96d56Sopenharmony_ciPyAPI_FUNC(int) PyFunction_SetClosure(PyObject *, PyObject *); 767db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyFunction_GetAnnotations(PyObject *); 777db96d56Sopenharmony_ciPyAPI_FUNC(int) PyFunction_SetAnnotations(PyObject *, PyObject *); 787db96d56Sopenharmony_ci 797db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyFunction_Vectorcall( 807db96d56Sopenharmony_ci PyObject *func, 817db96d56Sopenharmony_ci PyObject *const *stack, 827db96d56Sopenharmony_ci size_t nargsf, 837db96d56Sopenharmony_ci PyObject *kwnames); 847db96d56Sopenharmony_ci 857db96d56Sopenharmony_ci/* Macros for direct access to these values. Type checks are *not* 867db96d56Sopenharmony_ci done, so use with care. */ 877db96d56Sopenharmony_ci#define PyFunction_GET_CODE(func) \ 887db96d56Sopenharmony_ci (((PyFunctionObject *)func) -> func_code) 897db96d56Sopenharmony_ci#define PyFunction_GET_GLOBALS(func) \ 907db96d56Sopenharmony_ci (((PyFunctionObject *)func) -> func_globals) 917db96d56Sopenharmony_ci#define PyFunction_GET_MODULE(func) \ 927db96d56Sopenharmony_ci (((PyFunctionObject *)func) -> func_module) 937db96d56Sopenharmony_ci#define PyFunction_GET_DEFAULTS(func) \ 947db96d56Sopenharmony_ci (((PyFunctionObject *)func) -> func_defaults) 957db96d56Sopenharmony_ci#define PyFunction_GET_KW_DEFAULTS(func) \ 967db96d56Sopenharmony_ci (((PyFunctionObject *)func) -> func_kwdefaults) 977db96d56Sopenharmony_ci#define PyFunction_GET_CLOSURE(func) \ 987db96d56Sopenharmony_ci (((PyFunctionObject *)func) -> func_closure) 997db96d56Sopenharmony_ci#define PyFunction_GET_ANNOTATIONS(func) \ 1007db96d56Sopenharmony_ci (((PyFunctionObject *)func) -> func_annotations) 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci/* The classmethod and staticmethod types lives here, too */ 1037db96d56Sopenharmony_ciPyAPI_DATA(PyTypeObject) PyClassMethod_Type; 1047db96d56Sopenharmony_ciPyAPI_DATA(PyTypeObject) PyStaticMethod_Type; 1057db96d56Sopenharmony_ci 1067db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyClassMethod_New(PyObject *); 1077db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyStaticMethod_New(PyObject *); 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci#ifdef __cplusplus 1107db96d56Sopenharmony_ci} 1117db96d56Sopenharmony_ci#endif 1127db96d56Sopenharmony_ci#endif /* !Py_FUNCOBJECT_H */ 1137db96d56Sopenharmony_ci#endif /* Py_LIMITED_API */ 114