| extern "C" { | |
| // Don't call this function but _PyLong_GetZero() and _PyLong_GetOne() | |
| static inline PyObject* __PyLong_GetSmallInt_internal(int value) | |
| { | |
| PyInterpreterState *interp = _PyInterpreterState_GET(); | |
| assert(-_PY_NSMALLNEGINTS <= value && value < _PY_NSMALLPOSINTS); | |
| size_t index = _PY_NSMALLNEGINTS + value; | |
| PyObject *obj = (PyObject*)interp->small_ints[index]; | |
| // _PyLong_GetZero(), _PyLong_GetOne() and get_small_int() must not be | |
| // called before _PyLong_Init() nor after _PyLong_Fini(). | |
| assert(obj != NULL); | |
| return obj; | |
| } | |
| // Return a borrowed reference to the zero singleton. | |
| // The function cannot return NULL. | |
| static inline PyObject* _PyLong_GetZero(void) | |
| { return __PyLong_GetSmallInt_internal(0); } | |
| // Return a borrowed reference to the one singleton. | |
| // The function cannot return NULL. | |
| static inline PyObject* _PyLong_GetOne(void) | |
| { return __PyLong_GetSmallInt_internal(1); } | |
| } | |