Skip to content

Commit 272bec4

Browse files
authored
gh-89653: PEP 670: Convert PyFunction macros (#93765)
Convert PyFunction macros to static inline functions.
1 parent c5d0517 commit 272bec4

File tree

1 file changed

+39
-16
lines changed

1 file changed

+39
-16
lines changed

Include/cpython/funcobject.h

+39-16
Original file line numberDiff line numberDiff line change
@@ -82,22 +82,45 @@ PyAPI_FUNC(PyObject *) _PyFunction_Vectorcall(
8282
size_t nargsf,
8383
PyObject *kwnames);
8484

85-
/* Macros for direct access to these values. Type checks are *not*
86-
done, so use with care. */
87-
#define PyFunction_GET_CODE(func) \
88-
(((PyFunctionObject *)func) -> func_code)
89-
#define PyFunction_GET_GLOBALS(func) \
90-
(((PyFunctionObject *)func) -> func_globals)
91-
#define PyFunction_GET_MODULE(func) \
92-
(((PyFunctionObject *)func) -> func_module)
93-
#define PyFunction_GET_DEFAULTS(func) \
94-
(((PyFunctionObject *)func) -> func_defaults)
95-
#define PyFunction_GET_KW_DEFAULTS(func) \
96-
(((PyFunctionObject *)func) -> func_kwdefaults)
97-
#define PyFunction_GET_CLOSURE(func) \
98-
(((PyFunctionObject *)func) -> func_closure)
99-
#define PyFunction_GET_ANNOTATIONS(func) \
100-
(((PyFunctionObject *)func) -> func_annotations)
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+
static inline PyObject* PyFunction_GET_CODE(PyObject *func) {
91+
return _PyFunction_CAST(func)->func_code;
92+
}
93+
#define PyFunction_GET_CODE(func) PyFunction_GET_CODE(_PyObject_CAST(func))
94+
95+
static inline PyObject* PyFunction_GET_GLOBALS(PyObject *func) {
96+
return _PyFunction_CAST(func)->func_globals;
97+
}
98+
#define PyFunction_GET_GLOBALS(func) PyFunction_GET_GLOBALS(_PyObject_CAST(func))
99+
100+
static inline PyObject* PyFunction_GET_MODULE(PyObject *func) {
101+
return _PyFunction_CAST(func)->func_module;
102+
}
103+
#define PyFunction_GET_MODULE(func) PyFunction_GET_MODULE(_PyObject_CAST(func))
104+
105+
static inline PyObject* PyFunction_GET_DEFAULTS(PyObject *func) {
106+
return _PyFunction_CAST(func)->func_defaults;
107+
}
108+
#define PyFunction_GET_DEFAULTS(func) PyFunction_GET_DEFAULTS(_PyObject_CAST(func))
109+
110+
static inline PyObject* PyFunction_GET_KW_DEFAULTS(PyObject *func) {
111+
return _PyFunction_CAST(func)->func_kwdefaults;
112+
}
113+
#define PyFunction_GET_KW_DEFAULTS(func) PyFunction_GET_KW_DEFAULTS(_PyObject_CAST(func))
114+
115+
static inline PyObject* PyFunction_GET_CLOSURE(PyObject *func) {
116+
return _PyFunction_CAST(func)->func_closure;
117+
}
118+
#define PyFunction_GET_CLOSURE(func) PyFunction_GET_CLOSURE(_PyObject_CAST(func))
119+
120+
static inline PyObject* PyFunction_GET_ANNOTATIONS(PyObject *func) {
121+
return _PyFunction_CAST(func)->func_annotations;
122+
}
123+
#define PyFunction_GET_ANNOTATIONS(func) PyFunction_GET_ANNOTATIONS(_PyObject_CAST(func))
101124

102125
/* The classmethod and staticmethod types lives here, too */
103126
PyAPI_DATA(PyTypeObject) PyClassMethod_Type;

0 commit comments

Comments
 (0)