summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authornormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-01-31 02:18:58 +0000
committernormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-01-31 02:18:58 +0000
commit9b69e9fafc329aaa540d5adeb55124f020abfe3c (patch)
treec8762b5fbb780498076fb2727dcb65b4226ddb93 /test
parented28d151a38feefb9511aebec3216b1f190485f9 (diff)
time.c (time_strftime): avoid garbage in common case
strftime format strings which are dynamically-generated will benefit from avoiding garbage, here. * time.c (time_strftime): use rb_str_tmp_frozen_{acquire,release} * test/ruby/test_time.rb (test_strftime_no_hidden_garbage): new test git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57476 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test')
-rw-r--r--test/ruby/test_time.rb11
1 files changed, 11 insertions, 0 deletions
diff --git a/test/ruby/test_time.rb b/test/ruby/test_time.rb
index d3a8645024..a0d65b6495 100644
--- a/test/ruby/test_time.rb
+++ b/test/ruby/test_time.rb
@@ -1090,6 +1090,17 @@ class TestTime < Test::Unit::TestCase
assert_equal("366", t.strftime("%j"))
end
+ def test_strftime_no_hidden_garbage
+ fmt = %w(Y m d).map { |x| "%#{x}" }.join('-') # defeats optimization
+ t = Time.at(0)
+ ObjectSpace.count_objects(res = {}) # creates strings on first call
+ before = ObjectSpace.count_objects(res)[:T_STRING]
+ val = t.strftime(fmt)
+ after = ObjectSpace.count_objects(res)[:T_STRING]
+ assert_equal before + 1, after, 'only new string is the created one'
+ assert_equal '1970-01-01', val
+ end
+
def test_num_exact_error
bad = EnvUtil.labeled_class("BadValue").new
x = EnvUtil.labeled_class("Inexact") do