add String/Symbol argument to MatchData[x]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10045 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
kosako 2006-03-21 13:16:21 +00:00
parent 1e608d0dff
commit a350e9c6e2
5 changed files with 53 additions and 6 deletions

View File

@ -1,3 +1,13 @@
Tue Mar 21 22:14:01 2006 K.Kosako <sndgk393 AT ybb.ne.jp>
* re.c (match_alloc): initialize member regexp.
* re.c (match_aref): add String and Symbol argument. [ruby-dev:28448]
* re.h : add member regexp to RMatch.
* gc.c (gc_mark_children): add gc_mark() to regexp member.
Mon Mar 20 11:12:38 2006 NAKAMURA Usaku <usa@ruby-lang.org>
* ext/win32ole/win32ole.c (folevariant_value): could not compile

1
gc.c
View File

@ -970,6 +970,7 @@ gc_mark_children(VALUE ptr, int lev)
break;
case T_MATCH:
gc_mark(obj->as.match.regexp, lev);
if (obj->as.match.str) {
ptr = obj->as.match.str;
goto again;

41
re.c
View File

@ -655,6 +655,7 @@ match_alloc(VALUE klass)
match->str = 0;
match->regs = 0;
match->regexp = 0;
match->regs = ALLOC(struct re_registers);
MEMZERO(match->regs, struct re_registers, 1);
@ -942,6 +943,7 @@ rb_reg_search(VALUE re, VALUE str, long pos, long reverse)
onig_region_copy(RMATCH(match)->regs, &regs);
RMATCH(match)->str = rb_str_new4(str);
RMATCH(match)->regexp = re;
rb_backref_set(match);
OBJ_INFECT(match, re);
@ -1183,10 +1185,43 @@ match_aref(int argc, VALUE *argv, VALUE match)
rb_scan_args(argc, argv, "11", &idx, &rest);
if (!NIL_P(rest) || !FIXNUM_P(idx) || FIX2INT(idx) < 0) {
return rb_ary_aref(argc, argv, match_to_a(match));
if (NIL_P(rest)) {
if (FIXNUM_P(idx)) {
if (FIX2INT(idx) >= 0) {
return rb_reg_nth_match(FIX2INT(idx), match);
}
}
else {
char *p, *end;
int num;
switch (TYPE(idx)) {
case T_SYMBOL:
p = rb_id2name(SYM2ID(idx));
goto name_to_backref;
break;
case T_STRING:
p = StringValuePtr(idx);
name_to_backref:
end = p + strlen(p);
num = onig_name_to_backref_number(RREGEXP(RMATCH(match)->regexp)->ptr,
(unsigned char* )p, (unsigned char* )end, RMATCH(match)->regs);
if (num >= 1) {
return rb_reg_nth_match(num, match);
}
else {
rb_raise(rb_eArgError, "undefined group name reference: %s", p);
}
break;
default:
break;
}
}
}
return rb_reg_nth_match(FIX2INT(idx), match);
return rb_ary_aref(argc, argv, match_to_a(match));
}
static VALUE

1
re.h
View File

@ -24,6 +24,7 @@ struct RMatch {
struct RBasic basic;
VALUE str;
struct re_registers *regs;
VALUE regexp; /* RRegexp */
};
#define RMATCH(obj) (R_CAST(RMatch)(obj))

View File

@ -1,14 +1,14 @@
#define RUBY_VERSION "1.9.0"
#define RUBY_RELEASE_DATE "2006-03-20"
#define RUBY_RELEASE_DATE "2006-03-21"
#define RUBY_VERSION_CODE 190
#define RUBY_RELEASE_CODE 20060320
#define RUBY_RELEASE_CODE 20060321
#define RUBY_VERSION_MAJOR 1
#define RUBY_VERSION_MINOR 9
#define RUBY_VERSION_TEENY 0
#define RUBY_RELEASE_YEAR 2006
#define RUBY_RELEASE_MONTH 3
#define RUBY_RELEASE_DAY 20
#define RUBY_RELEASE_DAY 21
RUBY_EXTERN const char ruby_version[];
RUBY_EXTERN const char ruby_release_date[];