bpo-39573: Convert Py_REFCNT and Py_SIZE to functions (GH-20429) · python/cpython@fe2978b (original) (raw)

Original file line number Diff line number Diff line change
@@ -119,30 +119,45 @@ typedef struct {
119 119
120 120 /* Cast argument to PyVarObject* type. */
121 121 #define _PyVarObject_CAST(op) ((PyVarObject*)(op))
122 +#define _PyVarObject_CAST_CONST(op) ((const PyVarObject*)(op))
123 +
124 +
125 +static inline Py_ssize_t _Py_REFCNT(const PyObject *ob) {
126 +return ob->ob_refcnt;
127 +}
128 +#define Py_REFCNT(ob) _Py_REFCNT(_PyObject_CAST_CONST(ob))
129 +
130 +
131 +static inline Py_ssize_t _Py_SIZE(const PyVarObject *ob) {
132 +return ob->ob_size;
133 +}
134 +#define Py_SIZE(ob) _Py_SIZE(_PyVarObject_CAST_CONST(ob))
122 135
123 -#define Py_REFCNT(ob) (_PyObject_CAST(ob)->ob_refcnt)
124 -#define Py_SIZE(ob) (_PyVarObject_CAST(ob)->ob_size)
125 136
126 137 static inline PyTypeObject* _Py_TYPE(const PyObject *ob) {
127 138 return ob->ob_type;
128 139 }
129 140 #define Py_TYPE(ob) _Py_TYPE(_PyObject_CAST_CONST(ob))
130 141
142 +
131 143 static inline int _Py_IS_TYPE(const PyObject *ob, const PyTypeObject *type) {
132 144 return ob->ob_type == type;
133 145 }
134 146 #define Py_IS_TYPE(ob, type) _Py_IS_TYPE(_PyObject_CAST_CONST(ob), type)
135 147
148 +
136 149 static inline void _Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) {
137 150 ob->ob_refcnt = refcnt;
138 151 }
139 152 #define Py_SET_REFCNT(ob, refcnt) _Py_SET_REFCNT(_PyObject_CAST(ob), refcnt)
140 153
154 +
141 155 static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type) {
142 156 ob->ob_type = type;
143 157 }
144 158 #define Py_SET_TYPE(ob, type) _Py_SET_TYPE(_PyObject_CAST(ob), type)
145 159
160 +
146 161 static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) {
147 162 ob->ob_size = size;
148 163 }