@@ -613,6 +613,7 @@ typedef struct PicklerObject {
613613 objects to support self-referential objects
614614 pickling. */
615615 PyObject * persistent_id ; /* persistent_id() method, can be NULL */
616+ PyObject * persistent_id_attr ; /* instance attribute, can be NULL */
616617 PyObject * dispatch_table ; /* private dispatch_table, can be NULL */
617618 PyObject * reducer_override ; /* hook for invoking user-defined callbacks
618619 instead of save_global when pickling
@@ -655,6 +656,7 @@ typedef struct UnpicklerObject {
655656 size_t memo_len ; /* Number of objects in the memo */
656657
657658 PyObject * persistent_load ; /* persistent_load() method, can be NULL. */
659+ PyObject * persistent_load_attr ; /* instance attribute, can be NULL. */
658660
659661 Py_buffer buffer ;
660662 char * input_buffer ;
@@ -1108,6 +1110,7 @@ _Pickler_New(PickleState *st)
11081110
11091111 self -> memo = memo ;
11101112 self -> persistent_id = NULL ;
1113+ self -> persistent_id_attr = NULL ;
11111114 self -> dispatch_table = NULL ;
11121115 self -> reducer_override = NULL ;
11131116 self -> write = NULL ;
@@ -1606,6 +1609,7 @@ _Unpickler_New(PyObject *module)
16061609 self -> memo_size = MEMO_SIZE ;
16071610 self -> memo_len = 0 ;
16081611 self -> persistent_load = NULL ;
1612+ self -> persistent_load_attr = NULL ;
16091613 memset (& self -> buffer , 0 , sizeof (Py_buffer ));
16101614 self -> input_buffer = NULL ;
16111615 self -> input_line = NULL ;
@@ -5092,6 +5096,33 @@ Pickler_set_memo(PicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored))
50925096 return -1 ;
50935097}
50945098
5099+ static PyObject *
5100+ Pickler_getattr (PyObject * self , PyObject * name )
5101+ {
5102+ if (PyUnicode_Check (name )
5103+ && PyUnicode_EqualToUTF8 (name , "persistent_id" )
5104+ && ((PicklerObject * )self )-> persistent_id_attr )
5105+ {
5106+ return Py_NewRef (((PicklerObject * )self )-> persistent_id_attr );
5107+ }
5108+
5109+ return PyObject_GenericGetAttr (self , name );
5110+ }
5111+
5112+ static int
5113+ Pickler_setattr (PyObject * self , PyObject * name , PyObject * value )
5114+ {
5115+ if (PyUnicode_Check (name )
5116+ && PyUnicode_EqualToUTF8 (name , "persistent_id" ))
5117+ {
5118+ Py_XINCREF (value );
5119+ Py_XSETREF (((PicklerObject * )self )-> persistent_id_attr , value );
5120+ return 0 ;
5121+ }
5122+
5123+ return PyObject_GenericSetAttr (self , name , value );
5124+ }
5125+
50955126static PyMemberDef Pickler_members [] = {
50965127 {"bin" , Py_T_INT , offsetof(PicklerObject , bin )},
50975128 {"fast" , Py_T_INT , offsetof(PicklerObject , fast )},
@@ -5107,6 +5138,8 @@ static PyGetSetDef Pickler_getsets[] = {
51075138
51085139static PyType_Slot pickler_type_slots [] = {
51095140 {Py_tp_dealloc , Pickler_dealloc },
5141+ {Py_tp_getattro , Pickler_getattr },
5142+ {Py_tp_setattro , Pickler_setattr },
51105143 {Py_tp_methods , Pickler_methods },
51115144 {Py_tp_members , Pickler_members },
51125145 {Py_tp_getset , Pickler_getsets },
@@ -7566,6 +7599,33 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored
75667599 return -1 ;
75677600}
75687601
7602+ static PyObject *
7603+ Unpickler_getattr (PyObject * self , PyObject * name )
7604+ {
7605+ if (PyUnicode_Check (name )
7606+ && PyUnicode_EqualToUTF8 (name , "persistent_load" )
7607+ && ((UnpicklerObject * )self )-> persistent_load_attr )
7608+ {
7609+ return Py_NewRef (((UnpicklerObject * )self )-> persistent_load_attr );
7610+ }
7611+
7612+ return PyObject_GenericGetAttr (self , name );
7613+ }
7614+
7615+ static int
7616+ Unpickler_setattr (PyObject * self , PyObject * name , PyObject * value )
7617+ {
7618+ if (PyUnicode_Check (name )
7619+ && PyUnicode_EqualToUTF8 (name , "persistent_load" ))
7620+ {
7621+ Py_XINCREF (value );
7622+ Py_XSETREF (((UnpicklerObject * )self )-> persistent_load_attr , value );
7623+ return 0 ;
7624+ }
7625+
7626+ return PyObject_GenericSetAttr (self , name , value );
7627+ }
7628+
75697629static PyGetSetDef Unpickler_getsets [] = {
75707630 {"memo" , (getter )Unpickler_get_memo , (setter )Unpickler_set_memo },
75717631 {NULL }
@@ -7574,6 +7634,8 @@ static PyGetSetDef Unpickler_getsets[] = {
75747634static PyType_Slot unpickler_type_slots [] = {
75757635 {Py_tp_dealloc , Unpickler_dealloc },
75767636 {Py_tp_doc , (char * )_pickle_Unpickler___init____doc__ },
7637+ {Py_tp_getattro , Unpickler_getattr },
7638+ {Py_tp_setattro , Unpickler_setattr },
75777639 {Py_tp_traverse , Unpickler_traverse },
75787640 {Py_tp_clear , Unpickler_clear },
75797641 {Py_tp_methods , Unpickler_methods },
0 commit comments