Fix cache validity check of require
* array.c (rb_ary_shared_with_p): fix cache validity check. If #pop or #shift has been called against $: or $", the array will be still shared with the snapshot. We check array length for cache validity. [ruby-core:49518] [Bug #7383] * test/ruby/test_require.rb (TestRequire#test_require_with_array_pop, TestRequire#test_require_with_array_shift): add tests for above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37808 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
ff6c50709c
commit
97ecab7b34
12
ChangeLog
12
ChangeLog
@ -1,3 +1,15 @@
|
|||||||
|
Thu Nov 22 23:45:18 2012 Hiroshi Shirosaki <h.shirosaki@gmail.com>
|
||||||
|
|
||||||
|
* array.c (rb_ary_shared_with_p): fix cache validity check.
|
||||||
|
If #pop or #shift has been called against $: or $", the array will
|
||||||
|
be still shared with the snapshot. We check array length for cache
|
||||||
|
validity.
|
||||||
|
[ruby-core:49518] [Bug #7383]
|
||||||
|
|
||||||
|
* test/ruby/test_require.rb
|
||||||
|
(TestRequire#test_require_with_array_pop,
|
||||||
|
TestRequire#test_require_with_array_shift): add tests for above.
|
||||||
|
|
||||||
Thu Nov 22 21:48:48 2012 NAKAMURA Usaku <usa@ruby-lang.org>
|
Thu Nov 22 21:48:48 2012 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||||
|
|
||||||
* common.mk, win32/Makefile.sub (probes.dmyh): now be made in current
|
* common.mk, win32/Makefile.sub (probes.dmyh): now be made in current
|
||||||
|
11
array.c
11
array.c
@ -351,13 +351,16 @@ rb_ary_frozen_p(VALUE ary)
|
|||||||
e.g. rb_ary_replace) and check later whether the array has been
|
e.g. rb_ary_replace) and check later whether the array has been
|
||||||
modified from the snapshot. The snapshot is cheap, though if
|
modified from the snapshot. The snapshot is cheap, though if
|
||||||
something does modify the array it will pay the cost of copying
|
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
|
VALUE
|
||||||
rb_ary_shared_with_p(VALUE ary1, VALUE ary2)
|
rb_ary_shared_with_p(VALUE ary1, VALUE ary2)
|
||||||
{
|
{
|
||||||
if (!ARY_EMBED_P(ary1) && ARY_SHARED_P(ary1)
|
if (!ARY_EMBED_P(ary1) && ARY_SHARED_P(ary1) &&
|
||||||
&& !ARY_EMBED_P(ary2) && ARY_SHARED_P(ary2)
|
!ARY_EMBED_P(ary2) && ARY_SHARED_P(ary2) &&
|
||||||
&& RARRAY(ary1)->as.heap.aux.shared == RARRAY(ary2)->as.heap.aux.shared) {
|
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 Qtrue;
|
||||||
}
|
}
|
||||||
return Qfalse;
|
return Qfalse;
|
||||||
|
@ -545,4 +545,35 @@ class TestRequire < Test::Unit::TestCase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def assert_require_with_shared_array_modified(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_modified("push", "pop")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_require_with_array_shift
|
||||||
|
assert_require_with_shared_array_modified("unshift", "shift")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user