Skip to content

Commit 84724dd

Browse files
authored
bpo-1635741: Port _stat module to multiphase initialization (GH-19798)
1 parent 113feb3 commit 84724dd

File tree

2 files changed

+128
-100
lines changed

2 files changed

+128
-100
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Port _stat module to multiphase initialization (:pep:`489`).

Modules/_stat.c

Lines changed: 127 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -492,113 +492,140 @@ ST_CTIME\n\
492492
");
493493

494494

495+
static int
496+
stat_exec(PyObject *module)
497+
{
498+
#define ADD_INT_MACRO(module, macro) \
499+
do { \
500+
if (PyModule_AddIntConstant(module, #macro, macro) < 0) { \
501+
return -1; \
502+
} \
503+
} while (0)
504+
505+
ADD_INT_MACRO(module, S_IFDIR);
506+
ADD_INT_MACRO(module, S_IFCHR);
507+
ADD_INT_MACRO(module, S_IFBLK);
508+
ADD_INT_MACRO(module, S_IFREG);
509+
ADD_INT_MACRO(module, S_IFIFO);
510+
ADD_INT_MACRO(module, S_IFLNK);
511+
ADD_INT_MACRO(module, S_IFSOCK);
512+
ADD_INT_MACRO(module, S_IFDOOR);
513+
ADD_INT_MACRO(module, S_IFPORT);
514+
ADD_INT_MACRO(module, S_IFWHT);
515+
516+
ADD_INT_MACRO(module, S_ISUID);
517+
ADD_INT_MACRO(module, S_ISGID);
518+
ADD_INT_MACRO(module, S_ISVTX);
519+
ADD_INT_MACRO(module, S_ENFMT);
520+
521+
ADD_INT_MACRO(module, S_IREAD);
522+
ADD_INT_MACRO(module, S_IWRITE);
523+
ADD_INT_MACRO(module, S_IEXEC);
524+
525+
ADD_INT_MACRO(module, S_IRWXU);
526+
ADD_INT_MACRO(module, S_IRUSR);
527+
ADD_INT_MACRO(module, S_IWUSR);
528+
ADD_INT_MACRO(module, S_IXUSR);
529+
530+
ADD_INT_MACRO(module, S_IRWXG);
531+
ADD_INT_MACRO(module, S_IRGRP);
532+
ADD_INT_MACRO(module, S_IWGRP);
533+
ADD_INT_MACRO(module, S_IXGRP);
534+
535+
ADD_INT_MACRO(module, S_IRWXO);
536+
ADD_INT_MACRO(module, S_IROTH);
537+
ADD_INT_MACRO(module, S_IWOTH);
538+
ADD_INT_MACRO(module, S_IXOTH);
539+
540+
ADD_INT_MACRO(module, UF_NODUMP);
541+
ADD_INT_MACRO(module, UF_IMMUTABLE);
542+
ADD_INT_MACRO(module, UF_APPEND);
543+
ADD_INT_MACRO(module, UF_OPAQUE);
544+
ADD_INT_MACRO(module, UF_NOUNLINK);
545+
ADD_INT_MACRO(module, UF_COMPRESSED);
546+
ADD_INT_MACRO(module, UF_HIDDEN);
547+
ADD_INT_MACRO(module, SF_ARCHIVED);
548+
ADD_INT_MACRO(module, SF_IMMUTABLE);
549+
ADD_INT_MACRO(module, SF_APPEND);
550+
ADD_INT_MACRO(module, SF_NOUNLINK);
551+
ADD_INT_MACRO(module, SF_SNAPSHOT);
552+
553+
const char* st_constants[] = {
554+
"ST_MODE",
555+
"ST_INO",
556+
"ST_DEV",
557+
"ST_NLINK",
558+
"ST_UID",
559+
"ST_GID",
560+
"ST_SIZE",
561+
"ST_ATIME",
562+
"ST_MTIME",
563+
"ST_CTIME"
564+
};
565+
566+
for (int i = 0; i < Py_ARRAY_LENGTH(st_constants); i++) {
567+
if (PyModule_AddIntConstant(module, st_constants[i], i) < 0) {
568+
return -1;
569+
}
570+
}
571+
572+
#ifdef MS_WINDOWS
573+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_ARCHIVE);
574+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_COMPRESSED);
575+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_DEVICE);
576+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_DIRECTORY);
577+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_ENCRYPTED);
578+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_HIDDEN);
579+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_INTEGRITY_STREAM);
580+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_NORMAL);
581+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED);
582+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_NO_SCRUB_DATA);
583+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_OFFLINE);
584+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_READONLY);
585+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_REPARSE_POINT);
586+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_SPARSE_FILE);
587+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_SYSTEM);
588+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_TEMPORARY);
589+
ADD_INT_MACRO(module, FILE_ATTRIBUTE_VIRTUAL);
590+
591+
if (PyModule_AddObject(module, "IO_REPARSE_TAG_SYMLINK",
592+
PyLong_FromUnsignedLong(IO_REPARSE_TAG_SYMLINK)) < 0) {
593+
return -1;
594+
}
595+
if (PyModule_AddObject(module, "IO_REPARSE_TAG_MOUNT_POINT",
596+
PyLong_FromUnsignedLong(IO_REPARSE_TAG_MOUNT_POINT)) < 0) {
597+
return -1;
598+
}
599+
if (PyModule_AddObject(module, "IO_REPARSE_TAG_APPEXECLINK",
600+
PyLong_FromUnsignedLong(IO_REPARSE_TAG_APPEXECLINK)) < 0) {
601+
return -1;
602+
}
603+
#endif
604+
605+
return 0;
606+
}
607+
608+
609+
static PyModuleDef_Slot stat_slots[] = {
610+
{Py_mod_exec, stat_exec},
611+
{0, NULL}
612+
};
613+
614+
495615
static struct PyModuleDef statmodule = {
496616
PyModuleDef_HEAD_INIT,
497-
"_stat",
498-
module_doc,
499-
-1,
500-
stat_methods,
501-
NULL,
502-
NULL,
503-
NULL,
504-
NULL
617+
.m_name = "_stat",
618+
.m_doc = module_doc,
619+
.m_size = 0,
620+
.m_methods = stat_methods,
621+
.m_slots = stat_slots,
505622
};
506623

