From 2ba22d68519872b18a3b61490b6b78e2a7aca013 Mon Sep 17 00:00:00 2001 From: matz Date: Thu, 16 Oct 2008 22:21:42 +0000 Subject: * .gdbinit (rp): REGEXP handling fixed. * string.c (rb_str_rindex_m): need not to call rb_enc_check on regexp. * re.c (unescape_escaped_nonascii): try ASCII-8BIT encoding for broken strings. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@19812 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- .gdbinit | 10 ++++++++-- ChangeLog | 10 ++++++++++ re.c | 8 ++++++-- string.c | 2 +- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/.gdbinit b/.gdbinit index 96e033fa8..c2a8b28d0 100644 --- a/.gdbinit +++ b/.gdbinit @@ -86,11 +86,17 @@ define rp print (struct RString *)$arg0 else if ($flags & RUBY_T_MASK) == RUBY_T_REGEXP + set $regsrc = ((struct RRegexp*)$arg0)->src + set $rsflags = ((struct RBasic*)$regsrc)->flags printf "T_REGEXP: " set print address off - output ((struct RRegexp*)$arg0)->str + output (char *)(($rsflags & RUBY_FL_USER1) ? \ + ((struct RString*)$regsrc)->as.heap.ptr : \ + ((struct RString*)$regsrc)->as.ary) set print address on - printf " len:%ld ", ((struct RRegexp*)$arg0)->len + printf " len:%ld ", ($rsflags & RUBY_FL_USER1) ? \ + ((struct RString*)$regsrc)->as.heap.len : \ + (($rsflags & (RUBY_FL_USER2|RUBY_FL_USER3|RUBY_FL_USER4|RUBY_FL_USER5|RUBY_FL_USER6)) >> RUBY_FL_USHIFT+2) if $flags & RUBY_FL_USER6 printf "(none) " end diff --git a/ChangeLog b/ChangeLog index a96058206..ca156bb39 100644 --- a/ChangeLog +++ b/ChangeLog @@ -64,6 +64,16 @@ Thu Oct 16 06:20:36 2008 Yukihiro Matsumoto * test/ruby/test_transcode.rb (TestTranscode#test_errors): String#encode now works without any argument. [ruby-dev:36740] +Wed Oct 15 23:48:22 2008 Yukihiro Matsumoto + + * .gdbinit (rp): REGEXP handling fixed. + + * string.c (rb_str_rindex_m): need not to call rb_enc_check on + regexp. + + * re.c (unescape_escaped_nonascii): try ASCII-8BIT encoding for + broken strings. + Wed Oct 15 23:11:10 2008 Yukihiro Matsumoto * lib/delegate.rb (DelegateClass): restored 1.8 behavior for diff --git a/re.c b/re.c index fa00e8cea..03d9dc352 100644 --- a/re.c +++ b/re.c @@ -1967,8 +1967,12 @@ unescape_escaped_nonascii(const char **pp, const char *end, rb_encoding *enc, l = rb_enc_precise_mbclen(chbuf, chbuf+chlen, enc); if (MBCLEN_INVALID_P(l)) { - strcpy(err, "invalid multibyte escape"); - return -1; + if (*encp == 0) + enc = *encp = rb_ascii8bit_encoding(); + else if (*encp != rb_ascii8bit_encoding()) { + strcpy(err, "invalid multibyte escape"); + return -1; + } } if (1 < chlen || (chbuf[0] & 0x80)) { rb_str_buf_cat(buf, chbuf, chlen); diff --git a/string.c b/string.c index 859363363..601845c44 100644 --- a/string.c +++ b/string.c @@ -2355,7 +2355,7 @@ rb_str_rindex_m(int argc, VALUE *argv, VALUE str) case T_REGEXP: /* enc = rb_get_check(str, sub); */ pos = str_offset(RSTRING_PTR(str), RSTRING_END(str), pos, - rb_enc_check(str, sub), single_byte_optimizable(str)); + STR_ENC_GET(str), single_byte_optimizable(str)); if (!RREGEXP(sub)->ptr || RREGEXP_SRC_LEN(sub)) { pos = rb_reg_adjust_startpos(sub, str, pos, 1); -- cgit