aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2023-06-13 23:55:38 +0900
committerGitHub <noreply@github.com>2023-06-13 23:55:38 +0900
commit5a69e8bcefcb609bf02b278a19cd9bf9018cea82 (patch)
treee2472515774b3a9f22eeac3de6f6f51d977e09a0
parent91b106fe4b6473e0a1bc3a021d279ddc52bc7de6 (diff)
downloadruby-5a69e8bcefcb609bf02b278a19cd9bf9018cea82.tar.gz
Add tests to `String#byteslice` memory allocation behaviour. (#1909)
-rw-r--r--test/ruby/test_string_memory.rb55
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