#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