Kaydet (Commit) 04e36af9 authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka Kaydeden (comit) GitHub

bpo-31572: Get rid of using _PyObject_HasAttrId() in pickle. (#3729)

üst c872d39d
...@@ -4241,19 +4241,23 @@ _pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, ...@@ -4241,19 +4241,23 @@ _pickle_Pickler___init___impl(PicklerObject *self, PyObject *file,
self->fast = 0; self->fast = 0;
self->fast_nesting = 0; self->fast_nesting = 0;
self->fast_memo = NULL; self->fast_memo = NULL;
self->pers_func = NULL;
if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_id)) { self->pers_func = _PyObject_GetAttrId((PyObject *)self,
self->pers_func = _PyObject_GetAttrId((PyObject *)self, &PyId_persistent_id);
&PyId_persistent_id); if (self->pers_func == NULL) {
if (self->pers_func == NULL) if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
return -1; return -1;
}
PyErr_Clear();
} }
self->dispatch_table = NULL;
if (_PyObject_HasAttrId((PyObject *)self, &PyId_dispatch_table)) { self->dispatch_table = _PyObject_GetAttrId((PyObject *)self,
self->dispatch_table = _PyObject_GetAttrId((PyObject *)self, &PyId_dispatch_table);
&PyId_dispatch_table); if (self->dispatch_table == NULL) {
if (self->dispatch_table == NULL) if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
return -1; return -1;
}
PyErr_Clear();
} }
return 0; return 0;
...@@ -5208,22 +5212,24 @@ load_frozenset(UnpicklerObject *self) ...@@ -5208,22 +5212,24 @@ load_frozenset(UnpicklerObject *self)
static PyObject * static PyObject *
instantiate(PyObject *cls, PyObject *args) instantiate(PyObject *cls, PyObject *args)
{ {
PyObject *result = NULL;
_Py_IDENTIFIER(__getinitargs__);
/* Caller must assure args are a tuple. Normally, args come from /* Caller must assure args are a tuple. Normally, args come from
Pdata_poptuple which packs objects from the top of the stack Pdata_poptuple which packs objects from the top of the stack
into a newly created tuple. */ into a newly created tuple. */
assert(PyTuple_Check(args)); assert(PyTuple_Check(args));
if (PyTuple_GET_SIZE(args) > 0 || !PyType_Check(cls) || if (!PyTuple_GET_SIZE(args) && PyType_Check(cls)) {
_PyObject_HasAttrId(cls, &PyId___getinitargs__)) { _Py_IDENTIFIER(__getinitargs__);
result = PyObject_CallObject(cls, args);
}
else {
_Py_IDENTIFIER(__new__); _Py_IDENTIFIER(__new__);
PyObject *func = _PyObject_GetAttrId(cls, &PyId___getinitargs__);
result = _PyObject_CallMethodIdObjArgs(cls, &PyId___new__, cls, NULL); if (func == NULL) {
if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
return NULL;
}
PyErr_Clear();
return _PyObject_CallMethodIdObjArgs(cls, &PyId___new__, cls, NULL);
}
Py_DECREF(func);
} }
return result; return PyObject_CallObject(cls, args);
} }
static int static int
...@@ -6679,17 +6685,14 @@ _pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, ...@@ -6679,17 +6685,14 @@ _pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file,
return -1; return -1;
self->fix_imports = fix_imports; self->fix_imports = fix_imports;
if (self->fix_imports == -1)
return -1;
if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_load)) { self->pers_func = _PyObject_GetAttrId((PyObject *)self,
self->pers_func = _PyObject_GetAttrId((PyObject *)self, &PyId_persistent_load);
&PyId_persistent_load); if (self->pers_func == NULL) {
if (self->pers_func == NULL) if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
return 1; return -1;
} }
else { PyErr_Clear();
self->pers_func = NULL;
} }
self->stack = (Pdata *)Pdata_New(); self->stack = (Pdata *)Pdata_New();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment