Skip to content

Commit 7b9cf13

Browse files
Rewrite code for 3.13.
1 parent 39e8192 commit 7b9cf13

File tree

3 files changed

+25
-13
lines changed

3 files changed

+25
-13
lines changed

Include/internal/pycore_typeobject.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ extern PyObject * _PyType_GetMRO(PyTypeObject *type);
199199
extern PyObject* _PyType_GetSubclasses(PyTypeObject *);
200200
extern int _PyType_HasSubclasses(PyTypeObject *);
201201
PyAPI_FUNC(PyObject *) _PyType_GetModuleByDef2(PyTypeObject *, PyTypeObject *, PyModuleDef *);
202+
PyAPI_FUNC(PyObject *) _PyType_GetModuleByDef3(PyTypeObject *, PyTypeObject *, PyTypeObject *, PyModuleDef *);
202203

203204
// PyType_Ready() must be called if _PyType_IsReady() is false.
204205
// See also the Py_TPFLAGS_READY flag.

Modules/_decimal/_decimal.c

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -143,19 +143,10 @@ find_state_left_or_right(PyObject *left, PyObject *right)
143143
static inline decimal_state *
144144
find_state_ternary(PyObject *left, PyObject *right, PyObject *modulus)
145145
{
146-
PyTypeObject *base;
147-
if (PyType_GetBaseByToken(Py_TYPE(left), &dec_spec, &base) != 1) {
148-
assert(!PyErr_Occurred());
149-
if (PyType_GetBaseByToken(Py_TYPE(right), &dec_spec, &base) != 1) {
150-
assert(!PyErr_Occurred());
151-
PyType_GetBaseByToken(Py_TYPE(modulus), &dec_spec, &base);
152-
}
153-
}
154-
assert(base != NULL);
155-
void *state = _PyType_GetModuleState(base);
156-
assert(state != NULL);
157-
Py_DECREF(base);
158-
return (decimal_state *)state;
146+
PyObject *mod = _PyType_GetModuleByDef3(Py_TYPE(left), Py_TYPE(right), Py_TYPE(modulus),
147+
&_decimal_module);
148+
assert(mod != NULL);
149+
return get_module_state(mod);
159150
}
160151

161152

Objects/typeobject.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5038,6 +5038,26 @@ _PyType_GetModuleByDef2(PyTypeObject *left, PyTypeObject *right,
50385038
return module;
50395039
}
50405040

5041+
PyObject *
5042+
_PyType_GetModuleByDef3(PyTypeObject *left, PyTypeObject *right, PyTypeObject *third,
5043+
PyModuleDef *def)
5044+
{
5045+
PyObject *module = get_module_by_def(left, def);
5046+
if (module == NULL) {
5047+
module = get_module_by_def(right, def);
5048+
if (module == NULL) {
5049+
module = get_module_by_def(third, def);
5050+
if (module == NULL) {
5051+
PyErr_Format(
5052+
PyExc_TypeError,
5053+
"PyType_GetModuleByDef: No superclass of '%s', '%s' nor '%s' has "
5054+
"the given module", left->tp_name, right->tp_name, third->tp_name);
5055+
}
5056+
}
5057+
}
5058+
return module;
5059+
}
5060+
50415061
void *
50425062
PyObject_GetTypeData(PyObject *obj, PyTypeObject *cls)
50435063
{

0 commit comments

Comments
 (0)