[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]