Coverage Report

Created: 2025-07-04 06:49

/src/cpython-install/include/python3.15/cpython/funcobject.h
Line
Count
Source (jump to first uncovered line)
1
/* Function object interface */
2
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
11
#define _Py_COMMON_FIELDS(PREFIX) \
12
    PyObject *PREFIX ## globals; \
13
    PyObject *PREFIX ## builtins; \
14
    PyObject *PREFIX ## name; \
15
    PyObject *PREFIX ## qualname; \
16
    PyObject *PREFIX ## code;        /* A code object, the __code__ attribute */ \
17
    PyObject *PREFIX ## defaults;    /* NULL or a tuple */ \
18
    PyObject *PREFIX ## kwdefaults;  /* NULL or a dict */ \
19
    PyObject *PREFIX ## closure;     /* NULL or a tuple of cell objects */
20
21
typedef struct {
22
    _Py_COMMON_FIELDS(fc_)
23
} PyFrameConstructor;
24
25
/* Function objects and code objects should not be confused with each other:
26
 *
27
 * Function objects are created by the execution of the 'def' statement.
28
 * They reference a code object in their __code__ attribute, which is a
29
 * purely syntactic object, i.e. nothing more than a compiled version of some
30
 * source code lines.  There is one code object per source code "fragment",
31
 * but each code object can be referenced by zero or many function objects
32
 * depending only on how many times the 'def' statement in the source was
33
 * executed so far.
34
 */
35
36
typedef struct {
37
    PyObject_HEAD
38
    _Py_COMMON_FIELDS(func_)
39
    PyObject *func_doc;         /* The __doc__ attribute, can be anything */
40
    PyObject *func_dict;        /* The __dict__ attribute, a dict or NULL */
41
    PyObject *func_weakreflist; /* List of weak references */
42
    PyObject *func_module;      /* The __module__ attribute, can be anything */
43
    PyObject *func_annotations; /* Annotations, a dict or NULL */
44
    PyObject *func_annotate;    /* Callable to fill the annotations dictionary */
45
    PyObject *func_typeparams;  /* Tuple of active type variables or NULL */
46
    vectorcallfunc vectorcall;
47
    /* Version number for use by specializer.
48
     * Can set to non-zero when we want to specialize.
49
     * Will be set to zero if any of these change:
50
     *     defaults
51
     *     kwdefaults (only if the object changes, not the contents of the dict)
52
     *     code
53
     *     annotations
54
     *     vectorcall function pointer */
55
    uint32_t func_version;
56
57
    /* Invariant:
58
     *     func_closure contains the bindings for func_code->co_freevars, so
59
     *     PyTuple_Size(func_closure) == PyCode_GetNumFree(func_code)
60
     *     (func_closure may be NULL if PyCode_GetNumFree(func_code) == 0).
61
     */
62
} PyFunctionObject;
63
64
#undef _Py_COMMON_FIELDS
65
66
PyAPI_DATA(PyTypeObject) PyFunction_Type;
67
68
#define PyFunction_Check(op) Py_IS_TYPE((op), &PyFunction_Type)
69
70
PyAPI_FUNC(PyObject *) PyFunction_New(PyObject *, PyObject *);
71
PyAPI_FUNC(PyObject *) PyFunction_NewWithQualName(PyObject *, PyObject *, PyObject *);
72
PyAPI_FUNC(PyObject *) PyFunction_GetCode(PyObject *);
73
PyAPI_FUNC(PyObject *) PyFunction_GetGlobals(PyObject *);
74
PyAPI_FUNC(PyObject *) PyFunction_GetModule(PyObject *);
75
PyAPI_FUNC(PyObject *) PyFunction_GetDefaults(PyObject *);
76
PyAPI_FUNC(int) PyFunction_SetDefaults(PyObject *, PyObject *);
77
PyAPI_FUNC(void) PyFunction_SetVectorcall(PyFunctionObject *, vectorcallfunc);
78
PyAPI_FUNC(PyObject *) PyFunction_GetKwDefaults(PyObject *);
79
PyAPI_FUNC(int) PyFunction_SetKwDefaults(PyObject *, PyObject *);
80
PyAPI_FUNC(PyObject *) PyFunction_GetClosure(PyObject *);
81
PyAPI_FUNC(int) PyFunction_SetClosure(PyObject *, PyObject *);
82
PyAPI_FUNC(PyObject *) PyFunction_GetAnnotations(PyObject *);
83
PyAPI_FUNC(int) PyFunction_SetAnnotations(PyObject *, PyObject *);
84
85
#define _PyFunction_CAST(func) \
86
    (assert(PyFunction_Check(func)), _Py_CAST(PyFunctionObject*, func))
87
88
/* Static inline functions for direct access to these values.
89
   Type checks are *not* done, so use with care. */
