Bug #8698
closedレシーバに不正なバイト列が含まれている場合にString#each_lineや#linesの挙動が引数の有無で変わってしまう
Description
String#each_lineや#linesは、レシーバに不正なバイト列が含まれている場合に引数無しで呼ばれると例外を発生させませんが、
引数を与えると例外を発生させます。
invalid_str = "\x80" * 3
invalid_str.each_line {} # no error
invalid_str.each_line("foo") {} # invalid byte sequence in UTF-8 (ArgumentError)
invalid_str.lines # no error
invalid_str.lines("foo") # # invalid byte sequence in UTF-8 (ArgumentError)
レシーバに不正なバイト列が含まれている場合の挙動が引数の有無で変わってしまうというのは、仕様のバグではないでしょうか。
String#each_lineや#linesは引数を渡さずに使われる場合が多いと思うので、そちらの挙動に寄せて
「String#each_lineや#linesはレシーバに不正なバイト列が含まれていても例外を発生させない」という仕様に統一する事を提案します。
添付のpatchは引数の有無に関わらずrb_memsearch()を使って検索を行う事で上記の仕様に統一したもので、[Feature #7368]で提案している
patch3.diffに少し手を加えたものです。また、test/ruby/test_m17n_comb.rbに引数を与えて#each_lineを呼ぶと例外が発生する事を期待している
テストがあるので、その部分を削っています。
Files
        
           Updated by ko1 (Koichi Sasada) about 12 years ago
          Updated by ko1 (Koichi Sasada) about 12 years ago
          
          
        
        
      
      - Assignee set to naruse (Yui NARUSE)
        
           Updated by naruse (Yui NARUSE) about 12 years ago
          Updated by naruse (Yui NARUSE) about 12 years ago
          
          
        
        
      
      - Status changed from Open to Assigned
        
           Updated by naruse (Yui NARUSE) about 12 years ago
          Updated by naruse (Yui NARUSE) about 12 years ago
          
          
        
        
      
      - Assignee changed from naruse (Yui NARUSE) to Glass_saga (Masaki Matsushita)
コミットして下さい
        
           Updated by Anonymous about 12 years ago
          Updated by Anonymous about 12 years ago
          
          
        
        
      
      - Status changed from Assigned to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r42966.
Masaki, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
- 
string.c (rb_str_enumerate_lines): make String#each_line and 
 #lines not raise invalid byte sequence error when it is called
 with an argument. The patch also causes performance improvement.
 [ruby-dev:47549] [Bug #8698]
- 
test/ruby/test_m17n_comb.rb (test_str_each_line): remove 
 assertions which check that String#each_line and #lines will
 raise an error if the receiver includes invalid byte sequence.