aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--gc.c1
-rw-r--r--re.c41
-rw-r--r--re.h1
-rw-r--r--version.h6
5 files changed, 53 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index d7bedbcbe2..60c4b21c47 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/gc.c b/gc.c
index d3c87ddc8f..839471b2b5 100644
--- a/gc.c
+++ b/gc.c
@@ -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;
diff --git a/re.c b/re.c
index 47876d3fcd..9570a775e1 100644
--- a/re.c
+++ b/re.c
@@ -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
diff --git a/re.h b/re.h
index 2c3463dadc..8690932bb5 100644
--- a/re.h
+++ b/re.h
@@ -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))
diff --git a/version.h b/version.h
index 6bea9f773b..55aea3dcf6 100644
--- a/version.h
+++ b/version.h
@@ -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[];