diff options
author | Panu Matilainen <pmatilai@redhat.com> | 2009-10-29 12:56:18 +0200 |
---|---|---|
committer | Panu Matilainen <pmatilai@redhat.com> | 2009-10-29 12:56:18 +0200 |
commit | 121b69b39529c2b5b9557eba96fd551e5295ccbd (patch) | |
tree | 4053f7b4f26680c8de10d555819b0369fa278859 /python | |
parent | 16f9d7f4dcce8edc6458cd94ee0c7afda2c5dece (diff) | |
download | librpm-tizen-121b69b39529c2b5b9557eba96fd551e5295ccbd.tar.gz librpm-tizen-121b69b39529c2b5b9557eba96fd551e5295ccbd.tar.bz2 librpm-tizen-121b69b39529c2b5b9557eba96fd551e5295ccbd.zip |
Update module initialization to work with both Python 2.x and 3.x
- split common initialization tasks to separate functions, so that only the
details of initializing a python module object differ
- patch from David Malcolm
Diffstat (limited to 'python')
-rw-r--r-- | python/rpmbmodule.c | 61 | ||||
-rw-r--r-- | python/rpmmodule.c | 87 |
2 files changed, 121 insertions, 27 deletions
diff --git a/python/rpmbmodule.c b/python/rpmbmodule.c index 2332590f2..2a32a9572 100644 --- a/python/rpmbmodule.c +++ b/python/rpmbmodule.c @@ -7,22 +7,61 @@ static char rpmb__doc__[] = ""; -void init_rpmb(void); /* XXX eliminate gcc warning */ - -void init_rpmb(void) +/* + Do any common preliminary work before python 2 vs python 3 module creation: +*/ +static int prepareInitModule(void) { - PyObject * d, *m; + if (PyType_Ready(&spec_Type) < 0) return 0; - if (PyType_Ready(&spec_Type) < 0) return; - - m = Py_InitModule3("_rpmb", NULL, rpmb__doc__); - if (m == NULL) - return; - - d = PyModule_GetDict(m); + return 1; +} +static int initModule(PyObject *m) +{ Py_INCREF(&spec_Type); PyModule_AddObject(m, "spec", (PyObject *) &spec_Type); + return 1; +} + +#if PY_MAJOR_VERSION >= 3 +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "_rpmb", /* m_name */ + rpmb__doc__, /* m_doc */ + 0, /* m_size */ + NULL, /* m_methods */ + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; + +PyObject * PyInit__rpm(void); /* XXX eliminate gcc warning */ +PyObject * PyInit__rpm(void) +{ + PyObject *m; + + if (!prepareInitModule()) + return NULL; + m = PyModule_Create(&moduledef); + if (m == NULL || !initModule(m)) { + Py_XDECREF(m); + m = NULL; + } + return m; } +#else +void init_rpmb(void); /* XXX eliminate gcc warning */ +void init_rpmb(void) +{ + PyObject *m; + + if (!prepareInitModule()) + return; + m = Py_InitModule3("_rpmb", NULL, rpmb__doc__); + if (m) initModule(m); +} +#endif diff --git a/python/rpmmodule.c b/python/rpmmodule.c index 30572f777..5237643f7 100644 --- a/python/rpmmodule.c +++ b/python/rpmmodule.c @@ -201,35 +201,88 @@ static void addRpmTags(PyObject *module) rpmtdFree(names); } -void init_rpm(void); /* XXX eliminate gcc warning */ +/* + Do any common preliminary work before python 2 vs python 3 module creation: +*/ +static int prepareInitModule(void) +{ + if (PyType_Ready(&hdr_Type) < 0) return 0; + if (PyType_Ready(&rpmds_Type) < 0) return 0; + if (PyType_Ready(&rpmfd_Type) < 0) return 0; + if (PyType_Ready(&rpmfi_Type) < 0) return 0; + if (PyType_Ready(&rpmKeyring_Type) < 0) return 0; + if (PyType_Ready(&rpmmi_Type) < 0) return 0; + if (PyType_Ready(&rpmProblem_Type) < 0) return 0; + if (PyType_Ready(&rpmps_Type) < 0) return 0; + if (PyType_Ready(&rpmPubkey_Type) < 0) return 0; + if (PyType_Ready(&rpmtd_Type) < 0) return 0; + if (PyType_Ready(&rpmte_Type) < 0) return 0; + if (PyType_Ready(&rpmts_Type) < 0) return 0; + + return 1; +} +static int initModule(PyObject *m); + +#if PY_MAJOR_VERSION >= 3 +static int rpmModuleTraverse(PyObject *m, visitproc visit, void *arg) { + Py_VISIT(pyrpmError); + return 0; +} + +static int rpmModuleClear(PyObject *m) { + Py_CLEAR(pyrpmError); + return 0; +} +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "_rpm", /* m_name */ + rpm__doc__, /* m_doc */ + 0, /* m_size */ + rpmModuleMethods, + NULL, /* m_reload */ + rpmModuleTraverse, + rpmModuleClear, + NULL /* m_free */ +}; + +PyObject * +PyInit__rpm(void); + +PyObject * +PyInit__rpm(void) +{ + PyObject * m; + if (!prepareInitModule()) return NULL; + m = PyModule_Create(&moduledef); + initModule(m); + return m; +} +#else +void init_rpm(void); /* XXX eliminate gcc warning */ void init_rpm(void) { - PyObject * d, *m; - - if (PyType_Ready(&hdr_Type) < 0) return; - if (PyType_Ready(&rpmds_Type) < 0) return; - if (PyType_Ready(&rpmfd_Type) < 0) return; - if (PyType_Ready(&rpmfi_Type) < 0) return; - if (PyType_Ready(&rpmKeyring_Type) < 0) return; - if (PyType_Ready(&rpmmi_Type) < 0) return; - if (PyType_Ready(&rpmProblem_Type) < 0) return; - if (PyType_Ready(&rpmps_Type) < 0) return; - if (PyType_Ready(&rpmPubkey_Type) < 0) return; - if (PyType_Ready(&rpmtd_Type) < 0) return; - if (PyType_Ready(&rpmte_Type) < 0) return; - if (PyType_Ready(&rpmts_Type) < 0) return; + PyObject * m; + if (!prepareInitModule()) return; m = Py_InitModule3("_rpm", rpmModuleMethods, rpm__doc__); if (m == NULL) return; + initModule(m); +} +#endif + +/* Shared python2/3 module initialization: */ +static int initModule(PyObject *m) +{ + PyObject * d; /* * treat error to register rpm cleanup hook as fatal, tracebacks * can and will leave stale locks around if we can't clean up */ if (Py_AtExit(rpm_exithook) == -1) - return; + return 0; rpmReadConfigFiles(NULL, NULL); @@ -439,5 +492,7 @@ void init_rpm(void) REGISTER_ENUM(HEADERCONV_EXPANDFILELIST); REGISTER_ENUM(HEADERCONV_COMPRESSFILELIST); REGISTER_ENUM(HEADERCONV_RETROFIT_V3); + + return 1; } |