68 lines
2.6 KiB
C
68 lines
2.6 KiB
C
|
#ifndef PGIMPORT_H
|
||
|
#define PGIMPORT_H
|
||
|
|
||
|
/* Prefix when importing module */
|
||
|
#define IMPPREFIX "pygame."
|
||
|
|
||
|
#include "pgcompat.h"
|
||
|
|
||
|
#define PYGAMEAPI_LOCAL_ENTRY "_PYGAME_C_API"
|
||
|
#define PG_CAPSULE_NAME(m) (IMPPREFIX m "." PYGAMEAPI_LOCAL_ENTRY)
|
||
|
|
||
|
/*
|
||
|
* fill API slots defined by PYGAMEAPI_DEFINE_SLOTS/PYGAMEAPI_EXTERN_SLOTS
|
||
|
*/
|
||
|
#define _IMPORT_PYGAME_MODULE(module) \
|
||
|
{ \
|
||
|
PyObject *_mod_##module = PyImport_ImportModule(IMPPREFIX #module); \
|
||
|
\
|
||
|
if (_mod_##module != NULL) { \
|
||
|
PyObject *_c_api = \
|
||
|
PyObject_GetAttrString(_mod_##module, PYGAMEAPI_LOCAL_ENTRY); \
|
||
|
\
|
||
|
Py_DECREF(_mod_##module); \
|
||
|
if (_c_api != NULL && PyCapsule_CheckExact(_c_api)) { \
|
||
|
void **localptr = (void **)PyCapsule_GetPointer( \
|
||
|
_c_api, PG_CAPSULE_NAME(#module)); \
|
||
|
_PGSLOTS_##module = localptr; \
|
||
|
} \
|
||
|
Py_XDECREF(_c_api); \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
#define PYGAMEAPI_IS_IMPORTED(module) (_PGSLOTS_##module != NULL)
|
||
|
|
||
|
/*
|
||
|
* source file must include one of these in order to use _IMPORT_PYGAME_MODULE.
|
||
|
* this is set by import_pygame_*() functions.
|
||
|
* disable with NO_PYGAME_C_API
|
||
|
*/
|
||
|
#define PYGAMEAPI_DEFINE_SLOTS(module) void **_PGSLOTS_##module = NULL
|
||
|
#define PYGAMEAPI_EXTERN_SLOTS(module) extern void **_PGSLOTS_##module
|
||
|
#define PYGAMEAPI_GET_SLOT(module, index) _PGSLOTS_##module[(index)]
|
||
|
|
||
|
/*
|
||
|
* disabled API with NO_PYGAME_C_API; do nothing instead
|
||
|
*/
|
||
|
#ifdef NO_PYGAME_C_API
|
||
|
|
||
|
#undef PYGAMEAPI_DEFINE_SLOTS
|
||
|
#undef PYGAMEAPI_EXTERN_SLOTS
|
||
|
|
||
|
#define PYGAMEAPI_DEFINE_SLOTS(module)
|
||
|
#define PYGAMEAPI_EXTERN_SLOTS(module)
|
||
|
|
||
|
/* intentionally leave this defined to cause a compiler error *
|
||
|
#define PYGAMEAPI_GET_SLOT(api_root, index)
|
||
|
#undef PYGAMEAPI_GET_SLOT*/
|
||
|
|
||
|
#undef _IMPORT_PYGAME_MODULE
|
||
|
#define _IMPORT_PYGAME_MODULE(module)
|
||
|
|
||
|
#endif /* NO_PYGAME_C_API */
|
||
|
|
||
|
#define encapsulate_api(ptr, module) \
|
||
|
PyCapsule_New(ptr, PG_CAPSULE_NAME(module), NULL)
|
||
|
|
||
|
#endif /* ~PGIMPORT_H */
|