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

ruby-changes:7150

From: akr <ko1@a...>
Date: Sun, 17 Aug 2008 12:06:17 +0900 (JST)
Subject: [ruby-changes:7150] Ruby:r18669 (trunk): * transcode.c (make_econv_exception): add several instance variables

akr	2008-08-17 12:05:40 +0900 (Sun, 17 Aug 2008)

  New Revision: 18669

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18669

  Log:
    * transcode.c (make_econv_exception): add several instance variables
      to exception object.
      (ecerr_source_encoding): new method:
      Encoding::ConversionUndefined#source_encoding and 
      Encoding::InvalidByteSequence#source_encoding.
      (ecerr_destination_encoding): new method:
      Encoding::ConversionUndefined#destination_encoding and 
      Encoding::InvalidByteSequence#destination_encoding.
      (econverr_error_char): new method:
      Encoding::ConversionUndefined#error_char.
      (econverr_error_bytes): new method:
      Encoding::ConversionUndefined#error_bytes.

  Modified files:
    trunk/ChangeLog
    trunk/test/ruby/test_econv.rb
    trunk/transcode.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 18668)
+++ ChangeLog	(revision 18669)
@@ -1,3 +1,18 @@
+Sun Aug 17 12:00:18 2008  Tanaka Akira  <akr@f...>
+
+	* transcode.c (make_econv_exception): add several instance variables
+	  to exception object.
+	  (ecerr_source_encoding): new method:
+	  Encoding::ConversionUndefined#source_encoding and 
+	  Encoding::InvalidByteSequence#source_encoding.
+	  (ecerr_destination_encoding): new method:
+	  Encoding::ConversionUndefined#destination_encoding and 
+	  Encoding::InvalidByteSequence#destination_encoding.
+	  (econverr_error_char): new method:
+	  Encoding::ConversionUndefined#error_char.
+	  (econverr_error_bytes): new method:
+	  Encoding::ConversionUndefined#error_bytes.
+
 Sun Aug 17 11:43:18 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* random.c (struct MT): packed Mersenne Twister staffs.
Index: test/ruby/test_econv.rb
===================================================================
--- test/ruby/test_econv.rb	(revision 18668)
+++ test/ruby/test_econv.rb	(revision 18669)
@@ -396,4 +396,23 @@
     ec.primitive_convert("", dst, nil, 10)
     assert_equal("\e$B!!\e(B???\e$B!\"!!!\#$\"\e(B".force_encoding("ISO-2022-JP"), dst)
   end
+
+  def test_exc_invalid
+    err = assert_raise(Encoding::InvalidByteSequence) {
+      "abc\xa4def".encode("ISO-8859-1", "EUC-JP")
+    }
+    assert_equal("EUC-JP", err.source_encoding)
+    assert_equal("UTF-8", err.destination_encoding)
+    assert_equal("\xA4".force_encoding("ASCII-8BIT"), err.error_bytes)
+  end
+
+  def test_exc_undef
+    err = assert_raise(Encoding::ConversionUndefined) {
+      "abc\xa4\xa2def".encode("ISO-8859-1", "EUC-JP")
+    }
+    assert_equal("UTF-8", err.source_encoding)
+    assert_equal("ISO-8859-1", err.destination_encoding)
+    assert_equal("\u{3042}", err.error_char)
+  end
+
 end
