| #ifndef Py_INTERNAL_CELL_H |
| #define Py_INTERNAL_CELL_H |
| |
| #include "pycore_critical_section.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #ifndef Py_BUILD_CORE |
| # error "this header requires Py_BUILD_CORE define" |
| #endif |
| |
| // Sets the cell contents to `value` and return previous contents. Steals a |
| // reference to `value`. |
| static inline PyObject * |
| PyCell_SwapTakeRef(PyCellObject *cell, PyObject *value) |
| { |
| PyObject *old_value; |
| Py_BEGIN_CRITICAL_SECTION(cell); |
| old_value = cell->ob_ref; |
| cell->ob_ref = value; |
| Py_END_CRITICAL_SECTION(); |
| return old_value; |
| } |
| |
| static inline void |
| PyCell_SetTakeRef(PyCellObject *cell, PyObject *value) |
| { |
| PyObject *old_value = PyCell_SwapTakeRef(cell, value); |
| Py_XDECREF(old_value); |
| } |
| |
| // Gets the cell contents. Returns a new reference. |
| static inline PyObject * |
| PyCell_GetRef(PyCellObject *cell) |
| { |
| PyObject *res; |
| Py_BEGIN_CRITICAL_SECTION(cell); |
| res = Py_XNewRef(cell->ob_ref); |
| Py_END_CRITICAL_SECTION(); |
| return res; |
| } |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| #endif /* !Py_INTERNAL_CELL_H */ |