[MacRuby] #849: MacRuby throws the exception of "Encoding::CompatibilityError" with various cases.

MacRuby ruby-noreply at macosforge.org
Wed Aug 18 22:10:59 PDT 2010


#849: MacRuby throws the exception of "Encoding::CompatibilityError" with various
cases.
----------------------------------+-----------------------------------------
 Reporter:  watson1978@…          |       Owner:  lsansonetti@…        
     Type:  defect                |      Status:  new                  
 Priority:  blocker               |   Milestone:                       
Component:  MacRuby               |    Keywords:                       
----------------------------------+-----------------------------------------

Comment(by watson1978@…):

 I think pack('U') to be repaired by the following patch.

 {{{
 #!diff
 diff --git a/encoding.c b/encoding.c
 index d3295a0..dc590a8 100644
 --- a/encoding.c
 +++ b/encoding.c
 @@ -519,9 +519,7 @@ rb_enc_get_index(VALUE obj)
  void
  rb_enc_set_index(VALUE obj, int encindex)
  {
 -    if (encindex < ENCODINGS_COUNT) {
 -       return ;
 -    }
 +    assert(encindex >= 0 && encindex < ENCODINGS_COUNT);
      rb_str_force_encoding(obj, rb_encodings[encindex]);
  }

 diff --git a/include/ruby/intern.h b/include/ruby/intern.h
 index d8b3940..58fc56a 100644
 --- a/include/ruby/intern.h
 +++ b/include/ruby/intern.h
 @@ -174,6 +174,9 @@ VALUE rb_fiber_resume(VALUE fib, int argc, VALUE
 *args);
  VALUE rb_fiber_yield(int argc, VALUE *args);
  VALUE rb_fiber_current(void);
  VALUE rb_fiber_alive_p(VALUE);
 +/* encoding.c */
 +void rb_enc_set_index(VALUE obj, int encindex);
 +int rb_utf8_encindex(void);
  /* enum.c */
  /* error.c */
  VALUE rb_exc_new(VALUE, const char*, long);
 diff --git a/pack.c b/pack.c
 index 9d073cb..89c9142 100644
 --- a/pack.c
 +++ b/pack.c
 @@ -446,6 +446,7 @@ pack_pack(VALUE ary, SEL sel, VALUE fmt)
      char type;
      long items, len, idx, plen;
      const char *ptr;
 +    int enc_info = 1;          /* 0 - BINARY, 1 - US-ASCII, 2 - UTF-8 */
  #ifdef NATINT_PACK
      int natint;                /* native integer */
  #endif
 @@ -508,6 +509,20 @@ pack_pack(VALUE ary, SEL sel, VALUE fmt)
         }

         switch (type) {
 +         case 'U':
 +           /* if encoding is US-ASCII, upgrade to UTF-8 */
 +           if (enc_info == 1) enc_info = 2;
 +           break;
 +         case 'm': case 'M': case 'u':
 +           /* keep US-ASCII (do nothing) */
 +           break;
 +         default:
 +           /* fall back to BINARY */
 +           enc_info = 0;
 +           break;
 +       }
 +
 +       switch (type) {
           case 'A': case 'a': case 'Z':
           case 'B': case 'b':
           case 'H': case 'h':
 @@ -1014,6 +1029,20 @@ pack_pack(VALUE ary, SEL sel, VALUE fmt)
         }
      }

 +    OBJ_INFECT(data, fmt);
 +    switch (enc_info) {
 +      case 1:
 +       // TODO
 +       // ENCODING_CODERANGE_SET(data, rb_usascii_encindex(),
 ENC_CODERANGE_7BIT);
 +       break;
 +      case 2:
 +       rb_enc_set_index(data, rb_utf8_encindex());
 +       break;
 +      default:
 +       /* do nothing, keep ASCII-8BIT */
 +       break;
 +    }
 +
      // Taint the ByteString accordingly.
      if (OBJ_TAINTED(fmt)) {
         OBJ_TAINT(data);
 }}}

-- 
Ticket URL: <http://www.macruby.org/trac/ticket/849#comment:5>
MacRuby <http://macruby.org/>



More information about the macruby-tickets mailing list