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:
parent
826f2ee306
commit
782fd488d7
3 changed files with 28 additions and 7 deletions
|
@ -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
|
||||
|
|
21
regparse.c
21
regparse.c
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue