mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/strscan/strscan.c (strscan_aref): raise error if given
name reference is not found. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40912 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
755f669316
commit
c43dd625b6
3 changed files with 32 additions and 7 deletions
|
@ -1,3 +1,8 @@
|
|||
Fri May 24 16:31:23 2013 NARUSE, Yui <naruse@ruby-lang.org>
|
||||
|
||||
* ext/strscan/strscan.c (strscan_aref): raise error if given
|
||||
name reference is not found.
|
||||
|
||||
Fri May 24 15:48:18 2013 Koichi Sasada <ko1@atdot.net>
|
||||
|
||||
* gc.c (after_gc_sweep, garbage_collect_body): do major GC (full GC)
|
||||
|
|
|
@ -975,6 +975,25 @@ strscan_matched_size(VALUE self)
|
|||
return INT2NUM(p->regs.end[0] - p->regs.beg[0]);
|
||||
}
|
||||
|
||||
static int
|
||||
name_to_backref_number(struct re_registers *regs, VALUE regexp, const char* name, const char* name_end)
|
||||
{
|
||||
int num;
|
||||
|
||||
num = onig_name_to_backref_number(RREGEXP(regexp)->ptr,
|
||||
(const unsigned char* )name, (const unsigned char* )name_end, regs);
|
||||
if (num >= 1) {
|
||||
return num;
|
||||
}
|
||||
else {
|
||||
VALUE s = rb_str_new(name, (long )(name_end - name));
|
||||
rb_raise(rb_eIndexError, "undefined group name reference: %s",
|
||||
StringValuePtr(s));
|
||||
}
|
||||
|
||||
UNREACHABLE;
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq: [](n)
|
||||
*
|
||||
|
@ -1019,9 +1038,7 @@ strscan_aref(VALUE self, VALUE idx)
|
|||
case T_STRING:
|
||||
name = StringValuePtr(idx);
|
||||
name_to_backref:
|
||||
name_end = name + strlen(name);
|
||||
i = onig_name_to_backref_number(RREGEXP(p->regex)->ptr,
|
||||
(const unsigned char* )name, (const unsigned char* )name_end, &(p->regs));
|
||||
i = name_to_backref_number(&(p->regs), p->regex, name, name + strlen(name));
|
||||
break;
|
||||
default:
|
||||
i = NUM2LONG(idx);
|
||||
|
|
|
@ -402,6 +402,8 @@ class TestStringScanner < Test::Unit::TestCase
|
|||
assert_equal 'stra', s[-1]
|
||||
assert_equal 'stra', s[0]
|
||||
assert_nil s[1]
|
||||
assert_raise(IndexError) { s[:c] }
|
||||
assert_raise(IndexError) { s['c'] }
|
||||
|
||||
assert_equal false, s[-1].tainted?
|
||||
assert_equal false, s[0].tainted?
|
||||
|
@ -458,16 +460,17 @@ class TestStringScanner < Test::Unit::TestCase
|
|||
assert_equal true, s[3].tainted?
|
||||
assert_equal true, s[4].tainted?
|
||||
|
||||
s = StringScanner.new("foo bar")
|
||||
s.scan /(?<a>(\w+)) (?<b>(\w+))/
|
||||
s = StringScanner.new("foo bar baz")
|
||||
s.scan /(?<a>\w+) (?<b>\w+) (\w+)/
|
||||
assert_equal 'foo', s[1]
|
||||
assert_equal 'bar', s[2]
|
||||
assert_nil s[3]
|
||||
assert_equal 'foo', s[:a]
|
||||
assert_equal 'bar', s[:b]
|
||||
assert_equal nil, s[:c]
|
||||
assert_raise(IndexError) { s[:c] }
|
||||
assert_equal 'foo', s['a']
|
||||
assert_equal 'bar', s['b']
|
||||
assert_equal nil, s['c']
|
||||
assert_raise(IndexError) { s['c'] }
|
||||
end
|
||||
|
||||
def test_pre_match
|
||||
|
|
Loading…
Reference in a new issue