diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-07-24 07:38:37 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-07-24 07:38:37 +0000 |
commit | 4ab69ebbd7cef8539f687e1f948845d076461dc6 (patch) | |
tree | adbc2ce7f92b27cc3897212545afb862d7776810 /test/-ext- | |
parent | 4e58f21f798861453b08c281fae2ec3a57396ba5 (diff) |
string.c: pool only bare strings in fstring
* string.c (fstr_update_callback): pool bare strings only.
* string.c (rb_fstring): return the original string with sharing a
fstring if it has extra attributes, not the fstring itself.
[ruby-dev:49188] [Bug #11386]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51360 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/-ext-')
-rw-r--r-- | test/-ext-/string/test_fstring.rb | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/test/-ext-/string/test_fstring.rb b/test/-ext-/string/test_fstring.rb new file mode 100644 index 0000000000..3ad9a4c312 --- /dev/null +++ b/test/-ext-/string/test_fstring.rb @@ -0,0 +1,64 @@ +require 'test/unit' +require '-test-/string' + +class Test_String_Fstring < Test::Unit::TestCase + def assert_fstring(str) + fstr = Bug::String.fstring(str) + yield str + yield fstr + end + + def test_taint_shared_string + str = __method__.to_s.dup + str.taint + assert_fstring(str) {|s| assert_predicate(s, :tainted?)} + end + + def test_taint_normal_string + str = __method__.to_s * 3 + str.taint + assert_fstring(str) {|s| assert_predicate(s, :tainted?)} + end + + def test_taint_registered_tainted + str = __method__.to_s * 3 + str.taint + assert_fstring(str) {|s| assert_predicate(s, :tainted?)} + + str = __method__.to_s * 3 + assert_fstring(str) {|s| assert_not_predicate(s, :tainted?)} + end + + def test_taint_registered_untainted + str = __method__.to_s * 3 + assert_fstring(str) {|s| assert_not_predicate(s, :tainted?)} + + str = __method__.to_s * 3 + str.taint + assert_fstring(str) {|s| assert_predicate(s, :tainted?)} + end + + def test_instance_variable + str = __method__.to_s * 3 + str.instance_variable_set(:@test, 42) + str.freeze + assert_fstring(str) {|s| assert_send([s, :instance_variable_defined?, :@test])} + end + + def test_singleton_method + str = __method__.to_s * 3 + def str.foo + end + str.freeze + assert_fstring(str) {|s| assert_send([s, :respond_to?, :foo])} + end + + class S < String + end + + def test_subclass + str = S.new(__method__.to_s * 3) + str.freeze + assert_fstring(str) {|s| assert_instance_of(S, s)} + end +end |