@@ -4241,19 +4241,23 @@ _pickle_Pickler___init___impl(PicklerObject *self, PyObject *file,
4241
4241
self -> fast = 0 ;
4242
4242
self -> fast_nesting = 0 ;
4243
4243
self -> fast_memo = NULL ;
4244
- self -> pers_func = NULL ;
4245
- if ( _PyObject_HasAttrId (( PyObject * )self , & PyId_persistent_id )) {
4246
- self -> pers_func = _PyObject_GetAttrId (( PyObject * ) self ,
4247
- & PyId_persistent_id );
4248
- if (self -> pers_func == NULL )
4244
+
4245
+ self -> pers_func = _PyObject_GetAttrId (( PyObject * )self ,
4246
+ & PyId_persistent_id );
4247
+ if ( self -> pers_func == NULL ) {
4248
+ if (! PyErr_ExceptionMatches ( PyExc_AttributeError )) {
4249
4249
return -1 ;
4250
+ }
4251
+ PyErr_Clear ();
4250
4252
}
4251
- self -> dispatch_table = NULL ;
4252
- if ( _PyObject_HasAttrId (( PyObject * )self , & PyId_dispatch_table )) {
4253
- self -> dispatch_table = _PyObject_GetAttrId (( PyObject * ) self ,
4254
- & PyId_dispatch_table );
4255
- if (self -> dispatch_table == NULL )
4253
+
4254
+ self -> dispatch_table = _PyObject_GetAttrId (( PyObject * )self ,
4255
+ & PyId_dispatch_table );
4256
+ if ( self -> dispatch_table == NULL ) {
4257
+ if (! PyErr_ExceptionMatches ( PyExc_AttributeError )) {
4256
4258
return -1 ;
4259
+ }
4260
+ PyErr_Clear ();
4257
4261
}
4258
4262
4259
4263
return 0 ;
@@ -5208,22 +5212,24 @@ load_frozenset(UnpicklerObject *self)
5208
5212
static PyObject *
5209
5213
instantiate (PyObject * cls , PyObject * args )
5210
5214
{
5211
- PyObject * result = NULL ;
5212
- _Py_IDENTIFIER (__getinitargs__ );
5213
5215
/* Caller must assure args are a tuple. Normally, args come from
5214
5216
Pdata_poptuple which packs objects from the top of the stack
5215
5217
into a newly created tuple. */
5216
5218
assert (PyTuple_Check (args ));
5217
- if (PyTuple_GET_SIZE (args ) > 0 || !PyType_Check (cls ) ||
5218
- _PyObject_HasAttrId (cls , & PyId___getinitargs__ )) {
5219
- result = PyObject_CallObject (cls , args );
5220
- }
5221
- else {
5219
+ if (!PyTuple_GET_SIZE (args ) && PyType_Check (cls )) {
5220
+ _Py_IDENTIFIER (__getinitargs__ );
5222
5221
_Py_IDENTIFIER (__new__ );
5223
-
5224
- result = _PyObject_CallMethodIdObjArgs (cls , & PyId___new__ , cls , NULL );
5222
+ PyObject * func = _PyObject_GetAttrId (cls , & PyId___getinitargs__ );
5223
+ if (func == NULL ) {
5224
+ if (!PyErr_ExceptionMatches (PyExc_AttributeError )) {
5225
+ return NULL ;
5226
+ }
5227
+ PyErr_Clear ();
5228
+ return _PyObject_CallMethodIdObjArgs (cls , & PyId___new__ , cls , NULL );
5229
+ }
5230
+ Py_DECREF (func );
5225
5231
}
5226
- return result ;
5232
+ return PyObject_CallObject ( cls , args ) ;
5227
5233
}
5228
5234
5229
5235
static int
@@ -6679,17 +6685,14 @@ _pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file,
6679
6685
return -1 ;
6680
6686
6681
6687
self -> fix_imports = fix_imports ;
6682
- if (self -> fix_imports == -1 )
6683
- return -1 ;
6684
6688
6685
- if (_PyObject_HasAttrId ((PyObject * )self , & PyId_persistent_load )) {
6686
- self -> pers_func = _PyObject_GetAttrId ((PyObject * )self ,
6687
- & PyId_persistent_load );
6688
- if (self -> pers_func == NULL )
6689
- return 1 ;
6690
- }
6691
- else {
6692
- self -> pers_func = NULL ;
6689
+ self -> pers_func = _PyObject_GetAttrId ((PyObject * )self ,
6690
+ & PyId_persistent_load );
6691
+ if (self -> pers_func == NULL ) {
6692
+ if (!PyErr_ExceptionMatches (PyExc_AttributeError )) {
6693
+ return -1 ;
6694
+ }
6695
+ PyErr_Clear ();
6693
6696
}
6694
6697
6695
6698
self -> stack = (Pdata * )Pdata_New ();
0 commit comments