1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* regparse.c (fetch_name_with_level): allow non word characters

at the first character.  [Feature #11949]

* regparse.c (fetch_name): ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53610 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
naruse 2016-01-21 16:09:09 +00:00
parent 826f2ee306
commit 782fd488d7
3 changed files with 28 additions and 7 deletions

View file

@ -1,3 +1,10 @@
Fri Jan 22 00:25:57 2016 NARUSE, Yui <naruse@ruby-lang.org>
* regparse.c (fetch_name_with_level): allow non word characters
at the first character. [Feature #11949]
* regparse.c (fetch_name): ditto.
Thu Jan 21 17:34:01 2016 NARUSE, Yui <naruse@ruby-lang.org>
* marshal.c (r_object0): honor Marshal.load post proc

View file

@ -2617,6 +2617,7 @@ get_name_end_code_point(OnigCodePoint start)
}
#ifdef USE_NAMED_GROUP
#define ONIGENC_IS_CODE_NAME(enc, c) TRUE
#ifdef USE_BACKREF_WITH_LEVEL
/*
\k<name+n>, \k<name-n>
@ -2662,7 +2663,7 @@ fetch_name_with_level(OnigCodePoint start_code, UChar** src, UChar* end,
sign = -1;
pnum_head = p;
}
else if (!ONIGENC_IS_CODE_WORD(enc, c)) {
else if (!ONIGENC_IS_CODE_NAME(enc, c)) {
r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;
}
}
@ -2684,7 +2685,7 @@ fetch_name_with_level(OnigCodePoint start_code, UChar** src, UChar* end,
is_num = 0;
}
}
else if (!ONIGENC_IS_CODE_WORD(enc, c)) {
else if (!ONIGENC_IS_CODE_NAME(enc, c)) {
r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;
}
}
@ -2785,7 +2786,7 @@ fetch_name(OnigCodePoint start_code, UChar** src, UChar* end,
is_num = 0;
}
}
else if (!ONIGENC_IS_CODE_WORD(enc, c)) {
else if (!ONIGENC_IS_CODE_NAME(enc, c)) {
r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;
}
}
@ -2795,8 +2796,11 @@ fetch_name(OnigCodePoint start_code, UChar** src, UChar* end,
name_end = p;
PFETCH_S(c);
if (c == end_code || c == ')') {
if (is_num == 2) r = ONIGERR_INVALID_GROUP_NAME;
break;
if (is_num == 2) {
r = ONIGERR_INVALID_GROUP_NAME;
goto teardown;
}
break;
}
if (is_num != 0) {
@ -2808,12 +2812,13 @@ fetch_name(OnigCodePoint start_code, UChar** src, UChar* end,
r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;
else
r = ONIGERR_INVALID_GROUP_NAME;
is_num = 0;
goto teardown;
}
}
else {
if (!ONIGENC_IS_CODE_WORD(enc, c)) {
if (!ONIGENC_IS_CODE_NAME(enc, c)) {
r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;
goto teardown;
}
}
}
@ -2821,6 +2826,7 @@ fetch_name(OnigCodePoint start_code, UChar** src, UChar* end,
if (c != end_code) {
r = ONIGERR_INVALID_GROUP_NAME;
name_end = end;
goto err;
}
if (is_num != 0) {
@ -2839,6 +2845,7 @@ fetch_name(OnigCodePoint start_code, UChar** src, UChar* end,
return 0;
}
else {
teardown:
while (!PEND) {
name_end = p;
PFETCH_S(c);

View file

@ -142,6 +142,8 @@ class TestRegexp < Test::Unit::TestCase
assert_equal("a[b]c", "abc".sub(/(?<x>[bc])/, "[\\k<x>]"))
assert_equal("o", "foo"[/(?<bar>o)/, "bar"])
assert_equal("o", "foo"[/(?<@bar>o)/, "@bar"])
assert_equal("o", "foo"[/(?<@bar>.)\g<@bar>\k<@bar>/, "@bar"])
s = "foo"
s[/(?<bar>o)/, "bar"] = "baz"
@ -175,6 +177,7 @@ class TestRegexp < Test::Unit::TestCase
def test_assign_named_capture
assert_equal("a", eval('/(?<foo>.)/ =~ "a"; foo'))
assert_equal(nil, eval('/(?<@foo>.)/ =~ "a"; defined?(@foo)'))
assert_equal("a", eval('foo = 1; /(?<foo>.)/ =~ "a"; foo'))
assert_equal("a", eval('1.times {|foo| /(?<foo>.)/ =~ "a"; break foo }'))
assert_nothing_raised { eval('/(?<Foo>.)/ =~ "a"') }
@ -939,6 +942,10 @@ class TestRegexp < Test::Unit::TestCase
h = {a => 42}
assert_equal(42, h[b], '[ruby-core:24748]')
assert_match(/#<TestRegexp::MatchData_\u{3042}:/, MatchData_A.allocate.inspect)
h = /^(?<@time>\d+): (?<body>.*)/.match("123456: hoge fuga")
assert_equal("123456", h["@time"])
assert_equal("hoge fuga", h["body"])
end
def test_regexp_poped