624+
507625
PyMODINIT_FUNC
508626
PyInit__stat(void)
509627
{
510-
PyObject *m;
511-
m = PyModule_Create(&statmodule);
512-
if (m == NULL)
513-
return NULL;
514-
515-
if (PyModule_AddIntMacro(m, S_IFDIR)) return NULL;
516-
if (PyModule_AddIntMacro(m, S_IFCHR)) return NULL;
517-
if (PyModule_AddIntMacro(m, S_IFBLK)) return NULL;
518-
if (PyModule_AddIntMacro(m, S_IFREG)) return NULL;
519-
if (PyModule_AddIntMacro(m, S_IFIFO)) return NULL;
520-
if (PyModule_AddIntMacro(m, S_IFLNK)) return NULL;
521-
if (PyModule_AddIntMacro(m, S_IFSOCK)) return NULL;
522-
if (PyModule_AddIntMacro(m, S_IFDOOR)) return NULL;
523-
if (PyModule_AddIntMacro(m, S_IFPORT)) return NULL;
524-
if (PyModule_AddIntMacro(m, S_IFWHT)) return NULL;
525-
526-
if (PyModule_AddIntMacro(m, S_ISUID)) return NULL;
527-
if (PyModule_AddIntMacro(m, S_ISGID)) return NULL;
528-
if (PyModule_AddIntMacro(m, S_ISVTX)) return NULL;
529-
if (PyModule_AddIntMacro(m, S_ENFMT)) return NULL;
530-
531-
if (PyModule_AddIntMacro(m, S_IREAD)) return NULL;
532-
if (PyModule_AddIntMacro(m, S_IWRITE)) return NULL;
533-
if (PyModule_AddIntMacro(m, S_IEXEC)) return NULL;
534-
535-
if (PyModule_AddIntMacro(m, S_IRWXU)) return NULL;
536-
if (PyModule_AddIntMacro(m, S_IRUSR)) return NULL;
537-
if (PyModule_AddIntMacro(m, S_IWUSR)) return NULL;
538-
if (PyModule_AddIntMacro(m, S_IXUSR)) return NULL;
539-
540-
if (PyModule_AddIntMacro(m, S_IRWXG)) return NULL;
541-
if (PyModule_AddIntMacro(m, S_IRGRP)) return NULL;
542-
if (PyModule_AddIntMacro(m, S_IWGRP)) return NULL;
543-
if (PyModule_AddIntMacro(m, S_IXGRP)) return NULL;
544-
545-
if (PyModule_AddIntMacro(m, S_IRWXO)) return NULL;
546-
if (PyModule_AddIntMacro(m, S_IROTH)) return NULL;
547-
if (PyModule_AddIntMacro(m, S_IWOTH)) return NULL;
548-
if (PyModule_AddIntMacro(m, S_IXOTH)) return NULL;
549-
550-
if (PyModule_AddIntMacro(m, UF_NODUMP)) return NULL;
551-
if (PyModule_AddIntMacro(m, UF_IMMUTABLE)) return NULL;
552-
if (PyModule_AddIntMacro(m, UF_APPEND)) return NULL;
553-
if (PyModule_AddIntMacro(m, UF_OPAQUE)) return NULL;
554-
if (PyModule_AddIntMacro(m, UF_NOUNLINK)) return NULL;
555-
if (PyModule_AddIntMacro(m, UF_COMPRESSED)) return NULL;
556-
if (PyModule_AddIntMacro(m, UF_HIDDEN)) return NULL;
557-
if (PyModule_AddIntMacro(m, SF_ARCHIVED)) return NULL;
558-
if (PyModule_AddIntMacro(m, SF_IMMUTABLE)) return NULL;
559-
if (PyModule_AddIntMacro(m, SF_APPEND)) return NULL;
560-
if (PyModule_AddIntMacro(m, SF_NOUNLINK)) return NULL;
561-
if (PyModule_AddIntMacro(m, SF_SNAPSHOT)) return NULL;
562-
563-
if (PyModule_AddIntConstant(m, "ST_MODE", 0)) return NULL;
564-
if (PyModule_AddIntConstant(m, "ST_INO", 1)) return NULL;
565-
if (PyModule_AddIntConstant(m, "ST_DEV", 2)) return NULL;
566-
if (PyModule_AddIntConstant(m, "ST_NLINK", 3)) return NULL;
567-
if (PyModule_AddIntConstant(m, "ST_UID", 4)) return NULL;
568-
if (PyModule_AddIntConstant(m, "ST_GID", 5)) return NULL;
569-
if (PyModule_AddIntConstant(m, "ST_SIZE", 6)) return NULL;
570-
if (PyModule_AddIntConstant(m, "ST_ATIME", 7)) return NULL;
571-
if (PyModule_AddIntConstant(m, "ST_MTIME", 8)) return NULL;
572-
if (PyModule_AddIntConstant(m, "ST_CTIME", 9)) return NULL;
573-
574-
#ifdef MS_WINDOWS
575-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_ARCHIVE)) return NULL;
576-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_COMPRESSED)) return NULL;
577-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_DEVICE)) return NULL;
578-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_DIRECTORY)) return NULL;
579-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_ENCRYPTED)) return NULL;
580-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_HIDDEN)) return NULL;
581-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_INTEGRITY_STREAM)) return NULL;
582-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_NORMAL)) return NULL;
583-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)) return NULL;
584-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_NO_SCRUB_DATA)) return NULL;
585-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_OFFLINE)) return NULL;
586-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_READONLY)) return NULL;
587-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_REPARSE_POINT)) return NULL;
588-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_SPARSE_FILE)) return NULL;
589-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_SYSTEM)) return NULL;
590-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_TEMPORARY)) return NULL;
591-
if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_VIRTUAL)) return NULL;
592-
593-
if (PyModule_AddObject(m, "IO_REPARSE_TAG_SYMLINK",
594-
PyLong_FromUnsignedLong(IO_REPARSE_TAG_SYMLINK))) return NULL;
595-
if (PyModule_AddObject(m, "IO_REPARSE_TAG_MOUNT_POINT",
596-
PyLong_FromUnsignedLong(IO_REPARSE_TAG_MOUNT_POINT))) return NULL;
597-
if (PyModule_AddObject(m, "IO_REPARSE_TAG_APPEXECLINK",
598-
PyLong_FromUnsignedLong(IO_REPARSE_TAG_APPEXECLINK))) return NULL;
599-
#endif
600-
601-
return m;
628+
return PyModuleDef_Init(&statmodule);
602629
}
603630

604631
#ifdef __cplusplus

0 commit comments

Comments
 (0)