ruby 1.8.4 feature

ruby 1.8.4 での ruby 1.8.3 からの変更点です。

掲載方針

以下は各変更点に付けるべきタグです。

記号について(特に重要なものは大文字(主観))

目次

Ruby本体

Symbol [bug]

式展開で空のSymbolを作ることができたバグの修正。 ruby-talk:166529[外部]

p :""

# => ruby 1.8.3 (2005-09-21) [i686-linux]
     -:1: empty symbol literal
# => ruby 1.8.4 (2005-12-16) [i686-linux]
     -:1: empty symbol literal

p :"#{""}"

# => ruby 1.8.3 (2005-09-21) [i686-linux]
     :
# => ruby 1.8.4 (2005-12-16) [i686-linux]
     -:1: empty symbol literal
Symbol [bug]

Symbolに適合する文字列を厳密にした。ruby-core:03573,ruby-dev:27478[外部]

1) alias :"foo" :"bar"

    def bar; p "bar"; end
    alias :"foo" :"bar"
    foo

    # => ruby 1.8.4 (2005-12-22) [i686-linux]
         -:2: syntax error, unexpected tSTRING_CONTENT
             alias :"foo" :"bar"
                        ^
         -:2: warning: unused literal ignored
    # => ruby 1.9.0 (2005-12-10) [i686-linux]
         "bar"


2) Symbol#inspect sometimes returns invalid symbol representations:

    puts :"!".inspect
    puts :"=".inspect
    puts :"0".inspect
    puts :"$1".inspect
    puts :"@1".inspect
    puts :"@@1".inspect
    puts :"@".inspect
    puts :"@@".inspect

    # => ruby 1.8.3 (2005-09-21) [i686-linux]
         :!
         :=
         :0
         :$1
         :@1
         :@@1
         :@
         :@@
    # => ruby 1.8.4 (2005-12-22) [i686-linux]
         :"!"
         :"="
         :"0"
         :$1
         :"@1"
         :"@@1"
         :"@"
         :"@@"

3) Symbol#inspect sometimes returns suboptimal symbol representations:
    puts :foo!.inspect
    puts :bar?.inspect

    # => ruby 1.8.3 (2005-09-21) [i686-linux]
         :"foo!"
         :"bar?"
    # => ruby 1.8.4 (2005-12-22) [i686-linux]
         :foo!
         :bar?

