| #define _RESOLVE_MODINIT_FUNC_NAME(NAME) \ | |
| PyInit_ ## NAME | |
| #define RESOLVE_MODINIT_FUNC_NAME(NAME) \ | |
| _RESOLVE_MODINIT_FUNC_NAME(NAME) | |
| static int | |
| ensure_xid_class(PyTypeObject *cls, crossinterpdatafunc getdata) | |
| { | |
| //assert(cls->tp_flags & Py_TPFLAGS_HEAPTYPE); | |
| return _PyCrossInterpreterData_RegisterClass(cls, getdata); | |
| } | |
| #ifdef REGISTERS_HEAP_TYPES | |
| static int | |
| clear_xid_class(PyTypeObject *cls) | |
| { | |
| return _PyCrossInterpreterData_UnregisterClass(cls); | |
| } | |
| #endif | |
| static inline int64_t | |
| _get_interpid(_PyCrossInterpreterData *data) | |
| { | |
| int64_t interpid; | |
| if (data != NULL) { | |
| interpid = _PyCrossInterpreterData_INTERPID(data); | |
| assert(!PyErr_Occurred()); | |
| } | |
| else { | |
| interpid = PyInterpreterState_GetID(PyInterpreterState_Get()); | |
| } | |
| return interpid; | |
| } | |
| /* unbound items ************************************************************/ | |
| #ifdef HAS_UNBOUND_ITEMS | |
| #define UNBOUND_REMOVE 1 | |
| #define UNBOUND_ERROR 2 | |
| #define UNBOUND_REPLACE 3 | |
| // It would also be possible to add UNBOUND_REPLACE where the replacement | |
| // value is user-provided. There would be some limitations there, though. | |
| // Another possibility would be something like UNBOUND_COPY, where the | |
| // object is released but the underlying data is copied (with the "raw" | |
| // allocator) and used when the item is popped off the queue. | |
| static int | |
| check_unbound(int unboundop) | |
| { | |
| switch (unboundop) { | |
| case UNBOUND_REMOVE: | |
| case UNBOUND_ERROR: | |
| case UNBOUND_REPLACE: | |
| return 1; | |
| default: | |
| return 0; | |
| } | |
| } | |
| #endif |