From 8a8f542c4366b5c23e1f607dd77f381e2bcbd5bc Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 16 Mar 2018 13:37:44 +0000 Subject: 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] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62779 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- re.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) (limited to 're.c') diff --git a/re.c b/re.c index 84c2e060dd..e487e55869 100644 --- a/re.c +++ b/re.c @@ -351,7 +351,7 @@ rb_reg_check(VALUE re) 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, long len, 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, long len, 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, long len, 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, VALUE re) 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) 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: @@ -536,6 +537,12 @@ rb_reg_inspect(VALUE re) 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; @@ -615,7 +622,7 @@ rb_reg_to_s(VALUE re) 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) 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, long len, rb_encoding *enc, int options, co 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) else { has_asciionly = 1; } - v = rb_reg_to_s(v); + v = rb_reg_str_with_term(v, -1); } else { rb_encoding *enc; -- cgit v1.2.3