From 97ecab7b34aaf58f472254356afcd3d529e57401 Mon Sep 17 00:00:00 2001 From: shirosaki Date: Thu, 22 Nov 2012 14:55:32 +0000 Subject: 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 --- array.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'array.c') diff --git a/array.c b/array.c index bbe9f60e40..3e617f55aa 100644 --- a/array.c +++ b/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; -- cgit v1.2.3