@@ -244,6 +244,30 @@ def persistent_load(subself, pid):
244244 unpickler = PersUnpickler (io .BytesIO (self .dumps ('abc' , proto )))
245245 self .assertEqual (unpickler .load (), 'abc' )
246246
247+ def test_pickler_instance_attribute (self ):
248+ for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
249+ f = io .BytesIO ()
250+ pickler = self .pickler (f , proto )
251+ called = []
252+ def persistent_id (obj ):
253+ called .append (obj )
254+ return obj
255+ pickler .persistent_id = persistent_id
256+ pickler .dump ('abc' )
257+ self .assertEqual (called , ['abc' ])
258+ self .assertEqual (self .loads (f .getvalue ()), 'abc' )
259+
260+ def test_unpickler_instance_attribute (self ):
261+ for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
262+ unpickler = self .unpickler (io .BytesIO (self .dumps ('abc' , proto )))
263+ called = []
264+ def persistent_load (pid ):
265+ called .append (pid )
266+ return pid
267+ unpickler .persistent_load = persistent_load
268+ self .assertEqual (unpickler .load (), 'abc' )
269+ self .assertEqual (called , ['abc' ])
270+
247271class PyPicklerUnpicklerObjectTests (AbstractPicklerUnpicklerObjectTests , unittest .TestCase ):
248272
249273 pickler_class = pickle ._Pickler
@@ -368,17 +392,20 @@ class SizeofTests(unittest.TestCase):
368392
369393 def test_pickler (self ):
370394 basesize = support .calcobjsize ('6P2n3i2n3i2P' )
395+ P = struct .calcsize ('P' )
371396 p = _pickle .Pickler (io .BytesIO ())
372397 self .assertEqual (object .__sizeof__ (p ), basesize )
373398 MT_size = struct .calcsize ('3nP0n' )
374399 ME_size = struct .calcsize ('Pn0P' )
375400 check = self .check_sizeof
376401 check (p , basesize +
402+ 2 * P + # Managed dict
377403 MT_size + 8 * ME_size + # Minimal memo table size.
378404 sys .getsizeof (b'x' * 4096 )) # Minimal write buffer size.
379405 for i in range (6 ):
380406 p .dump (chr (i ))
381407 check (p , basesize +
408+ 2 * P + # Managed dict
382409 MT_size + 32 * ME_size + # Size of memo table required to
383410 # save references to 6 objects.
384411 0 ) # Write buffer is cleared after every dump().
@@ -395,6 +422,7 @@ def test_unpickler(self):
395422 encoding = encoding , errors = errors )
396423 self .assertEqual (object .__sizeof__ (u ), basesize )
397424 check (u , basesize +
425+ 2 * P + # Managed dict
398426 32 * P + # Minimal memo table size.
399427 len (encoding ) + 1 + len (errors ) + 1 )
400428
@@ -404,7 +432,7 @@ def check_unpickler(data, memo_size, marks_size):
404432 u = unpickler (io .BytesIO (dump ),
405433 encoding = 'ASCII' , errors = 'strict' )
406434 u .load ()
407- check (u , stdsize + memo_size * P + marks_size * n )
435+ check (u , stdsize + 2 * P + memo_size * P + marks_size * n )
408436
409437 check_unpickler (0 , 32 , 0 )
410438 # 20 is minimal non-empty mark stack size.
@@ -427,7 +455,7 @@ def recurse(deep):
427455 u = unpickler (io .BytesIO (pickle .dumps ('a' , 0 )),
428456 encoding = 'ASCII' , errors = 'strict' )
429457 u .load ()
430- check (u , stdsize + 32 * P + 2 + 1 )
458+ check (u , stdsize + 2 * P + 32 * P + 2 + 1 )
431459
432460
433461ALT_IMPORT_MAPPING = {
0 commit comments