ruby-changes:3975
From: ko1@a...
Date: Thu, 14 Feb 2008 12:34:33 +0900 (JST)
Subject: [ruby-changes:3975] akr - Ruby:r15465 (trunk): * re.c (rb_reg_preprocess_dregexp): use non-preprocessed regexp source
akr 2008-02-14 12:34:12 +0900 (Thu, 14 Feb 2008) New Revision: 15465 Modified files: trunk/ChangeLog trunk/re.c trunk/test/ruby/test_m17n.rb Log: * re.c (rb_reg_preprocess_dregexp): use non-preprocessed regexp source for result. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15465&r2=15464&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/re.c?r1=15465&r2=15464&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_m17n.rb?r1=15465&r2=15464&diff_format=u Index: re.c =================================================================== --- re.c (revision 15464) +++ re.c (revision 15465) @@ -1953,6 +1953,7 @@ rb_reg_preprocess_dregexp(VALUE ary) { rb_encoding *fixed_enc = 0; + rb_encoding *regexp_enc = 0; onig_errmsg_buffer err = ""; int i; VALUE result = 0; @@ -1967,32 +1968,34 @@ VALUE str = argv[i]; VALUE buf; char *p, *end; - rb_encoding *enc; + rb_encoding *src_enc; StringValue(str); p = RSTRING_PTR(str); end = p + RSTRING_LEN(str); - enc = rb_enc_get(str); + src_enc = rb_enc_get(str); - buf = rb_reg_preprocess(p, end, enc, &fixed_enc, err); - RB_GC_GUARD(str); + buf = rb_reg_preprocess(p, end, src_enc, &fixed_enc, err); if (buf == Qnil) rb_raise(rb_eArgError, "%s", err); - if (i == 0) { - /* The encoding of the first fragment is the encoding - * given by the regexp option or script encoding. */ - if (fixed_enc == 0) { - rb_enc_copy(buf, str); + if (fixed_enc != 0) { + if (regexp_enc != 0 && regexp_enc != fixed_enc) { + rb_raise(rb_eArgError, "encoding mismatch in dynamic regexp : %s and %s", + rb_enc_name(regexp_enc), rb_enc_name(fixed_enc)); } + regexp_enc = fixed_enc; } if (!result) - result = buf; + result = rb_str_new3(str); else - rb_str_buf_append(result, buf); + rb_str_buf_append(result, str); } + if (regexp_enc) { + rb_enc_associate(result, regexp_enc); + } return result; } Index: ChangeLog =================================================================== --- ChangeLog (revision 15464) +++ ChangeLog (revision 15465) @@ -1,3 +1,8 @@ +Thu Feb 14 12:30:02 2008 Tanaka Akira <akr@f...> + + * re.c (rb_reg_preprocess_dregexp): use non-preprocessed regexp source + for result. + Thu Feb 14 01:43:16 2008 Nobuyoshi Nakada <nobu@r...> * lib/timeout.rb (Timeout::timeout): made sensitive to location on the Index: test/ruby/test_m17n.rb =================================================================== --- test/ruby/test_m17n.rb (revision 15464) +++ test/ruby/test_m17n.rb (revision 15465) @@ -452,6 +452,12 @@ assert_raise(ArgumentError) { /\xc2\xa1#{r}/s } end + def test_regexp_embed_preprocess + r1 = /\xa4\xa2/e + r2 = /#{r1}/ + assert(r2.source.include?(r1.source)) + end + def test_begin_end_offset str = e("\244\242\244\244\244\246\244\250\244\252a") assert(/(a)/ =~ str) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/