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/