diff options
author | Peter Zhu <peter@peterzhu.ca> | 2021-08-26 10:06:32 -0400 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2021-10-25 13:26:23 -0400 |
commit | a5b6598192c30187b19b892af3110a46f6a70d76 (patch) | |
tree | 4620f69a10659deb6f278b36c10ec7915194573e /test/-ext- | |
parent | 6374be5a8188ff5ed2c70b9f1d76672c87a0eda7 (diff) | |
download | ruby-a5b6598192c30187b19b892af3110a46f6a70d76.tar.gz |
[Feature #18239] Implement VWA for strings
This commit adds support for embedded strings with variable capacity and
uses Variable Width Allocation to allocate strings.
Diffstat (limited to 'test/-ext-')
-rw-r--r-- | test/-ext-/string/test_capacity.rb | 37 | ||||
-rw-r--r-- | test/-ext-/string/test_rb_str_dup.rb | 6 |
2 files changed, 32 insertions, 11 deletions
diff --git a/test/-ext-/string/test_capacity.rb b/test/-ext-/string/test_capacity.rb index df59e76778..583c98fca4 100644 --- a/test/-ext-/string/test_capacity.rb +++ b/test/-ext-/string/test_capacity.rb @@ -4,13 +4,10 @@ require '-test-/string' require 'rbconfig/sizeof' class Test_StringCapacity < Test::Unit::TestCase - def capa(str) - Bug::String.capacity(str) - end - def test_capacity_embedded - size = RbConfig::SIZEOF['void*'] * 3 - 1 - assert_equal size, capa('foo') + assert_equal GC::INTERNAL_CONSTANTS[:RVALUE_SIZE] - embed_header_size - 1, capa('foo') + assert_equal max_embed_len, capa('1' * max_embed_len) + assert_equal max_embed_len, capa('1' * (max_embed_len - 1)) end def test_capacity_shared @@ -18,7 +15,8 @@ class Test_StringCapacity < Test::Unit::TestCase end def test_capacity_normal - assert_equal 128, capa('1'*128) + assert_equal max_embed_len + 1, capa('1' * (max_embed_len + 1)) + assert_equal max_embed_len + 100, capa('1' * (max_embed_len + 100)) end def test_s_new_capacity @@ -39,7 +37,10 @@ class Test_StringCapacity < Test::Unit::TestCase end def test_literal_capacity - s = "I am testing string literal capacity" + s = eval(%{ + # frozen_string_literal: true + "#{"a" * (max_embed_len + 1)}" + }) assert_equal(s.length, capa(s)) end @@ -51,9 +52,27 @@ class Test_StringCapacity < Test::Unit::TestCase end def test_capacity_fstring - s = String.new("I am testing", capacity: 1000) + s = String.new("a" * max_embed_len, capacity: 1000) s << "fstring capacity" s = -s assert_equal(s.length, capa(s)) end + + private + + def capa(str) + Bug::String.capacity(str) + end + + def embed_header_size + if GC.using_rvargc? + 2 * RbConfig::SIZEOF['void*'] + RbConfig::SIZEOF['short'] + else + 2 * RbConfig::SIZEOF['void*'] + end + end + + def max_embed_len + GC::INTERNAL_CONSTANTS[:RVARGC_MAX_ALLOCATE_SIZE] - embed_header_size - 1 + end end diff --git a/test/-ext-/string/test_rb_str_dup.rb b/test/-ext-/string/test_rb_str_dup.rb index 49b6af9598..c76a90252f 100644 --- a/test/-ext-/string/test_rb_str_dup.rb +++ b/test/-ext-/string/test_rb_str_dup.rb @@ -3,13 +3,15 @@ require '-test-/string' class Test_RbStrDup < Test::Unit::TestCase def test_nested_shared_non_frozen - str = Bug::String.rb_str_dup(Bug::String.rb_str_dup("a" * 50)) + orig_str = "a" * GC::INTERNAL_CONSTANTS[:RVARGC_MAX_ALLOCATE_SIZE] + str = Bug::String.rb_str_dup(Bug::String.rb_str_dup(orig_str)) assert_send([Bug::String, :shared_string?, str]) assert_not_send([Bug::String, :sharing_with_shared?, str], '[Bug #15792]') end def test_nested_shared_frozen - str = Bug::String.rb_str_dup(Bug::String.rb_str_dup("a" * 50).freeze) + orig_str = "a" * GC::INTERNAL_CONSTANTS[:RVARGC_MAX_ALLOCATE_SIZE] + str = Bug::String.rb_str_dup(Bug::String.rb_str_dup(orig_str).freeze) assert_send([Bug::String, :shared_string?, str]) assert_not_send([Bug::String, :sharing_with_shared?, str], '[Bug #15792]') end |