bpo-1635741: Port grp and pwd to multiphase initialization by tiran · Pull Request #23360 · python/cpython
#define modulestate_global get_pwd_state(PyState_FindModule(&pwdmodule))
static struct PyModuleDef pwdmodule;
#define DEFAULT_BUFFER_SIZE 1024
static PyObject * mkpwent(struct passwd *p) mkpwent(PyObject *module, struct passwd *p) { int setIndex = 0; PyObject *v = PyStructSequence_New(modulestate_global->StructPwdType); PyObject *v = PyStructSequence_New(get_pwd_state(module)->StructPwdType); if (v == NULL) return NULL;
static int pwdmodule_exec(PyObject *module) { pwdmodulestate *state = get_pwd_state(module);
state->StructPwdType = PyStructSequence_NewType(&struct_pwd_type_desc); if (state->StructPwdType == NULL) { return -1; } if (PyModule_AddType(module, state->StructPwdType) < 0) { return -1; } return 0; }
static PyModuleDef_Slot pwdmodule_slots[] = { {Py_mod_exec, pwdmodule_exec}, {0, NULL} };
static int pwdmodule_traverse(PyObject *m, visitproc visit, void *arg) { Py_VISIT(get_pwd_state(m)->StructPwdType); return 0;
static struct PyModuleDef pwdmodule = { PyModuleDef_HEAD_INIT, "pwd", pwd__doc__, sizeof(pwdmodulestate), pwd_methods, NULL, pwdmodule_traverse, pwdmodule_clear, pwdmodule_free, .m_name = "pwd", .m_doc = pwd__doc__, .m_size = sizeof(pwdmodulestate), .m_methods = pwd_methods, .m_slots = pwdmodule_slots, .m_traverse = pwdmodule_traverse, .m_clear = pwdmodule_clear, .m_free = pwdmodule_free, };
PyMODINIT_FUNC PyInit_pwd(void) { PyObject *m; if ((m = PyState_FindModule(&pwdmodule)) != NULL) { Py_INCREF(m); return m; } if ((m = PyModule_Create(&pwdmodule)) == NULL) return NULL;
pwdmodulestate *state = PyModule_GetState(m); state->StructPwdType = PyStructSequence_NewType(&struct_pwd_type_desc); if (state->StructPwdType == NULL) { return NULL; } Py_INCREF(state->StructPwdType); PyModule_AddObject(m, "struct_passwd", (PyObject *) state->StructPwdType); return m; return PyModuleDef_Init(&pwdmodule); }