}
}
+ // Cache __reduce__ from PyBaseObject_Type object
+ PyObject *baseobj_dict = _PyType_GetDict(&PyBaseObject_Type);
+ PyObject *baseobj_reduce = PyDict_GetItemWithError(baseobj_dict, &_Py_ID(__reduce__));
+ if (baseobj_reduce == NULL && PyErr_Occurred()) {
+ return _PyStatus_ERR("Can't get __reduce__ from base object");
+ }
+ _Py_INTERP_CACHED_OBJECT(interp, objreduce) = baseobj_reduce;
+
// Must be after static types are initialized
if (_Py_initialize_generic(interp) < 0) {
return _PyStatus_ERR("Can't initialize generic types");
object___reduce_ex___impl(PyObject *self, int protocol)
/*[clinic end generated code: output=2e157766f6b50094 input=f326b43fb8a4c5ff]*/
{
-#define objreduce \
- (_Py_INTERP_CACHED_OBJECT(_PyInterpreterState_GET(), objreduce))
- PyObject *reduce, *res;
-
- if (objreduce == NULL) {
- PyObject *dict = lookup_tp_dict(&PyBaseObject_Type);
- objreduce = PyDict_GetItemWithError(dict, &_Py_ID(__reduce__));
- if (objreduce == NULL && PyErr_Occurred()) {
- return NULL;
- }
- }
-
+ PyObject *reduce;
if (PyObject_GetOptionalAttr(self, &_Py_ID(__reduce__), &reduce) < 0) {
return NULL;
}
Py_DECREF(reduce);
return NULL;
}
- override = (clsreduce != objreduce);
+
+ PyInterpreterState *interp = _PyInterpreterState_GET();
+ override = (clsreduce != _Py_INTERP_CACHED_OBJECT(interp, objreduce));
Py_DECREF(clsreduce);
if (override) {
- res = _PyObject_CallNoArgs(reduce);
+ PyObject *res = _PyObject_CallNoArgs(reduce);
Py_DECREF(reduce);
return res;
}
}
return _common_reduce(self, protocol);
-#undef objreduce
}
static PyObject *