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)
|
||
|
-
|
||