From c45908e41f47c88674b73a754ecd0535449b667a Mon Sep 17 00:00:00 2001 From: matz Date: Tue, 27 Aug 2002 08:31:08 +0000 Subject: * file.c (rb_find_file): $LOAD_PATH must not be empty. * file.c (rb_find_file_ext): ditto. * range.c (range_eq): class check should be based on range.class, instead of Range to work with Range.dup. * range.c (range_eql): ditto. * class.c (rb_mod_dup): need to preserve metaclass and flags. * object.c (rb_cstr_to_dbl): had a buffer overrun. * marshal.c (w_class): integrate singleton check into a funciton to follow DRY principle. * marshal.c (w_uclass): should check singleton method. * object.c (rb_obj_dup): dmark and dfree functions must be match for T_DATA type. * object.c (rb_obj_dup): class of the duped object must be match to the class of the original. * re.c (rb_reg_quote): do not escape \t, \f, \r, \n, for they are not regular expression metacharacters. * time.c (time_s_alloc): use time_free instead of free (null check, also serves for type mark). * time.c (time_s_at): check dfree function too. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2748 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- re.c | 47 ++++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 21 deletions(-) (limited to 're.c') diff --git a/re.c b/re.c index a8e4cc3b0b..87c06d675d 100644 --- a/re.c +++ b/re.c @@ -544,6 +544,23 @@ match_clone(match) return (VALUE)clone; } +static VALUE +match_dup(match) + VALUE match; +{ + NEWOBJ(dup, struct RMatch); + DUPSETUP(dup, match); + + dup->str = RMATCH(match)->str; + dup->regs = 0; + + dup->regs = ALLOC(struct re_registers); + dup->regs->allocated = 0; + re_copy_registers(dup->regs, RMATCH(match)->regs); + + return (VALUE)dup; +} + static VALUE match_size(match) VALUE match; @@ -1195,7 +1212,6 @@ rb_reg_quote(str) continue; } switch (c) { - case '\t': case '\f': case '\r': case '\n': case '[': case ']': case '{': case '}': case '(': case ')': case '|': case '-': case '*': case '.': case '\\': @@ -1224,22 +1240,6 @@ rb_reg_quote(str) continue; } switch (c) { - case '\t': - c = 't'; - *t++ = '\\'; - break; - case '\f': - c = 'f'; - *t++ = '\\'; - break; - case '\r': - c = 'r'; - *t++ = '\\'; - break; - case '\n': - c = 'n'; - *t++ = '\\'; - break; case '[': case ']': case '{': case '}': case '(': case ')': case '|': case '-': case '*': case '.': case '\\': @@ -1329,11 +1329,13 @@ rb_reg_options(re) } static VALUE -rb_reg_clone(re) +rb_reg_become(clone, re) VALUE re; { - VALUE clone = rb_obj_clone(re); - + /* need better argument type check */ + if (!rb_obj_is_kind_of(re, rb_obj_class(clone))) { + rb_raise(rb_eTypeError, "wrong argument type"); + } RREGEXP(clone)->ptr = 0; RREGEXP(clone)->len = 0; RREGEXP(clone)->str = 0; @@ -1578,7 +1580,7 @@ Init_Regexp() rb_define_singleton_method(rb_cRegexp, "last_match", rb_reg_s_last_match, -1); rb_define_method(rb_cRegexp, "initialize", rb_reg_initialize_m, -1); - rb_define_method(rb_cRegexp, "clone", rb_reg_clone, 0); + rb_define_method(rb_cRegexp, "become", rb_reg_become, 1); rb_define_method(rb_cRegexp, "==", rb_reg_equal, 1); rb_define_method(rb_cRegexp, "=~", rb_reg_match, 1); rb_define_method(rb_cRegexp, "===", rb_reg_match, 1); @@ -1602,7 +1604,10 @@ Init_Regexp() rb_undef_method(CLASS_OF(rb_cMatch), "allocate"); rb_undef_method(CLASS_OF(rb_cMatch), "new"); + /* to be replaced by allocation framework */ rb_define_method(rb_cMatch, "clone", match_clone, 0); + rb_define_method(rb_cMatch, "dup", match_dup, 0); + rb_define_method(rb_cMatch, "size", match_size, 0); rb_define_method(rb_cMatch, "length", match_size, 0); rb_define_method(rb_cMatch, "offset", match_offset, 1); -- cgit v1.2.3