| #ifndef _Py_HAVE_SLOTS_H |
| #define _Py_HAVE_SLOTS_H |
| |
| typedef void (*_Py_funcptr_t)(void); |
| |
| struct PySlot { |
| uint16_t sl_id; |
| uint16_t sl_flags; |
| _Py_ANONYMOUS union { |
| uint32_t sl_reserved; // must be 0 |
| }; |
| _Py_ANONYMOUS union { |
| void *sl_ptr; |
| _Py_funcptr_t sl_func; |
| Py_ssize_t sl_size; |
| int64_t sl_int64; |
| uint64_t sl_uint64; |
| }; |
| }; |
| |
| #define PySlot_OPTIONAL 0x0001 |
| #define PySlot_STATIC 0x0002 |
| #define PySlot_INTPTR 0x0004 |
| |
| #define Py_slot_invalid 0xffff |
| |
| #define PySlot_DATA(NAME, VALUE) \ |
| {.sl_id=(NAME), .sl_flags=PySlot_INTPTR, .sl_ptr=(void*)(VALUE)} |
| |
| #define PySlot_FUNC(NAME, VALUE) \ |
| {.sl_id=(NAME), .sl_func=(_Py_funcptr_t)(VALUE)} |
| |
| #define PySlot_SIZE(NAME, VALUE) \ |
| {.sl_id=(NAME), .sl_size=(Py_ssize_t)(VALUE)} |
| |
| #define PySlot_INT64(NAME, VALUE) \ |
| {.sl_id=(NAME), .sl_int64=(int64_t)(VALUE)} |
| |
| #define PySlot_UINT64(NAME, VALUE) \ |
| {.sl_id=(NAME), .sl_uint64=(uint64_t)(VALUE)} |
| |
| #define PySlot_STATIC_DATA(NAME, VALUE) \ |
| {.sl_id=(NAME), .sl_flags=PySlot_STATIC, .sl_ptr=(VALUE)} |
| |
| #define PySlot_END {0} |
| |
| |
| // Macros without designated initializers (for C++11 and below): |
| |
| #define PySlot_PTR(NAME, VALUE) \ |
| {(NAME), PySlot_INTPTR, {0}, {(void*)(VALUE)}} |
| |
| #define PySlot_PTR_STATIC(NAME, VALUE) \ |
| {(NAME), PySlot_INTPTR | PySlot_STATIC, {0}, {(void*)(VALUE)}} |
| |
| #endif // _Py_HAVE_SLOTS_H |