1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

iseq.c: mark parents of wrapped iseq

* iseq.c (iseqw_mark): as wrapped iseq is isolated from the call
  stack, it needs to take care of its parent and ancestors, so
  that they do not become orphans.  [ruby-core:72620] [Bug #11928]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53514 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2016-01-12 15:17:19 +00:00
parent 9efd4dbe73
commit 1b39a6e539
4 changed files with 30 additions and 0 deletions

View file

@ -1,3 +1,9 @@
Wed Jan 13 00:16:47 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* iseq.c (iseqw_mark): as wrapped iseq is isolated from the call
stack, it needs to take care of its parent and ancestors, so
that they do not become orphans. [ruby-core:72620] [Bug #11928]
Tue Jan 12 21:01:09 2016 Benoit Daloze <eregontp@gmail.com> Tue Jan 12 21:01:09 2016 Benoit Daloze <eregontp@gmail.com>
* common.mk: update URL and name for the Ruby spec suite. * common.mk: update URL and name for the Ruby spec suite.

4
iseq.c
View file

@ -711,7 +711,11 @@ rb_iseq_coverage(const rb_iseq_t *iseq)
static void static void
iseqw_mark(void *ptr) iseqw_mark(void *ptr)
{ {
const rb_iseq_t *iseq = ptr;
rb_gc_mark((VALUE)ptr); rb_gc_mark((VALUE)ptr);
while ((iseq = iseq->body->parent_iseq) != NULL) {
rb_gc_mark((VALUE)iseq);
}
} }
static size_t static size_t

14
test/ruby/bug-11928.rb Normal file
View file

@ -0,0 +1,14 @@
class Segfault
at_exit { Segfault.new.segfault }
define_method 'segfault' do
n = 11928
v = nil
i = 0
while i < n
i += 1
v = (foo rescue $!).local_variables
end
assert_equal(%i[i n v], v.sort)
end
end

View file

@ -701,6 +701,12 @@ end.join
assert_equal(%i[a b c d e f g], e.local_variables.sort) assert_equal(%i[a b c d e f g], e.local_variables.sort)
end end
def test_name_error_info_parent_iseq_mark
assert_separately(['-', File.join(__dir__, 'bug-11928.rb')], <<-'end;')
-> {require ARGV[0]}.call
end;
end
def test_output_string_encoding def test_output_string_encoding
# "\x82\xa0" in cp932 is "\u3042" (Japanese hiragana 'a') # "\x82\xa0" in cp932 is "\u3042" (Japanese hiragana 'a')
# change $stderr to force calling rb_io_write() instead of fwrite() # change $stderr to force calling rb_io_write() instead of fwrite()