ruby-trunk-changes r53728 - r53740

今日は標準添付ライブラリ cgiCGI.escape の拡張ライブラリ化による高速化などがありました。

duerst: r53728 2016-02-04 11:54:02 +0900

common.mk の Unicode 定義用ファイルのパスの指定のための変数 UNICODE_DATA_DIR と UNICODE_SRC_DATA_DIR を導入しています。

svn: r53729 2016-02-04 11:54:03 +0900

version.h の日付更新。

nobu: r53730 2016-02-04 12:16:50 +0900

include/ruby/encoding.h の rb_enc_asciicompat() の定義を rb_enc_asciicompat_inline() という inline 関数に切り出してこの呼び出しにマクロ展開されるようにしています。引数が複数回評価されるのを避けるためとのこと。

nobu: r53731 2016-02-04 12:39:12 +0900

r53220 で標準添付ライブラリ cgiCGI.escapeHTML の実装を ASCII compatible な時に拡張ライブラリで実装して高速化したのと同様に CGI.escape の実装も拡張ライブラリに移動して高速化しています。 https://github.com/ruby/ruby/pull/1238

nobu: r53732 2016-02-04 12:40:41 +0900

r53731 の CGI.escape 最適化の拡張ライブラリで変数の初期化追加。また冗長な modified 変数は dest をチェックするようにリファクタリングしています。 https://github.com/ruby/ruby/pull/1238

nobu: r53733 2016-02-04 14:10:36 +0900

r53731 の CGI.escape の拡張ライブラリ化で CHAR_BIT が8以上ある環境を考慮して上位4bitを得る時にビットマスクを追加しています。 https://github.com/ruby/ruby/pull/1238

duerst: r53734 2016-02-04 14:42:35 +0900

common.mk の UNICODE_FILES に SpecialCasing.txt というファイルを追加してこれもダウンロードするようにしています。名前からして大文字小文字の対応についての例外的な扱いについて記述されているファイルでしょうね。

nobu: r53735 2016-02-04 15:34:10 +0900

r53734 のように common.mk の UNICODE_FILES にファイルが追加される時に行末の行継続のためのバックスラッシュの追加で追加する前の行も変更しないといけなくなってしまうので、末尾に $(empty) という参照を追加して全ての行で行継続しておくようにしています。

nobu: r53736 2016-02-04 15:35:34 +0900

string.c に内部的に利用する API rb_fstring_enc_new() および rb_fstring_enc_cstr() を追加して、rb_encoding の指定つきで fstring を登録することができるようにして、正規表現オブジェクトの生成時に元になる正規表現の文字列を登録する時に rb_fstring() ではなく rb_fstring_enc_new() を使って文字列のコピーなしで fstring 化できるように最適化しています。しかし後に r53738 で正規表現の最適化部分は revert されています。

nobu: r53737 2016-02-04 15:44:55 +0900

正規表現Regexp#source で元になった正規表現文字列表現を返す時に struct RRegexp::src を rb_str_dup() を使って複製することでバッファを共有した文字列を返すようにしています。

nobu: r53738 2016-02-04 15:46:28 +0900

r53736 で正規表現の src を新規追加した API rb_fstring_enc_new() を使って fstring 化してたのをやめています。ここで渡されている文字列が書き変わらないバッファとは限らないのでコピーは必須だったようです。新規追加した API の実装自体は残されています。

nobu: r53739 2016-02-04 17:38:06 +0900

r53738 で revert した r53736 の正規表現の src の設定のリベンジ。 rb_reg_initialize() で struct RRegexp::src をセットしていたのを rb_enc_reg_new() に移動して、rb_reg_init_str_enc() という encoding 指定つきの初期化関数を導入しています。結局 rb_fstring_enc_new() は使ってないんですね。

duerst: r53740 2016-02-04 21:05:23 +0900

r53562 の Unicode の Encoding での String#downcase などの大文字小文字についての変換のオプション対応で onigenc_unicode_case_map() で :ascii オプションが指定されていたら :turkish などの特別処理をしないように条件を追加しています。