@@ -286,8 +286,8 @@ class ShareableList:
286286 _alignment = 8
287287 _back_transforms_mapping = {
288288 0 : lambda value : value , # int, float, bool
289- 1 : lambda value : value .rstrip ( b' \x00 ' ). decode (_encoding ), # str
290- 2 : lambda value : value . rstrip ( b' \x00 ' ), # bytes
289+ 1 : lambda value : value .decode (_encoding ), # str
290+ 2 : lambda value : value , # bytes
291291 3 : lambda _value : None , # None
292292 }
293293
@@ -326,6 +326,15 @@ def __init__(self, sequence=None, *, name=None):
326326 for fmt in _formats :
327327 offset += self ._alignment if fmt [- 1 ] != "s" else int (fmt [:- 1 ])
328328 self ._allocated_offsets .append (offset )
329+ _stored_formats = []
330+ for item , fmt in zip (sequence , _formats ):
331+ if isinstance (item , (str , bytes )):
332+ encoded = (item .encode (_encoding )
333+ if isinstance (item , str ) else item )
334+ _stored_formats .append ("%ds" % len (encoded ))
335+ else :
336+ _stored_formats .append (fmt )
337+
329338 _recreation_codes = [
330339 self ._extract_recreation_code (item ) for item in sequence
331340 ]
@@ -359,7 +368,7 @@ def __init__(self, sequence=None, *, name=None):
359368 self ._format_packing_metainfo ,
360369 self .shm .buf ,
361370 self ._offset_packing_formats ,
362- * (v .encode (_enc ) for v in _formats )
371+ * (v .encode (_enc ) for v in _stored_formats )
363372 )
364373 struct .pack_into (
365374 self ._format_back_transform_codes ,
@@ -459,6 +468,7 @@ def __setitem__(self, position, value):
459468
460469 if not isinstance (value , (str , bytes )):
461470 new_format = self ._types_mapping [type (value )]
471+ pack_format = new_format
462472 encoded_value = value
463473 else :
464474 allocated_length = self ._allocated_offsets [position + 1 ] - item_offset
@@ -467,19 +477,17 @@ def __setitem__(self, position, value):
467477 if isinstance (value , str ) else value )
468478 if len (encoded_value ) > allocated_length :
469479 raise ValueError ("bytes/str item exceeds available storage" )
470- if current_format [- 1 ] == "s" :
471- new_format = current_format
472- else :
473- new_format = self ._types_mapping [str ] % (
474- allocated_length ,
475- )
480+ # Allocated-length format.
481+ pack_format = "%ds" % allocated_length
482+ # Actual-length format.
483+ new_format = "%ds" % len (encoded_value )
476484
477485 self ._set_packing_format_and_transform (
478486 position ,
479487 new_format ,
480488 value
481489 )
482- struct .pack_into (new_format , self .shm .buf , offset , encoded_value )
490+ struct .pack_into (pack_format , self .shm .buf , offset , encoded_value )
483491
484492 def __reduce__ (self ):
485493 return partial (self .__class__ , name = self .shm .name ), ()
0 commit comments