From 446a02fad9ad2aa017ceaba6181191354800af7d Mon Sep 17 00:00:00 2001 From: Virgil Date: Fri, 3 Apr 2026 19:40:03 +0000 Subject: [PATCH] feat(scope): add buffer close helper for lifecycle symmetry Co-Authored-By: Virgil --- buffer.go | 9 +++++++++ buffer_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/buffer.go b/buffer.go index ca31786..eadfde0 100644 --- a/buffer.go +++ b/buffer.go @@ -95,6 +95,15 @@ func (b *Buffer) CopyFrom(src []byte) int { return copied } +// Close releases the buffer and implements io.Closer. +// +// buffer := NewBuffer(16) +// defer buffer.Close() +func (b *Buffer) Close() error { + b.Free() + return nil +} + // Bytes returns the mutable byte slice backed by the buffer memory. // // buffer := NewBuffer(4) diff --git a/buffer_test.go b/buffer_test.go index 9d23059..7c3aa44 100644 --- a/buffer_test.go +++ b/buffer_test.go @@ -54,6 +54,40 @@ func TestBufferDoubleFreePanics(t *testing.T) { }) } +func TestBufferCloseReleasesMemory(t *testing.T) { + t.Parallel() + + buffer := NewBuffer(4) + if err := buffer.Close(); err != nil { + t.Fatalf("expected close to return nil, got %v", err) + } + if !buffer.IsFreed() { + t.Fatal("expected buffer to be freed by Close") + } +} + +func TestBufferClosePanicsOnDoubleClose(t *testing.T) { + t.Parallel() + + buffer := NewBuffer(1) + if err := buffer.Close(); err != nil { + t.Fatalf("expected close to return nil, got %v", err) + } + + assertPanics(t, "double-free", func() { + _ = buffer.Close() + }) +} + +func TestBufferCloseNil(t *testing.T) { + t.Parallel() + + var buffer *Buffer + if err := buffer.Close(); err != nil { + t.Fatalf("expected nil buffer close to return nil, got %v", err) + } +} + func TestBufferUseAfterFreePanics(t *testing.T) { t.Parallel()