Index: transcode.c
===================================================================
--- transcode.c	(revision 18668)
+++ transcode.c	(revision 18669)
@@ -1205,25 +1205,40 @@
 static VALUE
 make_econv_exception(rb_econv_t *ec)
 {
-    VALUE mesg;
+    VALUE mesg, exc;
     if (ec->last_error.result == econv_invalid_byte_sequence) {
         VALUE bytes = rb_str_new((const char *)ec->last_error.error_bytes_start,
                                  ec->last_error.error_bytes_len);
-        bytes = rb_str_dump(bytes);
+        VALUE dumped;
+        dumped = rb_str_dump(bytes);
         mesg = rb_sprintf("invalid byte sequence: %s on %s",
-                StringValueCStr(bytes),
+                StringValueCStr(dumped),
                 ec->last_error.source_encoding);
-        return rb_exc_new3(rb_eInvalidByteSequence, mesg);
+        exc = rb_exc_new3(rb_eInvalidByteSequence, mesg);
+        rb_ivar_set(exc, rb_intern("source_encoding"), rb_str_new2(ec->last_error.source_encoding));
+        rb_ivar_set(exc, rb_intern("destination_encoding"), rb_str_new2(ec->last_error.destination_encoding));
+        rb_ivar_set(exc, rb_intern("error_bytes"), bytes);
+        return exc;
     }
     if (ec->last_error.result == econv_undefined_conversion) {
         VALUE bytes = rb_str_new((const char *)ec->last_error.error_bytes_start,
                                  ec->last_error.error_bytes_len);
-        bytes = rb_str_dump(bytes);
+        VALUE dumped;
+        int idx;
+        dumped = rb_str_dump(bytes);
         mesg = rb_sprintf("conversion undefined: %s from %s to %s",
-                StringValueCStr(bytes),
+                StringValueCStr(dumped),
                 ec->last_error.source_encoding,
                 ec->last_error.destination_encoding);
-        return rb_exc_new3(rb_eConversionUndefined, mesg);
+        exc = rb_exc_new3(rb_eConversionUndefined, mesg);
+        idx = rb_enc_find_index(ec->last_error.source_encoding);
+        rb_ivar_set(exc, rb_intern("source_encoding"), rb_str_new2(ec->last_error.source_encoding));
+        rb_ivar_set(exc, rb_intern("destination_encoding"), rb_str_new2(ec->last_error.destination_encoding));
+        idx = rb_enc_find_index(ec->last_error.source_encoding);
+        if (0 <= idx)
+            rb_enc_associate_index(bytes, idx);
+        rb_ivar_set(exc, rb_intern("error_char"), bytes);
+        return exc;
     }
     return Qnil;
 }
@@ -2078,6 +2093,30 @@
     rb_exc_raise(exc);
 }
 
+static VALUE
+ecerr_source_encoding(VALUE self)
+{
+    return rb_attr_get(self, rb_intern("source_encoding"));
+}
+
+static VALUE
+ecerr_destination_encoding(VALUE self)
+{
+    return rb_attr_get(self, rb_intern("destination_encoding"));
+}
+
+static VALUE
+ecerr_error_char(VALUE self)
+{
+    return rb_attr_get(self, rb_intern("error_char"));
+}
+
+static VALUE
+ecerr_error_bytes(VALUE self)
+{
+    return rb_attr_get(self, rb_intern("error_bytes"));
+}
+
 void
 Init_transcode(void)
 {
@@ -2108,4 +2147,12 @@
     rb_define_const(rb_cEncodingConverter, "UNIVERSAL_NEWLINE_DECODER", INT2FIX(ECONV_UNIVERSAL_NEWLINE_DECODER));
     rb_define_const(rb_cEncodingConverter, "CRLF_NEWLINE_ENCODER", INT2FIX(ECONV_CRLF_NEWLINE_ENCODER));
     rb_define_const(rb_cEncodingConverter, "CR_NEWLINE_ENCODER", INT2FIX(ECONV_CR_NEWLINE_ENCODER));
+
+    rb_define_method(rb_eConversionUndefined, "source_encoding", ecerr_source_encoding, 0);
+    rb_define_method(rb_eConversionUndefined, "destination_encoding", ecerr_destination_encoding, 0);
+    rb_define_method(rb_eConversionUndefined, "error_char", ecerr_error_char, 0);
+
+    rb_define_method(rb_eInvalidByteSequence, "source_encoding", ecerr_source_encoding, 0);
+    rb_define_method(rb_eInvalidByteSequence, "destination_encoding", ecerr_destination_encoding, 0);
+    rb_define_method(rb_eInvalidByteSequence, "error_bytes", ecerr_error_bytes, 0);
 }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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