ruby-trunk-changes r47907 - r47916

今日は Enumerable#max(n), #max_by(n) の結果のソート順の変更、dynamic symbol の管理方法の変更などがありました。

akr: r47907 2014-10-14 01:30:07 +0900

Enumerable#max(n) や #max_by(n) で上位 n 個を配列で返す時に昇順で返していたので、降順にソートして返すようにしています。 [ruby-core:65452] [Feature #8887]

nagai: r47908 2014-10-14 02:32:17 +0900

拡張ライブラリ tk で Tcl/Tk 8.6.2 のサポートを追加しています。 "Tcl/Tk8.6 support is experimental" とあるので EXPERIMENTAL な機能で、DUMP1() などで -d オプション時のデバッグ情報の出力を追加しています。

zzak: r47909 2014-10-14 05:16:07 +0900

ext/date/lib/date.rb のインデントの修正のみ。

akr: r47910 2014-10-14 07:36:17 +0900

r47907 の変更に追随して Enumerable#max(n) や #max_by(n) の rdoc 用コメントのサンプルの評価結果を修正しています。

normal: r47911 2014-10-14 10:21:48 +0900

Hash リテラルのキーに文字列リテラルを使った時に最適化命令が利用される動作について、メソッドの再定義による脱最適化が動作していることのテストを追加しています。

nobu: r47912 2014-10-14 16:23:01 +0900

symbol.c の rb_str_dynamic_intern() を rb_str_intern() と改名して、string.c で定義していた rb_str_intern() は削除しています。 rb_str_intern() は拡張ライブラリ json や win32ole でも少し使われていたみたいですが、この時の Symbol が dynamic symbol になっても、必要に応じて(SYM2ID() を呼ばれるなどすると) pindown されるので、基本的には拡張ライブラリで文字列から作った Symbol も dynamic になるはず。

nobu: r47913 2014-10-14 16:23:08 +0900

Symbol GC 絡みで dynamic symbol の管理方法を変更しています。かなりがらっと変えていて大きな方針変更みたいです。 pindown という名前はなくなっているので、dynamic symbol から SYM2ID などで ID 化されたものを管理するのはやめて、dynamic symbol も一部 mask された id を持つようにしているっぽいです。これ dynamic symbol を作るたびに ID の番号が消費(インクリメント)されていつかオーバフローすることにならないんですかね? ああいや、ID が振られるのはこれまでの pindown 相当のこと(rb_sym2id() を呼ぶ)をした時だけなのか。
symbol.h には rb_intern_cstr_without_pindown() のプロトタイプ宣言が残っていますね。

nobu: r47914 2014-10-14 16:23:14 +0900

r47913 の追加変更。 global_symbols に格納する文字列とSymbolの対応表を struct id_entry という C の構造体の配列にしていたのを Ruby の Array オブジェクトを使って管理するように変更しています。Array の要素に 512ごのと Array オブジェクトを格納して、そこに String と Symbol を交互に格納という感じみたいです。 write barrier の挿入のためとのこと。

suke: r47915 2014-10-14 19:16:17 +0900

拡張ライブラリ win32ole の WIN32OLE_RECORD の実装も struct RTypedData を利用するようにきりかえています。

nobu: r47916 2014-10-14 21:39:17 +0900

tool/rbinstall.rb でインストールした gem パッケージの gemspec ファイルのパーミッションを 0644(もしくは --data-mode で指定されたモード)に変更するようにしています。元は他ユーザから書き込み可能になる場合があったようです。手元では再現しませんでしたけど。 [ruby-core:65700] [Bug #10383]