@@ -109,6 +109,111 @@ end
109109 Bumper. reset_buffer! (b)
110110 Bumper. reset_buffer! ()
111111
112+ rb = ResizeBuffer (1000 )
113+
114+ # Basic allocation tests for ResizeBuffer
115+ @test f (v, rb) == 9
116+ @test rb. offset == 0
117+ @test g (v, rb) == 9
118+ @test rb. offset == 0
119+
120+ @test @allocated (f (v, rb)) == 0
121+ @test @allocated (g (v, rb)) == 0
122+
123+ # Test nested allocations for ResizeBuffer
124+ @no_escape rb begin
125+ y = @alloc (Int, length (v))
126+ off1 = rb. offset
127+ @no_escape rb begin
128+ z = @alloc (Int, length (v))
129+
130+ @test pointer (z) != pointer (y)
131+ @test Int (pointer (z)) == Int (pointer (y)) + 8 * length (v)
132+ @test rb. offset == off1 + 8 * length (v)
133+ end
134+
135+ @test rb. offset == off1
136+ end
137+
138+ # Test buffer growth for ResizeBuffer
139+ @no_escape rb begin
140+ current = rb. offset
141+ x = @alloc (Int8, 500 )
142+ @test rb. offset == current + 500
143+ @test rb. max_offset == current + 500
144+ end
145+
146+ # After no_escape, offset should be reset but max_offset preserved
147+ @test rb. offset == 0
148+ @test rb. max_offset > 0
149+
150+ # Test overflow allocation (exceeding buffer size) for ResizeBuffer
151+ rb2 = ResizeBuffer (100 )
152+ @no_escape rb2 begin
153+ x = @alloc (Int8, 50 ) # Within buffer
154+ @test rb2. offset == 50
155+ @test isempty (rb2. overflow)
156+
157+ y = @alloc (Int8, 60 ) # Exceeds remaining buffer space
158+ @test rb2. offset == 110
159+ @test length (rb2. overflow) == 1
160+ end
161+
162+ # After no_escape, overflow should be cleared
163+ @test rb2. offset == 0
164+ @test isempty (rb2. overflow)
165+
166+ # Test reset_buffer! for ResizeBuffer
167+ rb3 = ResizeBuffer (100 )
168+ @no_escape rb3 begin
169+ @alloc (Int8, 50 )
170+ @test rb3. offset == 50
171+ @test rb3. max_offset == 50
172+ end
173+
174+ Bumper. reset_buffer! (rb3)
175+ @test rb3. offset == 0
176+ @test rb3. max_offset == 0
177+
178+ # Test alloc_ptr! for ResizeBuffer
179+ rb4 = ResizeBuffer (100 )
180+ @no_escape rb4 begin
181+ current = rb4. offset
182+ p = @alloc_ptr (10 )
183+ @test rb4. offset == current + 10
184+
185+ p2 = @alloc_ptr (20 )
186+ @test rb4. offset == current + 30
187+ @test Int (p2) == Int (p) + 10
188+ end
189+
190+ # Test buffer resize on next allocation after exceeding initial max_offset
191+ rb5 = ResizeBuffer (100 )
192+ @no_escape rb5 begin
193+ x = @alloc (Int8, 150 ) # Exceeds initial buffer, triggers resize
194+ @test rb5. max_offset == 150
195+ @test rb5. buf_len == 150 # Buffer was resized
196+ @test isempty (rb5. overflow) # But still fits in resized buffer
197+ end
198+
199+ # The buffer should now be empty
200+ @test rb5. offset == 0
201+ @test isempty (rb5. overflow)
202+
203+ # Test actual overflow when we exceed the resized buffer
204+ rb6 = ResizeBuffer (100 )
205+ @no_escape rb6 begin
206+ x = @alloc (Int8, 50 ) # Fits in buffer
207+ y = @alloc (Int8, 100 ) # Exceeds buffer size
208+ @test rb6. offset == 150
209+ @test rb6. max_offset == 150
210+ @test ! isempty (rb6. overflow)
211+ end
212+
213+ # After @no_escape, overflow is cleared
214+ @test rb6. offset == 0
215+ @test isempty (rb6. overflow)
216+
112217 @test_throws Exception @no_escape begin
113218 @alloc (Int, 10 )
114219 end
186291 @test default_buffer () != = with_buffer (default_buffer, SlabBuffer ())
187292 @test default_buffer (AllocBuffer) === default_buffer (AllocBuffer)
188293 @test default_buffer (AllocBuffer) != = with_buffer (() -> default_buffer (AllocBuffer), AllocBuffer ())
294+
295+ # Test default_buffer for ResizeBuffer
296+ rb_default = default_buffer (ResizeBuffer)
297+ @test rb_default isa ResizeBuffer
298+ @test default_buffer (ResizeBuffer) === rb_default
299+
300+ # Test with_buffer for ResizeBuffer
301+ rb4 = ResizeBuffer (200 )
302+ rb5 = ResizeBuffer (300 )
303+
304+ @test default_buffer (ResizeBuffer) === rb_default
305+ with_buffer (rb4) do
306+ @test default_buffer (ResizeBuffer) === rb4
307+ @test default_buffer (ResizeBuffer) != = rb_default
308+
309+ with_buffer (rb5) do
310+ @test default_buffer (ResizeBuffer) === rb5
311+ @test default_buffer (ResizeBuffer) != = rb4
312+ end
313+
314+ @test default_buffer (ResizeBuffer) === rb4
315+ end
316+ @test default_buffer (ResizeBuffer) === rb_default
317+
318+ # Test that ResizeBuffer works across different tasks
319+ @test default_buffer (ResizeBuffer) === default_buffer (ResizeBuffer)
320+ @test default_buffer (ResizeBuffer) != = fetch (@async default_buffer (ResizeBuffer))
321+ @test default_buffer (ResizeBuffer) != =
322+ fetch (Threads. @spawn default_buffer (ResizeBuffer))
189323end
0 commit comments