90
0
static inline PyObject* PyFunction_GET_CODE(PyObject *func) {
91
0
    return _PyFunction_CAST(func)->func_code;
92
0
}
93
#define PyFunction_GET_CODE(func) PyFunction_GET_CODE(_PyObject_CAST(func))
94
95
0
static inline PyObject* PyFunction_GET_GLOBALS(PyObject *func) {
96
0
    return _PyFunction_CAST(func)->func_globals;
97
0
}
98
#define PyFunction_GET_GLOBALS(func) PyFunction_GET_GLOBALS(_PyObject_CAST(func))
99
100
0
static inline PyObject* PyFunction_GET_MODULE(PyObject *func) {
101
0
    return _PyFunction_CAST(func)->func_module;
102
0
}
103
#define PyFunction_GET_MODULE(func) PyFunction_GET_MODULE(_PyObject_CAST(func))
104
105
0
static inline PyObject* PyFunction_GET_DEFAULTS(PyObject *func) {
106
0
    return _PyFunction_CAST(func)->func_defaults;
107
0
}
108
#define PyFunction_GET_DEFAULTS(func) PyFunction_GET_DEFAULTS(_PyObject_CAST(func))
109
110
0
static inline PyObject* PyFunction_GET_KW_DEFAULTS(PyObject *func) {
111
0
    return _PyFunction_CAST(func)->func_kwdefaults;
112
0
}
113
#define PyFunction_GET_KW_DEFAULTS(func) PyFunction_GET_KW_DEFAULTS(_PyObject_CAST(func))
114
115
0
static inline PyObject* PyFunction_GET_CLOSURE(PyObject *func) {
116
0
    return _PyFunction_CAST(func)->func_closure;
117
0
}
118
#define PyFunction_GET_CLOSURE(func) PyFunction_GET_CLOSURE(_PyObject_CAST(func))
119
120
0
static inline PyObject* PyFunction_GET_ANNOTATIONS(PyObject *func) {
121
0
    return _PyFunction_CAST(func)->func_annotations;
122
0
}
123
#define PyFunction_GET_ANNOTATIONS(func) PyFunction_GET_ANNOTATIONS(_PyObject_CAST(func))
124
125
/* The classmethod and staticmethod types lives here, too */
126
PyAPI_DATA(PyTypeObject) PyClassMethod_Type;
127
PyAPI_DATA(PyTypeObject) PyStaticMethod_Type;
128
129
PyAPI_FUNC(PyObject *) PyClassMethod_New(PyObject *);
130
PyAPI_FUNC(PyObject *) PyStaticMethod_New(PyObject *);
131
132
#define PY_FOREACH_FUNC_EVENT(V) \
133
    V(CREATE)                    \
134
    V(DESTROY)                   \
135
    V(MODIFY_CODE)               \
136
    V(MODIFY_DEFAULTS)           \
137
    V(MODIFY_KWDEFAULTS)
138
139
typedef enum {
140
    #define PY_DEF_EVENT(EVENT) PyFunction_EVENT_##EVENT,
141
    PY_FOREACH_FUNC_EVENT(PY_DEF_EVENT)
142
    #undef PY_DEF_EVENT
143
} PyFunction_WatchEvent;
144
145
/*
146
 * A callback that is invoked for different events in a function's lifecycle.
147
 *
148
 * The callback is invoked with a borrowed reference to func, after it is
149
 * created and before it is modified or destroyed. The callback should not
150
 * modify func.
151
 *
152
 * When a function's code object, defaults, or kwdefaults are modified the
153
 * callback will be invoked with the respective event and new_value will
154
 * contain a borrowed reference to the new value that is about to be stored in
155
 * the function. Otherwise the third argument is NULL.
156
 *
157
 * If the callback returns with an exception set, it must return -1. Otherwise
158
 * it should return 0.
159
 */
160
typedef int (*PyFunction_WatchCallback)(
161
  PyFunction_WatchEvent event,
162
  PyFunctionObject *func,
163
  PyObject *new_value);
164
165
/*
166
 * Register a per-interpreter callback that will be invoked for function lifecycle
167
 * events.
168
 *
169
 * Returns a handle that may be passed to PyFunction_ClearWatcher on success,
170
 * or -1 and sets an error if no more handles are available.
171
 */
172
PyAPI_FUNC(int) PyFunction_AddWatcher(PyFunction_WatchCallback callback);
173
174
/*
175
 * Clear the watcher associated with the watcher_id handle.
176
 *
177
 * Returns 0 on success or -1 if no watcher exists for the supplied id.
178
 */
179
PyAPI_FUNC(int) PyFunction_ClearWatcher(int watcher_id);
180
181
#ifdef __cplusplus
182
}
183
#endif
184
#endif /* !Py_FUNCOBJECT_H */
185
#endif /* Py_LIMITED_API */