diff options
author | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2023-06-13 23:55:38 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-13 23:55:38 +0900 |
commit | 5a69e8bcefcb609bf02b278a19cd9bf9018cea82 (patch) | |
tree | e2472515774b3a9f22eeac3de6f6f51d977e09a0 | |
parent | 91b106fe4b6473e0a1bc3a021d279ddc52bc7de6 (diff) | |
download | ruby-5a69e8bcefcb609bf02b278a19cd9bf9018cea82.tar.gz |
Add tests to `String#byteslice` memory allocation behaviour. (#1909)
-rw-r--r-- | test/ruby/test_string_memory.rb | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/test/ruby/test_string_memory.rb b/test/ruby/test_string_memory.rb new file mode 100644 index 0000000000..d89a1695a4 --- /dev/null +++ b/test/ruby/test_string_memory.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: false +require 'test/unit' +require 'objspace' + +class TestStringMemory < Test::Unit::TestCase + def capture_allocations(klass) + allocations = [] + + GC.start + GC.disable + generation = GC.count + + ObjectSpace.trace_object_allocations do + yield + + ObjectSpace.each_object(klass) do |instance| + allocations << instance if ObjectSpace.allocation_generation(instance) == generation + end + end + + return allocations + ensure + GC.enable + end + + def test_byteslice_prefix + string = "a" * 100_000 + + allocations = capture_allocations(String) do + string.byteslice(0, 50_000) + end + + assert_equal 1, allocations.size + end + + def test_byteslice_postfix + string = ("a" * 100_000).freeze + + allocations = capture_allocations(String) do + string.byteslice(50_000, 100_000) + end + + assert_equal 1, allocations.size + end + + def test_byteslice_postfix_twice + string = ("a" * 100_000).freeze + + allocations = capture_allocations(String) do + string.byteslice(50_000, 100_000).byteslice(25_000, 50_000) + end + + assert_equal 2, allocations.size + end +end |