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