4) :$- always treats next character literally:

    p eval(":$-\n") # => :"$-\n"
    p :$-( # => :"$-("
    p :$-  # => :"$- "
    p :$-#.object_id # => 3950350

    # => ruby 1.8.3 (2005-09-21) [i686-linux]
         :"$-\n"
         :"$-("
         :"$- "
         2631438

    # => ruby 1.8.4 (2005-12-22) [i686-linux]
         -:2: syntax error, unexpected '(', expecting $end
super [bug]

Kernelのメソッド内でsuperを呼んだ時に、存在しないsuperclass にアクセスしようとするバグの修正。

module Kernel
  def foo
    super
  end
end

foo

# => ruby 1.8.3 (2005-09-21) [i686-linux]
     -:3:in `foo': method `foo' called on terminated object (0xb7e06970) (NotImplementedError)
        from -:7
# => ruby 1.8.4 (2005-12-22) [i686-linux]
     -:3:in `foo'-:3: warning: too many arguments for format string
     : super: no superclass method `foo' (NoMethodError)
        from -:7
正規表現 [bug]

文字コードの形で正規表現の文字クラスを指定すると、それ以降の バックトラックが効かなくなるバグの修正。ruby-list:41328[外部]

p(/^[a-z]+x[0-9]+$/ =~ "hogex111")
p(/^[\x61-\x7a]+x[0-9]+$/ =~ "hogex111")

# => ruby 1.8.3 (2005-09-21) [i686-linux]
     0
     nil
# => ruby 1.8.4 (2005-12-22) [i686-linux]
     0
     0
シグナル [bug]

シグナルハンドラの実行はクリティカルセクションが終了するまで 遅延されるようになりました。ruby-core:04039

組み込みライブラリ

UnboundMethod#bind [bug]

UnboundMethod#bindされたモジュールのインスタンスメソッド中で superを使えなかったバグを修正しました。ruby-dev:27964[外部]

module Foo
  def initialize
    super
  end
end

class Bar
  include Foo
  def initialize
    Foo.instance_method(:initialize).bind(self).call
  end
end

Bar.new

# => ruby 1.8.3 (2005-09-21) [i686-linux]
     -:3:in `initialize': method `initialize' called on terminated object (0xb7dd2bec) (NotImplementedError)
        from -:10:in `initialize'
        from -:14
# => ruby 1.8.4 (2005-12-16) [i686-linux]
set_trace_func [bug]

クラスメソッドの実行時に、定義されたクラスではなくメタクラスが traceに渡されていたバグの修正。ruby-talk:169307[外部]

set_trace_func [change]

$SAFE=4でtrace_funcの追加を禁止。

printf [bug]

printfのフォーマット指定子にinteger overflowのバグがありました。 perl のそれとは違い、セキュリティバグはないそうです。 <URL:http://www.rubyist.net/~matz/20051207.html#p01>[外部]

# ruby 1.8.4 (2005-12-01) [i686-linux]

# ArgumentError
printf("%2147483648$d\n")       # -e:1:in `printf': invalid index - -2147483648$ (ArgumentError)
printf("%2147483649$d\n")       # -e:1:in `printf': invalid index - -2147483647$ (ArgumentError)
printf("%4294967296$d\n")       # -e:1:in `printf': invalid index - 0$ (ArgumentError)

# overflow
printf("%4294967297$d\n", 1)    # 1
printf("%4294967298$d\n", 1, 2) # 2

# 1.8.4 では、上記例はすべて以下のエラーになります。
# %xx$ に指定できる最大値は 2147483647 です。
# -e:1:in `printf': width too big (ArgumentError)
Hash [bug]

sizeof(long) > sizeof(int) な環境で、ハッシュ関数のオーバー フローのためにStringをキーとしたHashの検索が失敗していたバグの修正。 ruby-core:06721

test [bug]

i-nodeを持たないシステム(Windows等)でtest(?-, ...)が常にtrueを返し ていたバグを修正。ruby-core:06672

File.identical? [new]
FileTest.identical? [new]

test(?-, ...) の代替メソッドとして追加。

File.split [change]
File.basename [change]
File.dirname [change]

UNCパスに対するFile.dirname・File.basename・File.splitの仕様 を変更した(UNCをサポートするプラットフォームのみ)。

File.split("//aaa")      #=> old: ["//", "aaa"]  new:["//aaa", "/"]
File.split("//aaa/")     #=> old: ["//", "aaa"]  new:["//aaa", "/"]
File.split("//aaa/bbb")  #=> old:["//aaa", "bbb"]  new:["//aaa/bbb", "/"]
File.split("//aaa/bbb/") #=> old:["//aaa", "bbb"]  new:["//aaa/bbb", "/"]
File.split("///aaa")     #=> old:["//", "aaa"]  new:["//aaa", "/"]
Dir.glob (Win全般) [bug]

共有フォルダの共有名に対する Dir.glob が失敗していたのを修正。(こ れはWinNT における、ランタイムライブラリの stat のバグだと思う)自 前で stat を実装することで回避した。ruby-list:41552[外部],ruby-dev:27711[外部]

File.basename (Win全般) [change]

不完全なUNCを分割しないようにした。ruby-dev:27797[外部]

File.dirname (Win全般) [bug]

ドライブレターを含むパスに対するFile.dirnameの問題を修正した (ドライブレターをサポートするプラットフォームのみ)。ruby-dev:27738[外部]

File.dirname("C:a/b")  #=> old: "C:a."  new: "C:a"
File.dirname("C:a///") #=> old: "C:a///"  new: "C:a"
File::Stat#pipe? [bug]

VisualC++ 6 では S_IFIFO がなく _S_IFIFO しか定義されていないため、 パイプに対する stat.pipe? が false を返していたのを修正。

Array#fill [bug]

Arrayに対してfillとpopを繰り返すとSEGVするバグを修正しました。ruby-core:06625

String#scan [bug]

String#scanで、全角文字に「*」(0回以上の繰り返し)を付けると、空 文字列にマッチしたときの次の文字が多バイト文字のときにマッチの 開始位置がずれることがあるバグの修正。ruby-dev:27535[外部]

File.join [bug]

NULLポインタを持つStringを渡すとFile.joinがSEGVすることがあった バグの修正。ruby-core:06326

Thread#pass [bug]

Thread#passを呼ぶとThread.criticalがクリアされるようになりました。 ruby-core:04039

Module#const_missing [bug]

const_missingが再定義されていて実行を継続した場合にSEGVする可能性 があったバグの修正。ruby-dev:27331[外部]

IO [bug]

Solaris(64bit?)などでEOF後にゴミを読み出すことがあったバグを修正。 ruby-dev:27334[外部]

添付ライブラリ

Ruby/Tk

MacOS X 上で Aqua 版の Tcl/Tk を用いた際,Aqua 特有のダイアログ表示で フリーズしてしまうという known bug の回避策を記載したドキュメント (ext/tk/README.macosx-aqua) が追加されました.

削除された Tk インタープリタに対して vwait や tkwait での処理待ちを 終了せずに待ち続けてしまう可能性があるというバグを修正しました.

MultiTkIp で生成した Tk インタープリタを削除した後も, 不要となったはずのスレッドが動き続けるバグを修正しました.

Tcl/Tk8.5a3 への対応のため,Tk.pkgconfig_list および Tk.pkgconfig_get が追加されました. 同様に Tcl/Tk8.5a3 への対応のため,テキストウィジェット上のインデック ス指定における新しい modifier である indices に対応しました.

Tcl/Tk 上で名前が規定されている仮想イベントの指定した仮想イベントオブ ジェクトの生成を少し容易にするため,TkNamedVirtualEvent が別名として 定義されました.

Tcl/Tk8.5 への対応のため,仮想イベントのイベント情報の一つである data キーの情報を :data で指定できるようになりました.

セキュリティ上の問題を回避するため,MultiTkIp において IP オブジェクト 上での操作が許可されるのは,その操作を呼び出した環境 (スレッド) の IP オブジェクトがデフォルトの IP オブジェクト (デフォルトのスレッドグルー プに属するもの.require 'multi-tk' の際に生成される) であるか,操作し ようとしている IP オブジェクトが自らの直接の slave IP であるかの場合に 限られるようになりました.

この修正により,IP オブジェクトの入手に成功することで,ある IP が権限 を持たないはずの他の IP を操作できてしまう危険を減少させます.ただし, ObjectSpace にアクセスし,直接に TclTkIp オブジェクトを取り出して操作 されることは回避できませんので,ご注意ください。

Tcl/Tk 上の namespace の扱いが正常に行えないというバグを修正しました.

Ruby のソース上で tcltklib と tk とを Ruby 1.9 系と同様に一体化しました. これにより,tcltklib の生成に失敗した環境で,動くはずのない tk のライ ブラリファイル群がインストールされてしまうことが避けられます. 今後はソースに含まれる tcltklib 関連のドキュメントを参照する場合には ext/tk ディレクトリの下を見てください.

update 処理が不適切であるために,一部の環境で menubar のメニュー項目に 登録した処理が実行されない場合があるというバグ (ruby-1.8.3 で enbug し ていたもの) を修正しました.

ウィジェットオブジェクトの属性参照をした場合に属性値として返すオブジェ クトをより適切なものにするように改善しました.その方がより便利であろう と思いますが,一部の属性において,返されるのが文字列であることを期待し てスクリプトを書いている場合には修正が必要になる場合があります.

例えば bool 値を返す属性については true または false を返すようになり ます.よって,戻り値が "1", "0" の文字列,あるいは 1, 0 の数値であるこ とを期待している場合には修正が必要となります.本来,Tcl/Tk の真偽値は 他にも "true", "false", "yes", "no" などもありますので,値の真偽判定は TkComm.bool (TkUtil.bool) メソッドを使って判定することを推奨します.

また,Tcl/Tk 上の変数が割り当てられている属性において,属性値として Tcl/Tk 上の変数名の文字列ではなく TkVariable オブジェクトが返されるよ うになります.返された値を別のウィジェットの属性値とするなどでそのまま Tk インタープリタに渡している場合や TkVarAccess.new(val) で TkVariable オブジェクト化している場合 (val である TkVariable オブジェクトがそのま ま返されます) には互換性が保たれますが,返された値をそのまま文字列と比 較しているような場合には非互換となります.

REXML [compat]

日本語のエンコーディング変換にiconvよりもnkfを優先して使用するようにし ました。ruby-list:41325[外部], ruby-core:06520

TCPSocket#initialize [bug]
TCPServer#initialize [bug]

Cygwinの場合のみ、使用中socketに対する再acceptがErrno::EADDRINUSE 例外になっていなかった。ruby-core:6765,ruby-bugs:2872,ruby-dev:27818[外部]

optparse

$KCODEで無効なマルチバイト文字列や、改行を含む文字列を引数に渡 すと切り捨てられていたバグの修正。

require "optparse"

puts "[#{ARGV * ', '}]"
ARGV.options do |opt|
  opt.on("-n NODE") {|v| puts v }
  opt.parse!
end

>ruby -v -Ku a.rb -n 時間
ruby 1.8.2 (2004-12-25) [i386-mswin32]
[-n, 時間]
時

>ruby -v -Ku a.rb -n 時間
ruby 1.8.4 (2005-12-16) [i686-linux]
[-n, 時間]
時間
find

broken symbolic link(存在しないファイルに対するシンボリックリン ク)も返すようになりました。ruby-talk:165866[外部]

Iconv

errnoが正しくセットされなかったときの例外を追加(Windowsで iconv.dllの使用するMSVC runtime DLLのバージョンが、ruby本体が使 用するものと一致していない場合も含む)

これはrubyやext/iconv自身のバグではなくて、実行時の環境に問題が ある場合の回避策です。

WEBrick::Config::FileHandler [compat]

WEBrick::Config::FileHandler[:UserDir]のデフォルト値が "public_html"からnilになり、意図せずにユーザディレクトリ (/~user/public_html)以下が公開されることがなくなりました。 [webrickja:148]

WEBrick

WEBrick::CGI#startでreq.query_stringがオリジナルの QUERY_STRINGを指すように。

WEBrick::HTTPRequest#query_string= [new]

メソッド追加。

Readline [bug]

IO以外を$stdoutにセットするとreadlineでSEGVしていたバグの修正。ruby-core:6089

Syck [bug]

syck のメモリバグを修正。ruby-dev:27384[外部], ruby-core:6385 ruby-dev:27839[外部]

irb [bug]

irbのプロンプトに改行文字が含まれているときにオートインデントが ずれるバグの修正。ruby-core:06358

RDoc [bug]

正規表現のバックトラックが深くなりすぎて失敗することがあったバグを修正。 ruby-talk:161771[外部]

Win32API [bug]

DNSを手動で複数設定した場合に正しく動作していなかったバグを修正。 ruby-list:40058[外部], ruby-dev:27496[外部]

Rinda [bug]

Hash全体がdumpできないオブジェクトとして扱われていました。 ruby-list:41227[外部]

Iconv [compat]

iconv/charset_alias において、Windows上でもencoding名の別名テー ブルを生成するようにした。

iconv/charset_alias は、エンコーディング名のプラットフォームに よる違いを吸収するためのユーティリティです。詳細は、iconv 参照。

cgi [bug]

NOKIAの携帯(?)からのCookieを正しくパースできなかった問題の修正。 ruby-Patches:2595, ruby-core:06183

DL [bug]

FILEが不完全型としてしか定義されない環境に対応。ruby-dev:27317[外部]

fileutils [bug]

FileUtils::NoWrite, Verbose, DryRun のメソッドが呼べなくなっていた のを修正しました。ruby-core:05954

extmk, mkmf [compat]

--with-extention オプション追加。ruby-dev:27449[外部]

mkmf: find_executable() [compat]

実行ファイルを探索するときに環境変数 PATH がセットされてい ない場合を考慮しました。ruby-dev:27281[外部]

PATH がセットされていない場合は、

/usr/local/bin:/usr/ucb:/usr/bin:/bin

をPATHの代わりに利用してここからコマンドを探索します。

拡張ライブラリAPI

rb_funcall2() [bug]

拡張ライブラリ(C言語)からRubyメソッドを呼ぶ関数 rb_funcall2() が (private メソッドを呼べるのに) protected メソッド を呼べない不具合を修正しました。ruby-dev:27890[外部]

rb_respond_to() [change]

rb_respond_to()をObject#respond_to?のデフォルトの動作と同じ(public メソッドにしか反応しない)にした。ruby-dev:27411[外部]

rb_obj_respond_to() [new]

追加。rb_respond_to() と異なり可視性を指定できる。ruby-dev:27408[外部]

プラットフォーム固有

bccwin32 [bug]

bccwin32 で winsock のエラーを表示するとき、strerror の返すエラー メッセージの途中に改行が入るために、ruby の出力するエラーメッセー ジが壊れていたのを修正。

cygwin [bug]

cygwin環境で、RUBYLIB環境変数が空だと、$LOAD_PATHにゴミが入る。 ruby-dev:27830[外部]

BeOS [bug]

BeOS でのいくつかのテスト失敗に対処。link(2) が定義されていながら 常に失敗するので test/fileutils が誤動作していたのに対処。BeOS に は link(2) は存在しないと見なすようにした。chown、fchown に id と して -1 を渡した場合は、POSIX 的には id を変更すべきでないが、BeOS では (unsigned) -1 に変更してしまっていた。これに対処。ruby-dev:27672[外部]

Sun [bug]

Sunのコンパイラで拡張ライブラリをリンクできなかった問題の修正。ruby-dev:27603[外部]

IA64 [bug]

IA64 で、Qtrue Qfalse Qnil が 64bit 整数でなく 32bit 整数として定 義されていたため、ANYARGS を通して Qtrue を渡し、VALUE で受けると、 サイズの違いから値が壊れることのあった問題を修正。ruby-dev:27513[外部]