mirror of https://github.com/python/cpython
gh-124153: Remove `_PyType_GetModuleByDef2` private function (GH-124261)
Thank you!
This commit is contained in:
parent
2c472d36b7
commit
d7248cdbc3
|
@ -209,7 +209,6 @@ extern PyObject * _PyType_GetBases(PyTypeObject *type);
|
||||||
extern PyObject * _PyType_GetMRO(PyTypeObject *type);
|
extern PyObject * _PyType_GetMRO(PyTypeObject *type);
|
||||||
extern PyObject* _PyType_GetSubclasses(PyTypeObject *);
|
extern PyObject* _PyType_GetSubclasses(PyTypeObject *);
|
||||||
extern int _PyType_HasSubclasses(PyTypeObject *);
|
extern int _PyType_HasSubclasses(PyTypeObject *);
|
||||||
PyAPI_FUNC(PyObject *) _PyType_GetModuleByDef2(PyTypeObject *, PyTypeObject *, PyModuleDef *);
|
|
||||||
|
|
||||||
// Export for _testinternalcapi extension.
|
// Export for _testinternalcapi extension.
|
||||||
PyAPI_FUNC(PyObject *) _PyType_GetSlotWrapperNames(void);
|
PyAPI_FUNC(PyObject *) _PyType_GetSlotWrapperNames(void);
|
||||||
|
|
|
@ -2179,6 +2179,8 @@ typedef struct {
|
||||||
PyObject *default_factory;
|
PyObject *default_factory;
|
||||||
} defdictobject;
|
} defdictobject;
|
||||||
|
|
||||||
|
static PyType_Spec defdict_spec;
|
||||||
|
|
||||||
PyDoc_STRVAR(defdict_missing_doc,
|
PyDoc_STRVAR(defdict_missing_doc,
|
||||||
"__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
|
"__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\
|
||||||
if self.default_factory is None: raise KeyError((key,))\n\
|
if self.default_factory is None: raise KeyError((key,))\n\
|
||||||
|
@ -2358,23 +2360,16 @@ defdict_or(PyObject* left, PyObject* right)
|
||||||
{
|
{
|
||||||
PyObject *self, *other;
|
PyObject *self, *other;
|
||||||
|
|
||||||
// Find module state
|
int ret = PyType_GetBaseByToken(Py_TYPE(left), &defdict_spec, NULL);
|
||||||
PyTypeObject *tp = Py_TYPE(left);
|
if (ret < 0) {
|
||||||
PyObject *mod = PyType_GetModuleByDef(tp, &_collectionsmodule);
|
return NULL;
|
||||||
if (mod == NULL) {
|
|
||||||
PyErr_Clear();
|
|
||||||
tp = Py_TYPE(right);
|
|
||||||
mod = PyType_GetModuleByDef(tp, &_collectionsmodule);
|
|
||||||
}
|
}
|
||||||
assert(mod != NULL);
|
if (ret) {
|
||||||
collections_state *state = get_module_state(mod);
|
|
||||||
|
|
||||||
if (PyObject_TypeCheck(left, state->defdict_type)) {
|
|
||||||
self = left;
|
self = left;
|
||||||
other = right;
|
other = right;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
assert(PyObject_TypeCheck(right, state->defdict_type));
|
assert(PyType_GetBaseByToken(Py_TYPE(right), &defdict_spec, NULL) == 1);
|
||||||
self = right;
|
self = right;
|
||||||
other = left;
|
other = left;
|
||||||
}
|
}
|
||||||
|
@ -2454,6 +2449,7 @@ passed to the dict constructor, including keyword arguments.\n\
|
||||||
#define DEFERRED_ADDRESS(ADDR) 0
|
#define DEFERRED_ADDRESS(ADDR) 0
|
||||||
|
|
||||||
static PyType_Slot defdict_slots[] = {
|
static PyType_Slot defdict_slots[] = {
|
||||||
|
{Py_tp_token, Py_TP_USE_SPEC},
|
||||||
{Py_tp_dealloc, defdict_dealloc},
|
{Py_tp_dealloc, defdict_dealloc},
|
||||||
{Py_tp_repr, defdict_repr},
|
{Py_tp_repr, defdict_repr},
|
||||||
{Py_nb_or, defdict_or},
|
{Py_nb_or, defdict_or},
|
||||||
|
|
|
@ -122,6 +122,7 @@ get_module_state(PyObject *mod)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct PyModuleDef _decimal_module;
|
static struct PyModuleDef _decimal_module;
|
||||||
|
static PyType_Spec dec_spec;
|
||||||
|
|
||||||
static inline decimal_state *
|
static inline decimal_state *
|
||||||
get_module_state_by_def(PyTypeObject *tp)
|
get_module_state_by_def(PyTypeObject *tp)
|
||||||
|
@ -134,10 +135,16 @@ get_module_state_by_def(PyTypeObject *tp)
|
||||||
static inline decimal_state *
|
static inline decimal_state *
|
||||||
find_state_left_or_right(PyObject *left, PyObject *right)
|
find_state_left_or_right(PyObject *left, PyObject *right)
|
||||||
{
|
{
|
||||||
PyObject *mod = _PyType_GetModuleByDef2(Py_TYPE(left), Py_TYPE(right),
|
PyTypeObject *base;
|
||||||
&_decimal_module);
|
if (PyType_GetBaseByToken(Py_TYPE(left), &dec_spec, &base) != 1) {
|
||||||
assert(mod != NULL);
|
assert(!PyErr_Occurred());
|
||||||
return get_module_state(mod);
|
PyType_GetBaseByToken(Py_TYPE(right), &dec_spec, &base);
|
||||||
|
}
|
||||||
|
assert(base != NULL);
|
||||||
|
void *state = _PyType_GetModuleState(base);
|
||||||
|
assert(state != NULL);
|
||||||
|
Py_DECREF(base);
|
||||||
|
return (decimal_state *)state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -745,7 +752,7 @@ signaldict_richcompare(PyObject *v, PyObject *w, int op)
|
||||||
{
|
{
|
||||||
PyObject *res = Py_NotImplemented;
|
PyObject *res = Py_NotImplemented;
|
||||||
|
|
||||||
decimal_state *state = find_state_left_or_right(v, w);
|
decimal_state *state = get_module_state_by_def(Py_TYPE(v));
|
||||||
assert(PyDecSignalDict_Check(state, v));
|
assert(PyDecSignalDict_Check(state, v));
|
||||||
|
|
||||||
if ((SdFlagAddr(v) == NULL) || (SdFlagAddr(w) == NULL)) {
|
if ((SdFlagAddr(v) == NULL) || (SdFlagAddr(w) == NULL)) {
|
||||||
|
@ -5041,6 +5048,7 @@ static PyMethodDef dec_methods [] =
|
||||||
};
|
};
|
||||||
|
|
||||||
static PyType_Slot dec_slots[] = {
|
static PyType_Slot dec_slots[] = {
|
||||||
|
{Py_tp_token, Py_TP_USE_SPEC},
|
||||||
{Py_tp_dealloc, dec_dealloc},
|
{Py_tp_dealloc, dec_dealloc},
|
||||||
{Py_tp_getattro, PyObject_GenericGetAttr},
|
{Py_tp_getattro, PyObject_GenericGetAttr},
|
||||||
{Py_tp_traverse, dec_traverse},
|
{Py_tp_traverse, dec_traverse},
|
||||||
|
|
|
@ -5207,8 +5207,8 @@ PyType_GetModuleState(PyTypeObject *type)
|
||||||
/* Get the module of the first superclass where the module has the
|
/* Get the module of the first superclass where the module has the
|
||||||
* given PyModuleDef.
|
* given PyModuleDef.
|
||||||
*/
|
*/
|
||||||
static inline PyObject *
|
PyObject *
|
||||||
get_module_by_def(PyTypeObject *type, PyModuleDef *def)
|
PyType_GetModuleByDef(PyTypeObject *type, PyModuleDef *def)
|
||||||
{
|
{
|
||||||
assert(PyType_Check(type));
|
assert(PyType_Check(type));
|
||||||
|
|
||||||
|
@ -5241,7 +5241,7 @@ get_module_by_def(PyTypeObject *type, PyModuleDef *def)
|
||||||
Py_ssize_t n = PyTuple_GET_SIZE(mro);
|
Py_ssize_t n = PyTuple_GET_SIZE(mro);
|
||||||
for (Py_ssize_t i = 1; i < n; i++) {
|
for (Py_ssize_t i = 1; i < n; i++) {
|
||||||
PyObject *super = PyTuple_GET_ITEM(mro, i);
|
PyObject *super = PyTuple_GET_ITEM(mro, i);
|
||||||
if(!_PyType_HasFeature((PyTypeObject *)super, Py_TPFLAGS_HEAPTYPE)) {
|
if (!_PyType_HasFeature((PyTypeObject *)super, Py_TPFLAGS_HEAPTYPE)) {
|
||||||
// Static types in the MRO need to be skipped
|
// Static types in the MRO need to be skipped
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -5254,37 +5254,14 @@ get_module_by_def(PyTypeObject *type, PyModuleDef *def)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
END_TYPE_LOCK();
|
END_TYPE_LOCK();
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
PyObject *
|
if (res == NULL) {
|
||||||
PyType_GetModuleByDef(PyTypeObject *type, PyModuleDef *def)
|
|
||||||
{
|
|
||||||
PyObject *module = get_module_by_def(type, def);
|
|
||||||
if (module == NULL) {
|
|
||||||
PyErr_Format(
|
PyErr_Format(
|
||||||
PyExc_TypeError,
|
PyExc_TypeError,
|
||||||
"PyType_GetModuleByDef: No superclass of '%s' has the given module",
|
"PyType_GetModuleByDef: No superclass of '%s' has the given module",
|
||||||
type->tp_name);
|
type->tp_name);
|
||||||
}
|
}
|
||||||
return module;
|
return res;
|
||||||
}
|
|
||||||
|
|
||||||
PyObject *
|
|
||||||
_PyType_GetModuleByDef2(PyTypeObject *left, PyTypeObject *right,
|
|
||||||
PyModuleDef *def)
|
|
||||||
{
|
|
||||||
PyObject *module = get_module_by_def(left, def);
|
|
||||||
if (module == NULL) {
|
|
||||||
module = get_module_by_def(right, def);
|
|
||||||
if (module == NULL) {
|
|
||||||
PyErr_Format(
|
|
||||||
PyExc_TypeError,
|
|
||||||
"PyType_GetModuleByDef: No superclass of '%s' nor '%s' has "
|
|
||||||
"the given module", left->tp_name, right->tp_name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return module;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue