@@ -39,6 +39,9 @@ def __init__(self, view, panes):
39
39
self ._current_pane = 0
40
40
self ._current_offset = 0
41
41
42
+ def close (self ):
43
+ self ._view = None
44
+
42
45
def _next_pane (self ):
43
46
self ._current_pane += 1
44
47
if self ._current_pane < len (self ._panes ):
@@ -202,6 +205,7 @@ def discard_message(self):
202
205
if self ._frame is not None :
203
206
self ._origin = self ._limit
204
207
self ._limit = - 1
208
+ self ._frame .close () # close the frame to release the reference
205
209
self ._frame = None
206
210
207
211
@@ -224,23 +228,25 @@ def clear(self):
224
228
self ._data [0 :2 ] = b"\x00 \x00 "
225
229
226
230
def write (self , b ):
227
- data = self . _data
231
+ new_data_start = 0
228
232
new_data_size = len (b )
229
- chunk_size = self ._end - self ._start
230
- max_chunk_size = self ._max_chunk_size
231
- chunk_remaining = max_chunk_size - chunk_size
232
- if new_data_size > max_chunk_size :
233
- self .write (b [:chunk_remaining ])
234
- self .chunk ()
235
- self .write (b [chunk_remaining :])
236
- return
237
- if new_data_size > chunk_remaining :
238
- self .chunk ()
239
- new_end = self ._end + new_data_size
240
- new_chunk_size = new_end - self ._start
241
- data [self ._end :new_end ] = b
242
- self ._end = new_end
243
- data [self ._header :(self ._header + 2 )] = struct_pack (">H" , new_chunk_size )
233
+ data_size = self ._end - self ._start
234
+ if data_size > new_data_size :
235
+ new_end = self ._end + new_data_size
236
+ self ._data [self ._end :new_end ] = bytearray (data_size )
237
+ while new_data_start < new_data_size :
238
+ chunk_occupied = self ._end - self ._start
239
+ chunk_remaining = self ._max_chunk_size - chunk_occupied
240
+ if chunk_remaining == 0 :
241
+ self .chunk ()
242
+ chunk_remaining = self ._max_chunk_size
243
+ chunk_write_size = min (chunk_remaining , new_data_size - new_data_start )
244
+ new_end = self ._end + chunk_write_size
245
+ new_chunk_size = new_end - self ._start
246
+ self ._data [self ._end :new_end ] = b [new_data_start :(new_data_start + chunk_write_size )]
247
+ new_data_start += chunk_write_size
248
+ self ._end = new_end
249
+ self ._data [self ._header :(self ._header + 2 )] = struct_pack (">H" , new_chunk_size )
244
250
245
251
def chunk (self ):
246
252
self ._header = self ._end
0 commit comments