Feature #11330 ยป 0001-string.c-ensure-String-freeze-resizes-internal-buffe.patch
string.c | ||
---|---|---|
rb_define_method(rb_cString, "byteslice", rb_str_byteslice, -1);
|
||
rb_define_method(rb_cString, "scrub", str_scrub, -1);
|
||
rb_define_method(rb_cString, "scrub!", str_scrub_bang, -1);
|
||
rb_define_method(rb_cString, "freeze", rb_obj_freeze, 0);
|
||
rb_define_method(rb_cString, "freeze", rb_str_freeze, 0);
|
||
rb_define_method(rb_cString, "to_i", rb_str_to_i, -1);
|
||
rb_define_method(rb_cString, "to_f", rb_str_to_f, 0);
|
test/ruby/test_optimization.rb | ||
---|---|---|
require 'test/unit'
|
||
require 'objspace'
|
||
class TestRubyOptimization < Test::Unit::TestCase
|
||
... | ... | |
assert_redefine_method('String', 'freeze', 'assert_nil "foo".freeze')
|
||
end
|
||
def test_string_freeze_saves_memory
|
||
n = 16384
|
||
data = '.'.freeze
|
||
r, w = IO.pipe
|
||
w.write data
|
||
s = r.readpartial(n, '')
|
||
assert_operator ObjectSpace.memsize_of(s), :>=, n,
|
||
'IO buffer NOT resized prematurely because will likely be reused'
|
||
s.freeze
|
||
assert_equal ObjectSpace.memsize_of(data), ObjectSpace.memsize_of(s),
|
||
'buffer resized on freeze since it cannot be written to again'
|
||
ensure
|
||
r.close if r
|
||
w.close if w
|
||
end
|
||
def test_string_eq_neq
|
||
%w(== !=).each do |m|
|
||
assert_redefine_method('String', m, <<-end)
|
||
-
|