Project

General

Profile

Actions

Bug #8698

closed

レシーバに不正なバイト列が含まれている場合にString#each_lineや#linesの挙動が引数の有無で変わってしまう

Added by Glass_saga (Masaki Matsushita) over 11 years ago. Updated about 11 years ago.

Status:
Closed
Target version:
ruby -v:
ruby 2.1.0dev (2013-07-28 trunk 42211) [x86_64-linux]
[ruby-dev:<unknown>]

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

patch.diff (4.55 KB) patch.diff Glass_saga (Masaki Matsushita), 07/28/2013 05:14 PM

Related issues 1 (0 open1 closed)

Related to Ruby master - Feature #7368: rb_str_each_line()のパフォーマンス向上とリファクタリングClosednaruse (Yui NARUSE)11/16/2012Actions

Updated by ko1 (Koichi Sasada) over 11 years ago

  • Assignee set to naruse (Yui NARUSE)

Updated by naruse (Yui NARUSE) about 11 years ago

  • Status changed from Open to Assigned

Updated by naruse (Yui NARUSE) about 11 years ago

  • Assignee changed from naruse (Yui NARUSE) to Glass_saga (Masaki Matsushita)

コミットして下さい

Actions #4

Updated by Anonymous about 11 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.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0