summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-02-16 04:17:52 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-02-16 04:17:52 +0000
commit4181a9e9df56e6001bacc268500b1b90c4dc1fff (patch)
tree9d94dcf22c2d41598379d5c438b2a0a76818ca8f
parent52d59a95fe1361d211ed0a58388b2412d8ce8c26 (diff)
downloadruby-4181a9e9df56e6001bacc268500b1b90c4dc1fff.tar.gz
ruby-4181a9e9df56e6001bacc268500b1b90c4dc1fff.tar.xz
ruby-4181a9e9df56e6001bacc268500b1b90c4dc1fff.zip
* string.c (rb_str_sub_bang): stringize replacing hash values.
(str_gsub): ditto. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@15500 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--string.c34
2 files changed, 25 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index f161abcec..4c3c34972 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sat Feb 16 13:16:49 2008 Tanaka Akira <akr@fsij.org>
+
+ * string.c (rb_str_sub_bang): stringize replacing hash values.
+ (str_gsub): ditto.
+
Sat Feb 16 13:01:33 2008 NARUSE, Yui <naruse@ruby-lang.org>
* string.c (rb_enc_strlen): add search_nonascii like character
diff --git a/string.c b/string.c
index d59a5d199..4fcdd52cb 100644
--- a/string.c
+++ b/string.c
@@ -2902,17 +2902,20 @@ rb_str_sub_bang(int argc, VALUE *argv, VALUE str)
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);
- }
- else if (!NIL_P(hash)) {
- repl = rb_hash_aref(hash, rb_str_subseq(str, BEG(0), END(0) - BEG(0)));
+ if (iter) rb_backref_set(match);
}
else {
repl = rb_reg_regsub(repl, str, regs, pat);
@@ -3045,18 +3048,21 @@ str_gsub(int argc, VALUE *argv, VALUE str, int bang)
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);
- }
- else if (!NIL_P(hash)) {
- val = rb_hash_aref(hash, rb_str_subseq(str, BEG(0), END(0) - BEG(0)));
+ if (iter) rb_backref_set(match);
}
else {
val = rb_reg_regsub(repl, str, regs, pat);