diff --git a/tests/test_buffer.py b/tests/test_buffer.py index 3a9db68..21720ea 100644 --- a/tests/test_buffer.py +++ b/tests/test_buffer.py @@ -4,6 +4,7 @@ # ########################################### # import numpy as np +import pytest import xobjects as xo from xobjects.test_helpers import for_all_test_contexts, requires_context @@ -94,6 +95,35 @@ def test_free_simple(test_context): ch.free_string(offset) ch.check() +@for_all_test_contexts +def test_free(test_context): + class CheckFree(xo.Struct): + a = xo.Float64 + ch = CheckFree(a=5, _context=test_context) + assert ch._buffer.capacity == 8 + assert ch._buffer.chunks == [] + with pytest.raises(ValueError, match="Cannot free outside of buffer"): + ch._buffer.free(-2, 8) + with pytest.raises(ValueError, match="Cannot free outside of buffer"): + ch._buffer.free(0, 10) + with pytest.raises(ValueError, match="Cannot free outside of buffer"): + ch._buffer.free(7,2) + ch._buffer.free(0,4) + assert len(ch._buffer.chunks) == 1 + assert ch._buffer.chunks[0].start == 0 + assert ch._buffer.chunks[0].end == 4 + ch._buffer.free(0,4) # Does nothing + ch._buffer.free(2,4) # Increases free chunk + assert len(ch._buffer.chunks) == 1 + assert ch._buffer.chunks[0].start == 0 + assert ch._buffer.chunks[0].end == 6 + ch._buffer.free(7,1) + assert len(ch._buffer.chunks) == 2 + assert ch._buffer.chunks[0].start == 0 + assert ch._buffer.chunks[0].end == 6 + assert ch._buffer.chunks[1].start == 7 + assert ch._buffer.chunks[1].end == 8 + @for_all_test_contexts def test_grow(test_context): diff --git a/xobjects/context.py b/xobjects/context.py index 4ac80e7..bcd03db 100644 --- a/xobjects/context.py +++ b/xobjects/context.py @@ -472,9 +472,13 @@ def grow(self, capacity): self.capacity = newcapacity def free(self, offset, size): + if offset < 0 or offset + size > self.capacity: + raise ValueError("Cannot free outside of buffer") nch = Chunk(offset, offset + size) # insert sorted - if offset > self.chunks[-1].start: # new chuck at the end + if len(self.chunks) == 0: + self.chunks.append(nch) + elif offset > self.chunks[-1].start: # new chuck at the end self.chunks.append(nch) else: # new chuck needs to be inserted for ic, ch in enumerate(self.chunks):