[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]