Project

General

Profile

Bug #7383 ยป 0001-Fix-cache-validity-check-of-require.patch

h.shirosaki (Hiroshi Shirosaki), 11/19/2012 10:55 PM

View differences:

array.c
e.g. rb_ary_replace) and check later whether the array has been
modified from the snapshot. The snapshot is cheap, though if
something does modify the array it will pay the cost of copying
it. */
it. If Array#pop or Array#shift has been called, the array will
be still shared with the snapshot, but the array length will
differ. */
VALUE
rb_ary_shared_with_p(VALUE ary1, VALUE ary2)
{
if (!ARY_EMBED_P(ary1) && ARY_SHARED_P(ary1)
&& !ARY_EMBED_P(ary2) && ARY_SHARED_P(ary2)
&& RARRAY(ary1)->as.heap.aux.shared == RARRAY(ary2)->as.heap.aux.shared) {
if (!ARY_EMBED_P(ary1) && ARY_SHARED_P(ary1) &&
!ARY_EMBED_P(ary2) && ARY_SHARED_P(ary2) &&
RARRAY(ary1)->as.heap.aux.shared == RARRAY(ary2)->as.heap.aux.shared &&
RARRAY(ary1)->as.heap.len == RARRAY(ary2)->as.heap.len) {
return Qtrue;
}
return Qfalse;
test/ruby/test_require.rb
}
}
end
def assert_require_with_shared_array(add, del)
bug7383 = '[ruby-core:49518]'
Dir.mktmpdir {|tmp|
Dir.chdir(tmp) {
open("foo.rb", "w") {}
Dir.mkdir("a")
open(File.join("a", "bar.rb"), "w") {}
assert_in_out_err([], <<-INPUT, %w(:ok), [], bug7383)
$:.#{add} "#{tmp}"
$:.#{add} "#{tmp}/a"
require "foo"
$:.#{del}
# Expanded load path cache should be rebuilt.
begin
require "bar"
rescue LoadError
p :ok
end
INPUT
}
}
end
def test_require_with_array_pop
assert_require_with_shared_array("push", "pop")
end
def test_require_with_array_shift
assert_require_with_shared_array("unshift", "shift")
end
end
    (1-1/1)