@@ -1509,157 +1509,163 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
15091509}
15101510#endif /* MS_WINDOWS */
15111511
1512- static void
1513- setint (PyObject * d , const char * name , long value )
1512+ static int
1513+ mmap_exec (PyObject * module )
15141514{
1515- PyObject * o = PyLong_FromLong (value );
1516- if (o ) {
1517- PyDict_SetItemString (d , name , o );
1518- Py_DECREF (o );
1515+ if (PyType_Ready (& mmap_object_type ) < 0 ) {
1516+ return -1 ;
15191517 }
1520- }
1521-
15221518
1523- static struct PyModuleDef mmapmodule = {
1524- PyModuleDef_HEAD_INIT ,
1525- "mmap" ,
1526- NULL ,
1527- -1 ,
1528- NULL ,
1529- NULL ,
1530- NULL ,
1531- NULL ,
1532- NULL
1533- };
1534-
1535- PyMODINIT_FUNC
1536- PyInit_mmap (void )
1537- {
1538- PyObject * dict , * module ;
1519+ Py_INCREF (PyExc_OSError );
1520+ if (PyModule_AddObject (module , "error" , PyExc_OSError ) < 0 ) {
1521+ Py_DECREF (PyExc_OSError );
1522+ return -1 ;
1523+ }
1524+ if (PyModule_AddType (module , & mmap_object_type ) < 0 ) {
1525+ return -1 ;
1526+ }
15391527
1540- if (PyType_Ready (& mmap_object_type ) < 0 )
1541- return NULL ;
1528+ #define ADD_INT_MACRO (module , constant ) \
1529+ do { \
1530+ if (PyModule_AddIntConstant(module, #constant, constant) < 0) { \
1531+ return -1; \
1532+ } \
1533+ } while (0)
15421534
1543- module = PyModule_Create (& mmapmodule );
1544- if (module == NULL )
1545- return NULL ;
1546- dict = PyModule_GetDict (module );
1547- if (!dict )
1548- return NULL ;
1549- PyDict_SetItemString (dict , "error" , PyExc_OSError );
1550- PyDict_SetItemString (dict , "mmap" , (PyObject * ) & mmap_object_type );
15511535#ifdef PROT_EXEC
1552- setint ( dict , "PROT_EXEC" , PROT_EXEC );
1536+ ADD_INT_MACRO ( module , PROT_EXEC );
15531537#endif
15541538#ifdef PROT_READ
1555- setint ( dict , "PROT_READ" , PROT_READ );
1539+ ADD_INT_MACRO ( module , PROT_READ );
15561540#endif
15571541#ifdef PROT_WRITE
1558- setint ( dict , "PROT_WRITE" , PROT_WRITE );
1542+ ADD_INT_MACRO ( module , PROT_WRITE );
15591543#endif
15601544
15611545#ifdef MAP_SHARED
1562- setint ( dict , "MAP_SHARED" , MAP_SHARED );
1546+ ADD_INT_MACRO ( module , MAP_SHARED );
15631547#endif
15641548#ifdef MAP_PRIVATE
1565- setint ( dict , "MAP_PRIVATE" , MAP_PRIVATE );
1549+ ADD_INT_MACRO ( module , MAP_PRIVATE );
15661550#endif
15671551#ifdef MAP_DENYWRITE
1568- setint ( dict , "MAP_DENYWRITE" , MAP_DENYWRITE );
1552+ ADD_INT_MACRO ( module , MAP_DENYWRITE );
15691553#endif
15701554#ifdef MAP_EXECUTABLE
1571- setint ( dict , "MAP_EXECUTABLE" , MAP_EXECUTABLE );
1555+ ADD_INT_MACRO ( module , MAP_EXECUTABLE );
15721556#endif
15731557#ifdef MAP_ANONYMOUS
1574- setint (dict , "MAP_ANON" , MAP_ANONYMOUS );
1575- setint (dict , "MAP_ANONYMOUS" , MAP_ANONYMOUS );
1558+ if (PyModule_AddIntConstant (module , "MAP_ANON" , MAP_ANONYMOUS ) < 0 ) {
1559+ return -1 ;
1560+ }
1561+ ADD_INT_MACRO (module , MAP_ANONYMOUS );
15761562#endif
15771563#ifdef MAP_POPULATE
1578- setint ( dict , "MAP_POPULATE" , MAP_POPULATE );
1564+ ADD_INT_MACRO ( module , MAP_POPULATE );
15791565#endif
1566+ if (PyModule_AddIntConstant (module , "PAGESIZE" , (long )my_getpagesize ()) < 0 ) {
1567+ return -1 ;
1568+ }
15801569
1581- setint ( dict , "PAGESIZE " , (long )my_getpagesize ());
1582-
1583- setint ( dict , "ALLOCATIONGRANULARITY" , ( long ) my_getallocationgranularity ());
1570+ if ( PyModule_AddIntConstant ( module , "ALLOCATIONGRANULARITY " , (long )my_getallocationgranularity ()) < 0 ) {
1571+ return -1 ;
1572+ }
15841573
1585- setint ( dict , "ACCESS_DEFAULT" , ACCESS_DEFAULT );
1586- setint ( dict , "ACCESS_READ" , ACCESS_READ );
1587- setint ( dict , "ACCESS_WRITE" , ACCESS_WRITE );
1588- setint ( dict , "ACCESS_COPY" , ACCESS_COPY );
1574+ ADD_INT_MACRO ( module , ACCESS_DEFAULT );
1575+ ADD_INT_MACRO ( module , ACCESS_READ );
1576+ ADD_INT_MACRO ( module , ACCESS_WRITE );
1577+ ADD_INT_MACRO ( module , ACCESS_COPY );
15891578
15901579#ifdef HAVE_MADVISE
15911580 // Conventional advice values
15921581#ifdef MADV_NORMAL
1593- setint ( dict , "MADV_NORMAL" , MADV_NORMAL );
1582+ ADD_INT_MACRO ( module , MADV_NORMAL );
15941583#endif
15951584#ifdef MADV_RANDOM
1596- setint ( dict , "MADV_RANDOM" , MADV_RANDOM );
1585+ ADD_INT_MACRO ( module , MADV_RANDOM );
15971586#endif
15981587#ifdef MADV_SEQUENTIAL
1599- setint ( dict , "MADV_SEQUENTIAL" , MADV_SEQUENTIAL );
1588+ ADD_INT_MACRO ( module , MADV_SEQUENTIAL );
16001589#endif
16011590#ifdef MADV_WILLNEED
1602- setint ( dict , "MADV_WILLNEED" , MADV_WILLNEED );
1591+ ADD_INT_MACRO ( module , MADV_WILLNEED );
16031592#endif
16041593#ifdef MADV_DONTNEED
1605- setint ( dict , "MADV_DONTNEED" , MADV_DONTNEED );
1594+ ADD_INT_MACRO ( module , MADV_DONTNEED );
16061595#endif
16071596
16081597 // Linux-specific advice values
16091598#ifdef MADV_REMOVE
1610- setint ( dict , "MADV_REMOVE" , MADV_REMOVE );
1599+ ADD_INT_MACRO ( module , MADV_REMOVE );
16111600#endif
16121601#ifdef MADV_DONTFORK
1613- setint ( dict , "MADV_DONTFORK" , MADV_DONTFORK );
1602+ ADD_INT_MACRO ( module , MADV_DONTFORK );
16141603#endif
16151604#ifdef MADV_DOFORK
1616- setint ( dict , "MADV_DOFORK" , MADV_DOFORK );
1605+ ADD_INT_MACRO ( module , MADV_DOFORK );
16171606#endif
16181607#ifdef MADV_HWPOISON
1619- setint ( dict , "MADV_HWPOISON" , MADV_HWPOISON );
1608+ ADD_INT_MACRO ( module , MADV_HWPOISON );
16201609#endif
16211610#ifdef MADV_MERGEABLE
1622- setint ( dict , "MADV_MERGEABLE" , MADV_MERGEABLE );
1611+ ADD_INT_MACRO ( module , MADV_MERGEABLE );
16231612#endif
16241613#ifdef MADV_UNMERGEABLE
1625- setint ( dict , "MADV_UNMERGEABLE" , MADV_UNMERGEABLE );
1614+ ADD_INT_MACRO ( module , MADV_UNMERGEABLE );
16261615#endif
16271616#ifdef MADV_SOFT_OFFLINE
1628- setint ( dict , "MADV_SOFT_OFFLINE" , MADV_SOFT_OFFLINE );
1617+ ADD_INT_MACRO ( module , MADV_SOFT_OFFLINE );
16291618#endif
16301619#ifdef MADV_HUGEPAGE
1631- setint ( dict , "MADV_HUGEPAGE" , MADV_HUGEPAGE );
1620+ ADD_INT_MACRO ( module , MADV_HUGEPAGE );
16321621#endif
16331622#ifdef MADV_NOHUGEPAGE
1634- setint ( dict , "MADV_NOHUGEPAGE" , MADV_NOHUGEPAGE );
1623+ ADD_INT_MACRO ( module , MADV_NOHUGEPAGE );
16351624#endif
16361625#ifdef MADV_DONTDUMP
1637- setint ( dict , "MADV_DONTDUMP" , MADV_DONTDUMP );
1626+ ADD_INT_MACRO ( module , MADV_DONTDUMP );
16381627#endif
16391628#ifdef MADV_DODUMP
1640- setint ( dict , "MADV_DODUMP" , MADV_DODUMP );
1629+ ADD_INT_MACRO ( module , MADV_DODUMP );
16411630#endif
16421631#ifdef MADV_FREE // (Also present on FreeBSD and macOS.)
1643- setint ( dict , "MADV_FREE" , MADV_FREE );
1632+ ADD_INT_MACRO ( module , MADV_FREE );
16441633#endif
16451634
16461635 // FreeBSD-specific
16471636#ifdef MADV_NOSYNC
1648- setint ( dict , "MADV_NOSYNC" , MADV_NOSYNC );
1637+ ADD_INT_MACRO ( module , MADV_NOSYNC );
16491638#endif
16501639#ifdef MADV_AUTOSYNC
1651- setint ( dict , "MADV_AUTOSYNC" , MADV_AUTOSYNC );
1640+ ADD_INT_MACRO ( module , MADV_AUTOSYNC );
16521641#endif
16531642#ifdef MADV_NOCORE
1654- setint ( dict , "MADV_NOCORE" , MADV_NOCORE );
1643+ ADD_INT_MACRO ( module , MADV_NOCORE );
16551644#endif
16561645#ifdef MADV_CORE
1657- setint ( dict , "MADV_CORE" , MADV_CORE );
1646+ ADD_INT_MACRO ( module , MADV_CORE );
16581647#endif
16591648#ifdef MADV_PROTECT
1660- setint ( dict , "MADV_PROTECT" , MADV_PROTECT );
1649+ ADD_INT_MACRO ( module , MADV_PROTECT );
16611650#endif
16621651#endif // HAVE_MADVISE
1652+ return 0 ;
1653+ }
16631654
1664- return module ;
1655+ static PyModuleDef_Slot mmap_slots [] = {
1656+ {Py_mod_exec , mmap_exec },
1657+ {0 , NULL }
1658+ };
1659+
1660+ static struct PyModuleDef mmapmodule = {
1661+ PyModuleDef_HEAD_INIT ,
1662+ .m_name = "mmap" ,
1663+ .m_size = 0 ,
1664+ .m_slots = mmap_slots ,
1665+ };
1666+
1667+ PyMODINIT_FUNC
1668+ PyInit_mmap (void )
1669+ {
1670+ return PyModuleDef_Init (& mmapmodule );
16651671}
0 commit comments