diff options
author | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-08-22 14:48:10 +0000 |
---|---|---|
committer | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-08-22 14:48:10 +0000 |
commit | 9c038691e1aaf184066f0c355835d9e87a4e57b4 (patch) | |
tree | d9383a3708b7351474c664d1aa05b2fcdef778d2 | |
parent | 729ad0b0abc42e77515b86463abc8500506d12c9 (diff) |
* sprintf.c (rb_str_format): add RB_GC_GUARD to prevent temporary
strings from GC.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33021 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | sprintf.c | 8 |
2 files changed, 11 insertions, 2 deletions
@@ -1,3 +1,8 @@ +Mon Aug 22 23:43:33 2011 CHIKANAGA Tomoyuki <nagachika00@gmail.com> + + * sprintf.c (rb_str_format): add RB_GC_GUARD to prevent temporary + strings from GC. + Sun Aug 21 17:49:53 2011 Kazuki Tsujimoto <kazuki@callcc.net> * iseq.c (iseq_s_disasm): remove variable which is no longer used @@ -641,6 +641,7 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt) rb_raise(rb_eArgError, "%%c requires a character"); } c = rb_enc_codepoint_len(RSTRING_PTR(tmp), RSTRING_END(tmp), &n, enc); + RB_GC_GUARD(tmp); } else { c = NUM2INT(val); @@ -711,6 +712,7 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt) } CHECK(len); memcpy(&buf[blen], RSTRING_PTR(str), len); + RB_GC_GUARD(str); blen += len; if (flags&FMINUS) { CHECK(width); @@ -723,6 +725,7 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt) } } PUSH(RSTRING_PTR(str), len); + RB_GC_GUARD(str); rb_enc_associate(result, enc); } break; @@ -736,7 +739,6 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt) case 'B': case 'u': { - volatile VALUE tmp1; volatile VALUE val = GETARG(); char fbuf[32], nbuf[64], *s; const char *prefix = 0; @@ -887,7 +889,7 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt) val = rb_big_clone(val); rb_big_2comp(val); } - tmp1 = tmp = rb_big2str0(val, base, RBIGNUM_SIGN(val)); + tmp = rb_big2str0(val, base, RBIGNUM_SIGN(val)); s = RSTRING_PTR(tmp); if (*s == '-') { dots = 1; @@ -981,6 +983,7 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt) } } PUSH(s, len); + RB_GC_GUARD(tmp); CHECK(width); while (width-- > 0) { buf[blen++] = ' '; @@ -1065,6 +1068,7 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt) } sprint_exit: + RB_GC_GUARD(fmt); /* XXX - We cannot validate the number of arguments if (digit)$ style used. */ if (posarg >= 0 && nextarg < argc) { |