ruby-changes:4010
From: ko1@a...
Date: Sat, 16 Feb 2008 13:18:34 +0900 (JST)
Subject: [ruby-changes:4010] akr - Ruby:r15500 (trunk): * string.c (rb_str_sub_bang): stringize replacing hash values.
akr 2008-02-16 13:17:52 +0900 (Sat, 16 Feb 2008) New Revision: 15500 Modified files: trunk/ChangeLog trunk/string.c Log: * string.c (rb_str_sub_bang): stringize replacing hash values. (str_gsub): ditto. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/string.c?r1=15500&r2=15499&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15500&r2=15499&diff_format=u Index: ChangeLog =================================================================== --- ChangeLog (revision 15499) +++ ChangeLog (revision 15500) @@ -1,3 +1,8 @@ +Sat Feb 16 13:16:49 2008 Tanaka Akira <akr@f...> + + * string.c (rb_str_sub_bang): stringize replacing hash values. + (str_gsub): ditto. + Sat Feb 16 13:01:33 2008 NARUSE, Yui <naruse@r...> * string.c (rb_enc_strlen): add search_nonascii like character Index: string.c =================================================================== --- string.c (revision 15499) +++ string.c (revision 15500) @@ -2902,18 +2902,21 @@ match = rb_backref_get(); regs = RMATCH(match)->regs; - if (iter) { + if (iter || !NIL_P(hash)) { char *p = RSTRING_PTR(str); long len = RSTRING_LEN(str); - rb_match_busy(match); - repl = rb_obj_as_string(rb_yield(rb_reg_nth_match(0, match))); + if (iter) { + rb_match_busy(match); + repl = rb_obj_as_string(rb_yield(rb_reg_nth_match(0, match))); + } + else { + repl = rb_hash_aref(hash, rb_str_subseq(str, BEG(0), END(0) - BEG(0))); + repl = rb_obj_as_string(repl); + } str_mod_check(str, p, len); str_frozen_check(str); - rb_backref_set(match); + if (iter) rb_backref_set(match); } - else if (!NIL_P(hash)) { - repl = rb_hash_aref(hash, rb_str_subseq(str, BEG(0), END(0) - BEG(0))); - } else { repl = rb_reg_regsub(repl, str, regs, pat); } @@ -3045,19 +3048,22 @@ n++; match = rb_backref_get(); regs = RMATCH(match)->regs; - if (iter) { - rb_match_busy(match); - val = rb_obj_as_string(rb_yield(rb_reg_nth_match(0, match))); + if (iter || !NIL_P(hash)) { + if (iter) { + rb_match_busy(match); + val = rb_obj_as_string(rb_yield(rb_reg_nth_match(0, match))); + } + else { + val = rb_hash_aref(hash, rb_str_subseq(str, BEG(0), END(0) - BEG(0))); + val = rb_obj_as_string(val); + } str_mod_check(str, sp, slen); if (bang) str_frozen_check(str); if (val == dest) { /* paranoid check [ruby-dev:24827] */ rb_raise(rb_eRuntimeError, "block should not cheat"); } - rb_backref_set(match); + if (iter) rb_backref_set(match); } - else if (!NIL_P(hash)) { - val = rb_hash_aref(hash, rb_str_subseq(str, BEG(0), END(0) - BEG(0))); - } else { val = rb_reg_regsub(repl, str, regs, pat); } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/