зеркало из https://github.com/github/ruby.git
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:
Родитель
ff6c50709c
Коммит
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>
|
||||
|
||||
* 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
|
||||
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;
|
||||
|
|
|
@ -545,4 +545,35 @@ class TestRequire < Test::Unit::TestCase
|
|||
}
|
||||
}
|
||||
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
|
||||
|
|
Загрузка…
Ссылка в новой задаче