@@ -39,6 +39,9 @@ def __init__(self, view, panes):
3939 self ._current_pane = 0
4040 self ._current_offset = 0
4141
42+ def close (self ):
43+ self ._view = None
44+
4245 def _next_pane (self ):
4346 self ._current_pane += 1
4447 if self ._current_pane < len (self ._panes ):
@@ -206,6 +209,7 @@ def discard_message(self):
206209 self ._frame .close ()
207210 self ._origin = self ._limit
208211 self ._limit = - 1
212+ self ._frame .close () # close the frame to release the reference
209213 self ._frame = None
210214
211215
@@ -228,23 +232,25 @@ def clear(self):
228232 self ._data [0 :2 ] = b"\x00 \x00 "
229233
230234 def write (self , b ):
231- data = self . _data
235+ new_data_start = 0
232236 new_data_size = len (b )
233- chunk_size = self ._end - self ._start
234- max_chunk_size = self ._max_chunk_size
235- chunk_remaining = max_chunk_size - chunk_size
236- if new_data_size > max_chunk_size :
237- self .write (b [:chunk_remaining ])
238- self .chunk ()
239- self .write (b [chunk_remaining :])
240- return
241- if new_data_size > chunk_remaining :
242- self .chunk ()
243- new_end = self ._end + new_data_size
244- new_chunk_size = new_end - self ._start
245- data [self ._end :new_end ] = b
246- self ._end = new_end
247- data [self ._header :(self ._header + 2 )] = struct_pack (">H" , new_chunk_size )
237+ data_size = self ._end - self ._start
238+ if data_size > new_data_size :
239+ new_end = self ._end + new_data_size
240+ self ._data [self ._end :new_end ] = bytearray (data_size )
241+ while new_data_start < new_data_size :
242+ chunk_occupied = self ._end - self ._start
243+ chunk_remaining = self ._max_chunk_size - chunk_occupied
244+ if chunk_remaining == 0 :
245+ self .chunk ()
246+ chunk_remaining = self ._max_chunk_size
247+ chunk_write_size = min (chunk_remaining , new_data_size - new_data_start )
248+ new_end = self ._end + chunk_write_size
249+ new_chunk_size = new_end - self ._start
250+ self ._data [self ._end :new_end ] = b [new_data_start :(new_data_start + chunk_write_size )]
251+ new_data_start += chunk_write_size
252+ self ._end = new_end
253+ self ._data [self ._header :(self ._header + 2 )] = struct_pack (">H" , new_chunk_size )
248254
249255 def chunk (self ):
250256 self ._header = self ._end
0 commit comments