From c8484fb3228eeac72497cd1003c2e601b767f785 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 25 Dec 2012 22:31:16 +0000 Subject: [PATCH] string.c: GC guard * string.c (rb_str_enumerate_chars): prevent shared copy from GC. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38615 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 ++++ string.c | 12 ++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 72a5e33bdd..138321497e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Wed Dec 26 07:31:14 2012 Nobuyoshi Nakada + + * string.c (rb_str_enumerate_chars): prevent shared copy from GC. + Wed Dec 26 01:31:16 2012 Keiju Ishitsuka * lib/irb/init.rb, lib/irb/context.rb: fix conf.debug_level= diff --git a/string.c b/string.c index 1e5dab37f1..e312c883e0 100644 --- a/string.c +++ b/string.c @@ -6389,6 +6389,7 @@ static VALUE rb_str_enumerate_chars(VALUE str, int wantarray) { VALUE orig = str; + VALUE substr; long i, len, n; const char *ptr; rb_encoding *enc; @@ -6421,21 +6422,24 @@ rb_str_enumerate_chars(VALUE str, int wantarray) case ENC_CODERANGE_7BIT: for (i = 0; i < len; i += n) { n = rb_enc_fast_mbclen(ptr + i, ptr + len, enc); + substr = rb_str_subseq(str, i, n); if (wantarray) - rb_ary_push(ary, rb_str_subseq(str, i, n)); + rb_ary_push(ary, substr); else - rb_yield(rb_str_subseq(str, i, n)); + rb_yield(substr); } break; default: for (i = 0; i < len; i += n) { n = rb_enc_mbclen(ptr + i, ptr + len, enc); + substr = rb_str_subseq(str, i, n); if (wantarray) - rb_ary_push(ary, rb_str_subseq(str, i, n)); + rb_ary_push(ary, substr); else - rb_yield(rb_str_subseq(str, i, n)); + rb_yield(substr); } } + RB_GC_GUARD(str); if (wantarray) return ary; else