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

ruby-changes:69903

From: NAKAMURA <ko1@a...>
Date: Wed, 24 Nov 2021 19:54:11 +0900 (JST)
Subject: [ruby-changes:69903] cd10572b05 (ruby_2_7): merge revision(s) 99d8c4832a7133ca52578d015e3ddcfd94820f4a: [Backport #18160]

https://git.ruby-lang.org/ruby.git/commit/?id=cd10572b05

From cd10572b059d07fe236ef9c9db9fd2a8ffc7dd38 Mon Sep 17 00:00:00 2001
From: NAKAMURA Usaku <usa@r...>
Date: Wed, 24 Nov 2021 19:34:03 +0900
Subject: merge revision(s) 99d8c4832a7133ca52578d015e3ddcfd94820f4a: [Backport
 #18160]

	Preserve the encoding of the argument in IndexError [Bug #18160]

	---
	 re.c                     | 20 ++++++++++----------
	 test/ruby/test_regexp.rb |  7 ++++++-
	 2 files changed, 16 insertions(+), 11 deletions(-)
---
 re.c                     | 20 ++++++++++----------
 test/ruby/test_regexp.rb |  7 ++++++-
 version.h                |  2 +-
 3 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/re.c b/re.c
index 9e9df700cf4..718a66b0318 100644
--- a/re.c
+++ b/re.c
@@ -1141,6 +1141,14 @@ match_size(VALUE match) https://github.com/ruby/ruby/blob/trunk/re.c#L1141
 }
 
 static int name_to_backref_number(struct re_registers *, VALUE, const char*, const char*);
+NORETURN(static void name_to_backref_error(VALUE name));
+
+static void
+name_to_backref_error(VALUE name)
+{
+    rb_raise(rb_eIndexError, "undefined group name reference: % "PRIsVALUE,
+	     name);
+}
 
 static int
 match_backref_number(VALUE match, VALUE backref)
@@ -1160,10 +1168,10 @@ match_backref_number(VALUE match, VALUE backref) https://github.com/ruby/ruby/blob/trunk/re.c#L1168
     }
     name = StringValueCStr(backref);
 
-    num = name_to_backref_number(regs, regexp, name, name + strlen(name));
+    num = name_to_backref_number(regs, regexp, name, name + RSTRING_LEN(backref));
 
     if (num < 1) {
-        rb_raise(rb_eIndexError, "undefined group name reference: %s", name);
+        name_to_backref_error(backref);
     }
 
     return num;
@@ -1910,14 +1918,6 @@ name_to_backref_number(struct re_registers *regs, VALUE regexp, const char* name https://github.com/ruby/ruby/blob/trunk/re.c#L1918
 	(const unsigned char *)name, (const unsigned char *)name_end, regs);
 }
 
-NORETURN(static void name_to_backref_error(VALUE name));
-static void
-name_to_backref_error(VALUE name)
-{
-    rb_raise(rb_eIndexError, "undefined group name reference: % "PRIsVALUE,
-	     name);
-}
-
 #define NAME_TO_NUMBER(regs, re, name, name_ptr, name_end)	\
     (NIL_P(re) ? 0 : \
      !rb_enc_compatible(RREGEXP_SRC(re), (name)) ? 0 : \
diff --git a/test/ruby/test_regexp.rb b/test/ruby/test_regexp.rb
index dc203fa82a4..5c7d2051854 100644
--- a/test/ruby/test_regexp.rb
+++ b/test/ruby/test_regexp.rb
@@ -691,11 +691,16 @@ class TestRegexp < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_regexp.rb#L691
     test = proc {|&blk| "abc".sub("a", ""); blk.call($~) }
 
     bug10877 = '[ruby-core:68209] [Bug #10877]'
+    bug18160 = '[Bug #18160]'
     test.call {|m| assert_raise_with_message(IndexError, /foo/, bug10877) {m["foo"]} }
     key = "\u{3042}"
     [Encoding::UTF_8, Encoding::Shift_JIS, Encoding::EUC_JP].each do |enc|
       idx = key.encode(enc)
-      test.call {|m| assert_raise_with_message(IndexError, /#{idx}/, bug10877) {m[idx]} }
+      pat = /#{idx}/
+      test.call {|m| assert_raise_with_message(IndexError, pat, bug10877) {m[idx]} }
+      test.call {|m| assert_raise_with_message(IndexError, pat, bug18160) {m.offset(idx)} }
+      test.call {|m| assert_raise_with_message(IndexError, pat, bug18160) {m.begin(idx)} }
+      test.call {|m| assert_raise_with_message(IndexError, pat, bug18160) {m.end(idx)} }
     end
     test.call {|m| assert_equal(/a/, m.regexp) }
     test.call {|m| assert_equal("abc", m.string) }
diff --git a/version.h b/version.h
index 81ae97bb310..6551fe8f7ad 100644
--- a/version.h
+++ b/version.h
@@ -2,7 +2,7 @@ https://github.com/ruby/ruby/blob/trunk/version.h#L2
 # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
 #define RUBY_VERSION_TEENY 5
 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 197
+#define RUBY_PATCHLEVEL 198
 
 #define RUBY_RELEASE_YEAR 2021
 #define RUBY_RELEASE_MONTH 11
-- 
cgit v1.2.1


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

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