ruby-changes:13009
From: nobu <ko1@a...>
Date: Sat, 5 Sep 2009 08:54:36 +0900 (JST)
Subject: [ruby-changes:13009] Ruby:r24754 (trunk): * re.c (update_char_offset): position should be long.
nobu 2009-09-05 08:51:44 +0900 (Sat, 05 Sep 2009) New Revision: 24754 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=24754 Log: * re.c (update_char_offset): position should be long. * re.c (match_hash, match_equal): new methods. [ruby-core:24748] * re.c (reg_match_pos, rb_reg_eqq, rb_reg_s_quote): get rid of use VALUE as int. Modified files: trunk/ChangeLog trunk/re.c trunk/test/ruby/test_regexp.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 24753) +++ ChangeLog (revision 24754) @@ -1,13 +1,12 @@ -Sat Sep 5 08:49:16 2009 Nobuyoshi Nakada <nobu@r...> +Sat Sep 5 08:51:43 2009 Nobuyoshi Nakada <nobu@r...> - * re.c (update_char_offset): - * re.c (rb_reg_equal): - * re.c (reg_match_pos): - * re.c (rb_reg_eqq): - * re.c (static VALUE): - * re.c (Init_Regexp): - [ruby-core:24748] + * re.c (update_char_offset): position should be long. + * re.c (match_hash, match_equal): new methods. [ruby-core:24748] + + * re.c (reg_match_pos, rb_reg_eqq, rb_reg_s_quote): get rid of use + VALUE as int. + Fri Sep 4 20:40:57 2009 Nobuyoshi Nakada <nobu@r...> * numeric.c (round): added declaration. [ruby-dev:39222] Index: re.c =================================================================== --- re.c (revision 24753) +++ re.c (revision 24754) @@ -2543,7 +2543,56 @@ return Qfalse; } +/* + * call-seq: + * mtch.hash => integer + * + * Produce a hash based on the target string, regexp and matched + * positions of this matchdata. + */ + static VALUE +match_hash(VALUE match) +{ + const struct re_registers *regs; + VALUE h; + unsigned long hashval = rb_hash_start(rb_str_hash(RMATCH(match)->str)); + + h = rb_reg_hash(RMATCH(match)->regexp); + rb_hash_uint(hashval, FIX2LONG(h)); + regs = RMATCH_REGS(match); + hashval = rb_hash_uint(hashval, regs->num_regs); + hashval = rb_hash_uint(hashval, rb_memhash(regs->beg, regs->num_regs * sizeof(*regs->beg))); + hashval = rb_hash_uint(hashval, rb_memhash(regs->end, regs->num_regs * sizeof(*regs->end))); + hashval = rb_hash_end(hashval); + return LONG2FIX(hashval); +} + +/* + * call-seq: + * mtch == mtch2 => true or false + * + * Equality---Two matchdata are equal if their target strings, + * patterns, and matched positions are identical. + */ + +static VALUE +match_equal(VALUE match1, VALUE match2) +{ + const struct re_registers *regs1, *regs2; + if (match1 == match2) return Qtrue; + if (TYPE(match2) != T_MATCH) return Qfalse; + if (!rb_str_equal(RMATCH(match1)->str, RMATCH(match2)->str)) return Qfalse; + if (!rb_reg_equal(RMATCH(match1)->regexp, RMATCH(match2)->regexp)) return Qfalse; + regs1 = RMATCH_REGS(match1); + regs2 = RMATCH_REGS(match2); + if (regs1->num_regs != regs2->num_regs) return Qfalse; + if (memcmp(regs1->beg, regs2->beg, regs1->num_regs * sizeof(*regs1->beg))) return Qfalse; + if (memcmp(regs1->end, regs2->end, regs1->num_regs * sizeof(*regs1->end))) return Qfalse; + return Qtrue; +} + +static VALUE reg_operand(VALUE s, int check) { if (SYMBOL_P(s)) { Index: test/ruby/test_regexp.rb =================================================================== --- test/ruby/test_regexp.rb (revision 24753) +++ test/ruby/test_regexp.rb (revision 24754) @@ -778,4 +778,12 @@ assert_nothing_raised { 0x03ffffff.chr("utf-8").size } assert_nothing_raised { 0x7fffffff.chr("utf-8").size } end + + def test_matchdata + a = "haystack".match(/hay/) + b = "haystack".match(/hay/) + assert_equal(a, b, '[ruby-core:24748]') + h = {a => 42} + assert_equal(42, h[b], '[ruby-core:24748]') + end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/