bpo-40024: Add PyModule_AddType() helper function (GH-19088)
This commit is contained in:
parent
b33e52511a
commit
05e4a296ec
|
@ -441,7 +441,7 @@ state:
|
||||||
|
|
||||||
Add an object to *module* as *name*. This is a convenience function which can
|
Add an object to *module* as *name*. This is a convenience function which can
|
||||||
be used from the module's initialization function. This steals a reference to
|
be used from the module's initialization function. This steals a reference to
|
||||||
*value* on success. Return ``-1`` on error, ``0`` on success.
|
*value* on success. Return ``-1`` on error, ``0`` on success.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
|
@ -484,6 +484,16 @@ state:
|
||||||
|
|
||||||
Add a string constant to *module*.
|
Add a string constant to *module*.
|
||||||
|
|
||||||
|
.. c:function:: int PyModule_AddType(PyObject *module, PyTypeObject *type)
|
||||||
|
|
||||||
|
Add a type object to *module*.
|
||||||
|
The type object is finalized by calling internally :c:func:`PyType_Ready`.
|
||||||
|
The name of the type object is taken from the last component of
|
||||||
|
:c:member:`~PyTypeObject.tp_name` after dot.
|
||||||
|
Return ``-1`` on error, ``0`` on success.
|
||||||
|
|
||||||
|
.. versionadded:: 3.9
|
||||||
|
|
||||||
|
|
||||||
Module lookup
|
Module lookup
|
||||||
^^^^^^^^^^^^^
|
^^^^^^^^^^^^^
|
||||||
|
|
|
@ -538,6 +538,9 @@ Build and C API Changes
|
||||||
by the internal C API. Remove also ``PyThreadFrameGetter`` type.
|
by the internal C API. Remove also ``PyThreadFrameGetter`` type.
|
||||||
(Contributed by Victor Stinner in :issue:`39946`.)
|
(Contributed by Victor Stinner in :issue:`39946`.)
|
||||||
|
|
||||||
|
* The :c:func:`PyModule_AddType` function is added to help adding a type to a module.
|
||||||
|
(Contributed by Dong-hee Na in :issue:`40024`.)
|
||||||
|
|
||||||
Deprecated
|
Deprecated
|
||||||
==========
|
==========
|
||||||
|
|
||||||
|
|
|
@ -139,6 +139,10 @@ void _PyArg_Fini(void);
|
||||||
PyAPI_FUNC(int) PyModule_AddObject(PyObject *, const char *, PyObject *);
|
PyAPI_FUNC(int) PyModule_AddObject(PyObject *, const char *, PyObject *);
|
||||||
PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, const char *, long);
|
PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, const char *, long);
|
||||||
PyAPI_FUNC(int) PyModule_AddStringConstant(PyObject *, const char *, const char *);
|
PyAPI_FUNC(int) PyModule_AddStringConstant(PyObject *, const char *, const char *);
|
||||||
|
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000
|
||||||
|
/* New in 3.9 */
|
||||||
|
PyAPI_FUNC(int) PyModule_AddType(PyObject *module, PyTypeObject *type);
|
||||||
|
#endif /* Py_LIMITED_API */
|
||||||
#define PyModule_AddIntMacro(m, c) PyModule_AddIntConstant(m, #c, c)
|
#define PyModule_AddIntMacro(m, c) PyModule_AddIntConstant(m, #c, c)
|
||||||
#define PyModule_AddStringMacro(m, c) PyModule_AddStringConstant(m, #c, c)
|
#define PyModule_AddStringMacro(m, c) PyModule_AddStringConstant(m, #c, c)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Add :c:func:`PyModule_AddType` helper function: add a type to a module. Patch by Dong-hee Na.
|
|
@ -2565,21 +2565,13 @@ collections_exec(PyObject *module) {
|
||||||
&PyODict_Type,
|
&PyODict_Type,
|
||||||
&dequeiter_type,
|
&dequeiter_type,
|
||||||
&dequereviter_type,
|
&dequereviter_type,
|
||||||
&tuplegetter_type,
|
&tuplegetter_type
|
||||||
NULL,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
defdict_type.tp_base = &PyDict_Type;
|
defdict_type.tp_base = &PyDict_Type;
|
||||||
|
|
||||||
for (int i = 0; typelist[i] != NULL; i++) {
|
for (size_t i = 0; i < Py_ARRAY_LENGTH(typelist); i++) {
|
||||||
PyTypeObject *type = typelist[i];
|
if (PyModule_AddType(module, typelist[i]) < 0) {
|
||||||
if (PyType_Ready(type) < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
const char *name = _PyType_Name(type);
|
|
||||||
Py_INCREF(type);
|
|
||||||
if (PyModule_AddObject(module, name, (PyObject *)type) < 0) {
|
|
||||||
Py_DECREF(type);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1431,13 +1431,10 @@ static struct PyModuleDef _functoolsmodule = {
|
||||||
PyMODINIT_FUNC
|
PyMODINIT_FUNC
|
||||||
PyInit__functools(void)
|
PyInit__functools(void)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
PyObject *m;
|
PyObject *m;
|
||||||
const char *name;
|
|
||||||
PyTypeObject *typelist[] = {
|
PyTypeObject *typelist[] = {
|
||||||
&partial_type,
|
&partial_type,
|
||||||
&lru_cache_type,
|
&lru_cache_type
|
||||||
NULL
|
|
||||||
};
|
};
|
||||||
|
|
||||||
m = PyModule_Create(&_functoolsmodule);
|
m = PyModule_Create(&_functoolsmodule);
|
||||||
|
@ -1450,14 +1447,11 @@ PyInit__functools(void)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0 ; typelist[i] != NULL ; i++) {
|
for (size_t i = 0; i < Py_ARRAY_LENGTH(typelist); i++) {
|
||||||
if (PyType_Ready(typelist[i]) < 0) {
|
if (PyModule_AddType(m, typelist[i]) < 0) {
|
||||||
Py_DECREF(m);
|
Py_DECREF(m);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
name = _PyType_Name(typelist[i]);
|
|
||||||
Py_INCREF(typelist[i]);
|
|
||||||
PyModule_AddObject(m, name, (PyObject *)typelist[i]);
|
|
||||||
}
|
}
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1486,19 +1486,13 @@ PyInit__lzma(void)
|
||||||
if (PyModule_AddObject(m, "LZMAError", Error) == -1)
|
if (PyModule_AddObject(m, "LZMAError", Error) == -1)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (PyType_Ready(&Compressor_type) == -1)
|
if (PyModule_AddType(m, &Compressor_type) < 0) {
|
||||||
return NULL;
|
|
||||||
Py_INCREF(&Compressor_type);
|
|
||||||
if (PyModule_AddObject(m, "LZMACompressor",
|
|
||||||
(PyObject *)&Compressor_type) == -1)
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (PyType_Ready(&Decompressor_type) == -1)
|
if (PyModule_AddType(m, &Decompressor_type) < 0) {
|
||||||
return NULL;
|
|
||||||
Py_INCREF(&Decompressor_type);
|
|
||||||
if (PyModule_AddObject(m, "LZMADecompressor",
|
|
||||||
(PyObject *)&Decompressor_type) == -1)
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4724,21 +4724,13 @@ itertoolsmodule_exec(PyObject *m)
|
||||||
&groupby_type,
|
&groupby_type,
|
||||||
&_grouper_type,
|
&_grouper_type,
|
||||||
&tee_type,
|
&tee_type,
|
||||||
&teedataobject_type,
|
&teedataobject_type
|
||||||
NULL
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Py_SET_TYPE(&teedataobject_type, &PyType_Type);
|
Py_SET_TYPE(&teedataobject_type, &PyType_Type);
|
||||||
|
|
||||||
for (int i = 0; typelist[i] != NULL; i++) {
|
for (size_t i = 0; i < Py_ARRAY_LENGTH(typelist); i++) {
|
||||||
PyTypeObject *type = typelist[i];
|
if (PyModule_AddType(m, typelist[i]) < 0) {
|
||||||
if (PyType_Ready(type) < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
const char *name = _PyType_Name(type);
|
|
||||||
Py_INCREF(type);
|
|
||||||
if (PyModule_AddObject(m, name, (PyObject *)type) < 0) {
|
|
||||||
Py_DECREF(type);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -431,6 +431,7 @@ check_set_special_type_attr(PyTypeObject *type, PyObject *value, const char *nam
|
||||||
const char *
|
const char *
|
||||||
_PyType_Name(PyTypeObject *type)
|
_PyType_Name(PyTypeObject *type)
|
||||||
{
|
{
|
||||||
|
assert(type->tp_name != NULL);
|
||||||
const char *s = strrchr(type->tp_name, '.');
|
const char *s = strrchr(type->tp_name, '.');
|
||||||
if (s == NULL) {
|
if (s == NULL) {
|
||||||
s = type->tp_name;
|
s = type->tp_name;
|
||||||
|
|
|
@ -678,3 +678,22 @@ PyModule_AddStringConstant(PyObject *m, const char *name, const char *value)
|
||||||
Py_DECREF(o);
|
Py_DECREF(o);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
PyModule_AddType(PyObject *module, PyTypeObject *type)
|
||||||
|
{
|
||||||
|
if (PyType_Ready(type) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *name = _PyType_Name(type);
|
||||||
|
assert(name != NULL);
|
||||||
|
|
||||||
|
Py_INCREF(type);
|
||||||
|
if (PyModule_AddObject(module, name, (PyObject *)type) < 0) {
|
||||||
|
Py_DECREF(type);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue