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

ruby-changes:50621

From: nobu <ko1@a...>
Date: Fri, 16 Mar 2018 22:37:53 +0900 (JST)
Subject: [ruby-changes:50621] nobu:r62779 (trunk): re.c: do not escape terminator in Regexp.union

nobu	2018-03-16 22:37:44 +0900 (Fri, 16 Mar 2018)

  New Revision: 62779

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=62779

  Log:
    re.c: do not escape terminator in Regexp.union
    
    * re.c (rb_reg_str_with_term): change terminator.
    
    * re.c (rb_reg_s_union): terminator in source string does not need
      to be escaped.  terminators are outside of regexp source itself.
      [ruby-core:86149] [Bug #14608]

  Modified files:
    trunk/re.c
    trunk/test/ruby/test_regexp.rb
Index: test/ruby/test_regexp.rb
===================================================================
--- test/ruby/test_regexp.rb	(revision 62778)
+++ test/ruby/test_regexp.rb	(revision 62779)
@@ -90,6 +90,11 @@ class TestRegexp < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_regexp.rb#L90
     rescue ArgumentError
       :ok
     end
+    re = Regexp.union(/\//, "")
+    re2 = eval(re.inspect)
+    assert_equal(re.to_s, re2.to_s)
+    assert_equal(re.source, re2.source)
+    assert_equal(re, re2)
   end
 
   def test_word_boundary
Index: re.c
===================================================================
--- re.c	(revision 62778)
+++ re.c	(revision 62779)
@@ -351,7 +351,7 @@ rb_reg_check(VALUE re) https://github.com/ruby/ruby/blob/trunk/re.c#L351
 
 static void
 rb_reg_expr_str(VALUE str, const char *s, long len,
-	rb_encoding *enc, rb_encoding *resenc)
+		rb_encoding *enc, rb_encoding *resenc, int term)
 {
     const char *p, *pend;
     int cr = ENC_CODERANGE_UNKNOWN;
@@ -372,7 +372,7 @@ rb_reg_expr_str(VALUE str, const char *s https://github.com/ruby/ruby/blob/trunk/re.c#L372
 		    break;
 		}
 	    }
-	    else if (c != '/' && rb_enc_isprint(c, enc)) {
+	    else if (c != term && rb_enc_isprint(c, enc)) {
 		p += clen;
 	    }
 	    else {
@@ -399,11 +399,6 @@ rb_reg_expr_str(VALUE str, const char *s https://github.com/ruby/ruby/blob/trunk/re.c#L399
 		p += n;
 		continue;
 	    }
-	    else if (c == '/') {
-		char c = '\\';
-		rb_str_buf_cat(str, &c, 1);
-		rb_str_buf_cat(str, p, clen);
-	    }
 	    else if (c == -1) {
 		clen = rb_enc_precise_mbclen(p, pend, enc);
 		if (!MBCLEN_CHARFOUND_P(clen)) {
@@ -420,6 +415,11 @@ rb_reg_expr_str(VALUE str, const char *s https://github.com/ruby/ruby/blob/trunk/re.c#L415
 		    rb_str_buf_cat(str, p, clen);
 		}
 	    }
+	    else if (c == term) {
+		char c = '\\';
+		rb_str_buf_cat(str, &c, 1);
+		rb_str_buf_cat(str, p, clen);
+	    }
 	    else if (rb_enc_isprint(c, enc)) {
 		rb_str_buf_cat(str, p, clen);
 	    }
@@ -452,7 +452,7 @@ rb_reg_desc(const char *s, long len, VAL https://github.com/ruby/ruby/blob/trunk/re.c#L452
     else {
 	rb_enc_associate(str, rb_usascii_encoding());
     }
-    rb_reg_expr_str(str, s, len, enc, resenc);
+    rb_reg_expr_str(str, s, len, enc, resenc, '/');
     rb_str_buf_cat2(str, "/");
     if (re) {
 	char opts[4];
@@ -513,6 +513,7 @@ rb_reg_inspect(VALUE re) https://github.com/ruby/ruby/blob/trunk/re.c#L513
     return rb_reg_desc(RREGEXP_SRC_PTR(re), RREGEXP_SRC_LEN(re), re);
 }
 
+static VALUE rb_reg_str_with_term(VALUE re, int term);
 
 /*
  *  call-seq:
@@ -537,6 +538,12 @@ rb_reg_inspect(VALUE re) https://github.com/ruby/ruby/blob/trunk/re.c#L538
 static VALUE
 rb_reg_to_s(VALUE re)
 {
+    return rb_reg_str_with_term(re, '/');
+}
+
+static VALUE
+rb_reg_str_with_term(VALUE re, int term)
+{
     int options, opt;
     const int embeddable = ONIG_OPTION_MULTILINE|ONIG_OPTION_IGNORECASE|ONIG_OPTION_EXTEND;
     long len;
@@ -615,7 +622,7 @@ rb_reg_to_s(VALUE re) https://github.com/ruby/ruby/blob/trunk/re.c#L622
 
     rb_str_buf_cat2(str, ":");
     if (rb_enc_asciicompat(enc)) {
-	rb_reg_expr_str(str, (char*)ptr, len, enc, NULL);
+	rb_reg_expr_str(str, (char*)ptr, len, enc, NULL, term);
 	rb_str_buf_cat2(str, ")");
     }
     else {
@@ -635,7 +642,7 @@ rb_reg_to_s(VALUE re) https://github.com/ruby/ruby/blob/trunk/re.c#L642
 	memcpy(paren, s, n);
 	rb_str_resize(str, RSTRING_LEN(str) - n);
 
-	rb_reg_expr_str(str, (char*)ptr, len, enc, NULL);
+	rb_reg_expr_str(str, (char*)ptr, len, enc, NULL, term);
 	rb_str_buf_cat(str, paren, n);
     }
     rb_enc_copy(str, re);
@@ -664,7 +671,7 @@ rb_enc_reg_error_desc(const char *s, lon https://github.com/ruby/ruby/blob/trunk/re.c#L671
 
     rb_enc_associate(desc, enc);
     rb_str_buf_cat2(desc, ": /");
-    rb_reg_expr_str(desc, s, len, enc, resenc);
+    rb_reg_expr_str(desc, s, len, enc, resenc, '/');
     opts[0] = '/';
     option_to_str(opts + 1, options);
     rb_str_buf_cat2(desc, opts);
@@ -3651,7 +3658,7 @@ rb_reg_s_union(VALUE self, VALUE args0) https://github.com/ruby/ruby/blob/trunk/re.c#L3658
                 else {
                     has_asciionly = 1;
                 }
-		v = rb_reg_to_s(v);
+		v = rb_reg_str_with_term(v, -1);
 	    }
 	    else {
                 rb_encoding *enc;

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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