Hatena::ブログ(Diary)

PB memo このページをアンテナに追加 RSSフィード

2014-04-18 ruby-trunk-changes r45615 - r45635

[][]ruby-trunk-changes r45615 - r45635

今日は文字列まわりで内部的にいろいろ変更があって、codepage の検出の最適化や、一時的に部分文字列の共有化の条件の緩和(そのかわり RSTRING_PTR() が '\0' で終わらない場合があるようになる)がありました。今はやっぱりこれまで通り文字列の末尾を共有する時だけ共有文字列を使えるようになっています。

nobu: r45615 2014-04-18 08:50:20 +0900

r45598 で POSIX.1-2001 の拡張である getcwd(3) の引数に NULL を渡してライブラリ関数内でメモリ確保してもらう機能を使うようにしましたが、Solaris で動かなかったそうで configure でチェックして使えない時は NO_GETCWD_MALLOC マクロを定義するようにしています。 [ruby-core:62072] [Bug #9752]

svn: r45616 2014-04-18 08:50:24 +0900

version.h の日付更新。

naruse: r45617 2014-04-18 15:42:51 +0900

文字列の文字数計算の UTF-8 用特別処理(高速化のための)を str_strlen() から enc_strlen() に移動しています。 関数呼び出しのより深い位置にあるエンコーディング毎の処理を書いているところに移動しているようです。

naruse: r45618 2014-04-18 15:43:08 +0900

文字列の文字数をカウントする str_strlen() で一度 rb_enc_strlen_cr() で coderange がわかったら struct RBasic::flags にセットして次回からはそれを利用して直接 enc_strlen() を呼んで高速化するようにしています。

naruse: r45619 2014-04-18 15:43:11 +0900

str_strlen() の第2引数に NULL を渡したら第1引数文字列エンコーディングを利用するようにして、明示的に str_strlen(str, STR_ENC_GET(str)); のように渡していたところを NULL 渡しに変更しています。

naruse: r45620 2014-04-18 15:43:29 +0900

同じく文字列長カウントに関する関数 search_nonascii()、count_utf8_lead_bytes_with_word()、enc_strlen()、str_utf8_nth() などでなぜか文字列ポインタを VALUE * で扱っていたところがあったのを uintptr_t * を使うように変更しています。 ワード幅で処理して高速化しているのでしょうけど。

nobu: r45621 2014-04-18 16:55:04 +0900

文字列を連結する str_buf_cat() で rb_str_modify() を呼んでいたところを coderange を保持するように str_modify_keep_cr() の呼び出しに変更しています。 けど文字列追加したら coderange の再検索必要になるような気がしますけど…

nobu: r45622 2014-04-18 17:00:04 +0900

rb_str_modify_expand() で ENC_CODERANGE_CLEAR() で flags に記憶している coderange をクリアしているのを ENC_CODERANGE_BROKEN の時だけにしています。こっちは文字列の内容は(まだ)変更していないのでいいのでしょうけど、今までここでクリアしてたから追記時にクリアしてない箇所があったりしそう…。

nobu: r45623 2014-04-18 17:17:44 +0900

やっぱり 45621 の str_buf_cat() での rb_str_modify() -> str_modify_keep_cr() の変更は revert しています。 str_buf_cat() では coderange を再検索していないので coderange のクリアが必要でした。

nobu: r45624 2014-04-18 17:27:09 +0900

r45622 も revert しています。やっぱり後で coderange を変更してないところがあったっぽいですね。

nobu: r45625 2014-04-18 20:46:02 +0900

拡張ライブラリ zlib の zstream_shift_buffer() でバッファに使っている文字列オブジェクトから rb_str_subseq() と rb_obj_reveal() を使って無理矢理内部的オブジェクトのコピーを作っていたのを rb_str_new() で単にバッファからコピーを作るように修正しています。

nobu: r45626 2014-04-18 20:46:04 +0900

拡張ライブラリ openssl文字列オブジェクトから NUL-terminated な C の文字列を取り出すべく StringValueCStr() を呼び出すようにしています。そういえば RSTRING_PTR() って NUL-terminated という保証はないんでしたっけ(実際にはされてたと思いますが)。

nobu: r45627 2014-04-18 21:42:04 +0900

README.EXT の Appendix B に関数マクロ RSTRING_LEN() と RSTRING_PTR() についての言及を追加して、RSTRING_PTR() は NUL-terminated とは限らないということを書いています。また StringValueCStr() で取得できる char * な文字列は NUL-terminated が保証されることも追記しています。

nobu: r45628 2014-04-18 21:48:26 +0900

部分文字列を作る時に共有文字列オブジェクトを生成する場合、文字列の途中までの部分文字列はこれまで NUL-terminated にするために共有できなかったのですが、それも可能にしています。このため RSTRING_PTR() が NUL-terminated とは限らないケースが実際に発生するようになっています、これはかなり影響デカい。と思ったら後でやっぱり当面はやめるようにしているみたいです。

nobu: r45629 2014-04-18 23:27:22 +0900

r45628 で文字列の途中までの部分文字列を共有文字列で実現できるようになったのを受けて parse.y の lex_get_str() でスクリプト全体の文字列から1行ずつコピーするのではなくて rb_str_subseq() で部分文字列として切り出すようにしています。

nobu: r45630 2014-04-19 00:09:49 +0900

time.c の month_arg()、time_strftime() などで RSTRING_PTR() が NUL-terminated であることを前提とした部分があったので RSTRING_LEN() を考慮した処理に修正しています。

svn: r45631 2014-04-19 00:09:53 +0900

version.h の日付更新。

nobu: r45632 2014-04-19 00:11:35 +0900

NEWS、README.EXT などで NULL-terminated -> NUL-terminated と typo 修正しています。

nobu: r45633 2014-04-19 00:17:21 +0900

SHARABLE_SUBSTRING_P() という文字列の部分文字列が共有文字列で共有できるかを判定するマクロを追加して、デフォルトではこれまで通り文字列の末尾部分のみ共有できるように戻しています。いずれは途中までの部分文字列も共有化したいとのこと。

akr: r45634 2014-04-19 00:46:32 +0900

rb_big2ulong()、rb_num2ulong() や rb_big2long()、rb_num2long() がそれぞれ VALUE や SIGNED_VALUE 型を返すように宣言されていたのを long/unsigned long を返すように宣言を変更しています。 なんか当初は理由があったんだったような気もしますけど、xxx2long() が long を返してなかったというのはトラップですよね。

nobu: r45635 2014-04-19 00:51:06 +0900

r45634 の ChangeLog エントリの行末の空白を除去しています。

2014-04-17 ruby-trunk-changes r45604 - r45614

[][]ruby-trunk-changes r45604 - r45614

今日は主に文字列連結の C API の名前の変更(旧APIも別名として保持)やそれに関連してリファクタリングなどがありました。

nobu: r45604 2014-04-17 10:03:55 +0900

FileUtils.cp の rdoc 用コメントの :preserve オプションについての記述を修正しています。 [ruby-core:62065] [Bug #9748]

svn: r45605 2014-04-17 10:04:00 +0900

version.h の日付更新。

nobu: r45606 2014-04-17 11:41:34 +0900

string.c の rb_str_cat2() から rb_str_cat() を呼び出しそこで引数 len のチェックをしていたのを、rb_str_buf_cat2() を呼び出すようにして重複しているチェックを省略するようにしています。

nobu: r45607 2014-04-17 11:41:36 +0900

r45606 からの流れっぽいですが rb_str_cat() と rb_str_cat() がそれぞれ rb_str_buf_cat() と rb_str_buf_cat2() を呼ぶだけのただのラッパだったのを RUBY_ALIAS_FUNCTION() というマクロを使って定義するようにしています。 r40998 で導入されたマクロgcc 拡張機能を利用するもののようですね。

nobu: r45608 2014-04-17 11:41:39 +0900

configure.in の変更で、よく理解しきれてないのですが、RUBY_FUNC_ATTRIBUTE の検出方法の書きかたの修正と、FUNC_MINIMIZED という optimize("-Os","-fomit-frame-pointer") という最適化の属性を設定する gcc 拡張のマクロを定義するようにして、RUBY_ALIAS_FUNCTION_TYPE マクロの定義で利用するようにしています。ラッパ関数で余計なframeを発生させないようにしているのでしょうか。

nobu: r45609 2014-04-17 14:22:57 +0900

文字列連結の公開 API rb_str_buf_cat2() を rb_str_cat_cstr() と改名して rb_str_buf_cat2() は RUBY_ALIAS_FUNCTION マクロを使ってその別名として定義するようにしています。同様に rb_str_buf_cat() も rb_str_cat() と改名しています。 README.EXT/README.EXT.ja にも rb_str_cat_cstr() の記述を追加しています。

nobu: r45610 2014-04-17 14:23:00 +0900

rb_str_cat_cstr() にも引数の ptr が NULL でないかのチェックを追加しています。このために他の xxx_cstr() 関数にあったチェック部分を must_not_null() という関数に切り出して共有するようにしています。

hsbt: r45611 2014-04-17 15:53:05 +0900

template/opt_sc.inc.tmpl, template/optinsn.inc.tmpl, template/optunifs.inc.tmpl などの VM 用のファイルを生成するためのテンプレートのコメントに書かれている生成ツール insns2vm.rb のファイルパスを修正しています。 https://github.com/ruby/ruby/pull/595

hsbt: r45612 2014-04-17 16:31:43 +0900

prelude.rb というインタプリタ起動時に実行される Ruby スクリプトインタプリタ自体に埋め込まれているのですが、その中のコメントの Thread.exclusive のコメントを修正しています。1.9 からはもうなくなった Thread.critical をベースにした記述になっているので、Mutex ベースの実装にあわせて記述を修正しています。 https://github.com/ruby/ruby/pull/589

nobu: r45613 2014-04-17 17:24:10 +0900

gc.c の環境変数取り込みの関数 get_envparam_size() でコンパイラ警告の除去のため明示的なキャストを追加しています。

nobu: r45614 2014-04-17 17:24:15 +0900

詳細は追っていませんが、起動時のライブラリロードパスの処理で古い Cygwin 用の特別な処理をしていたところを消して、古い(どのくらいかは不明ですが) Cygwin サポートををやめています。

2014-04-16 ruby-trunk-changes r45593 - r45603

[][]ruby-trunk-changes r45593 - r45603

今日は拡張ライブラリ opensslメモリリーク修正、昨日の Enumerable#each_slice, #each_cons の最適化の際のバグ修正や getcwd(3) を使うときのメモリ確保戦略の変更などがありました。

nobu: r45593 2014-04-16 01:23:07 +0900

おそらく r45592 の変更で win32/win32.c で使っている NtCmdLineElement という構造体の len メンバの型が合わなくなったので int -> long に変更しています。

svn: r45594 2014-04-16 01:23:11 +0900

version.h の日付更新。

nobu: r45595 2014-04-16 09:51:18 +0900

拡張ライブラリ opensslOpenSSL::PKey#verify で EVP_MD_CTX_cleanup() の呼び忘れによるメモリリークがあったのを修正しています。 [ruby-core:62038] [Bug #9743]

nobu: r45596 2014-04-16 11:46:51 +0900

dln_find.c で #if defined(_WIN32) で分岐して環境変数 PATH のセパレータを ";" と ":" どちらを使うかを切り替えていたのを PATH_SEP という定数マクロを利用するようにリファクタリングしています。ちなみに PATH_SEP は include/ruby/defines.h で定義されています。

nobu: r45597 2014-04-16 11:46:53 +0900

win32/win32.c で CharNext() を関数マクロとして定義して CharNextExA() 関数(参考URL: http://msdn.microsoft.com/ja-jp/library/cc410671.aspx) を呼び出すようにして code page を意識した処理をするようにしているそうです。

nobu: r45598 2014-04-16 17:46:29 +0900

POSIX.1-2001 で getcwd(3) は引数に NULL を渡すと内部でメモリ確保して返すそうで、NO_GETCWD_MALLOC というマクロが定義されていなければ getcwd(3) にメモリ確保をまかせるようにして ruby_getcwd() で xmalloc()/xrealloc() でメモリ確保するのをやめています。 NO_GETCWD_MALLOC は特に configure で定義したりしてる様子はないのですが、対応していない環境とかないんですかね…。

nobu: r45599 2014-04-16 17:46:31 +0900

MANGLED_PATH というマクロが定義されている時(どうやら Symbian では定義されていたらしい)に RUBYLIB_PREFIX という環境変数を利用した処理をしていたのは既に利用されていないので関数毎削除しています。なんか昔この処理なにやってるんだろうとひとしきり読んだ後で通ってないことに気がついてがっくりしたようなことがあった気がします。

nobu: r45600 2014-04-16 23:16:19 +0900

標準添付ライブラリ fileutils の FileUtils.cp のテストで、権限情報がコピーされることを確認するテストなのに :preserve オプションが指定されていないテストがあったので明示的に true を指定するようにしています。

nobu: r45601 2014-04-16 23:30:21 +0900

と思ったら r45600 の FileUtils.cp のテストの変更を revert しています。あれ? と思いましたがこのテストは [Bug #4507] のチケットのためのテストで、明示的に :preserve が指定されなくてもデフォルトの挙動が preserve: true になっていることを確認するためのテストだったので、明示的にオプションを追加してしまってはいけないのでした。

nobu: r45602 2014-04-16 23:44:46 +0900

なんとこれまで Enumerable#each_slice と Enumerable#each_cons のテストがなかったようで(Enumerator と Enumerator::Lazy のはあった) test/ruby/test_enum.rb にテストメソッドを追加しています。なんとなく昨日の r45589 の変更を考えるとブロックパラメータを複数にしたケースも追加したほうが良いような気がしますね…と思ったら次でちゃんと追加されてました。

nobu: r45603 2014-04-16 23:47:38 +0900

r45602 で追加した Enumerable#each_slice と Enumerable#each_cons のテストにブロックパラメータが負の arity を持つ(*args のような可変長のブロックパラメータを受けつける記法を使った)時のテストケースを追加しています。 r45589 の中間オブジェクトの抑制で arity の判定に問題があって内部的な Array オブジェクトRuby スクリプトで見えてしまっていたそうです。 [ruby-core:62060] [Bug #9749]

2014-04-15 ruby-trunk-changes r45588 - r45592

[][]ruby-trunk-changes r45588 - r45592

今日は Enumerable#each_slice、 #each_cons で内部の一時オブジェクト生成抑制による効率化や Windows 版のコマンドライン処理の内部的な変更などがありました。

kazu: r45588 2014-04-14 22:43:10 +0900

r45587 の ChangeLogtypo 修正

nobu: r45589 2014-04-15 12:49:55 +0900

Enumerable#each_slice と Enumerable#each_cons で渡されたブロックのブロックパラメータが2つ以上の時は内部で一時的に利用しているArrayオブジェクトを使いまわすようにして一時オブジェクトの生成を抑制するようにしています。 https://github.com/ruby/ruby/pull/596

svn: r45590 2014-04-15 12:49:59 +0900

version.h の日付更新。

akr: r45591 2014-04-15 19:29:01 +0900

ext/extmk.rb で extmk.mk の再生成をする時に一時ファイルに書き出してから内容をチェックして rename するようにすることで、複数のプロセスから同時に変更しようとして競合するのを避けるようにしています。 make test-all を並列で動かした時に問題が起きるのに対処しているそうです。

usa: r45592 2014-04-15 19:39:36 +0900

Windows 環境でコマンドライン引数を処理しているとおぼしき rb_w32_cmdvector() という関数を内部的な関数 w32_cmdvector() と改名し、コマンドライン文字列を GetCommandLine() ではなく GetCommandLineW() で取得して const WCHAR * で渡すようにしています。これに対応して引数に code page も追加して、関数内の文字列の比較等の処理も WCHAR * 用のものに変更しています。これによる動作の変化はまだないはず(ないといいなぁ、くらいかも)とのことです。

知らなかったのですが Windows 環境では main() 関数が受け取る argc, argv は rb_w32_sysinit() という関数で独自にコマンドライン文字列から読みとったもので置き換えられているんですね。

2014-04-14 ruby-trunk-changes r45581 - r45587

[][]ruby-trunk-changes r45581 - r45587

今日は文字列の連結時のエンコーディング回りの変更や UnboundMethod#bind したメソッド内の super の不具合修正などがありました。

nobu: r45581 2014-04-14 14:33:40 +0900

文字列オブジェクト文字列を連結する rb_enc_cr_str_buf_cat() でエンコーディングは同じで、連結先の文字列の coderange が不明の時に連結する文字列の coderange も不明としていたのをやめています。なにやらよくわかりませんが多分続く変更の布石でしょう。と思ったけど特に続いてないですね…

nobu: r45582 2014-04-14 14:33:42 +0900

rb_enc_cr_str_buf_cat() で同じ rb_enc_from_index() を複数回呼んでいたところを結果をローカル変数に格納して共有するようにして呼び出し回数を減らしています。

svn: r45583 2014-04-14 14:33:45 +0900

version.h の日付更新。

nobu: r45584 2014-04-14 16:59:42 +0900

rb_obj_is_kind_of() からあるクラスの継承ツリー上に指定のクラスを検索する処理を rb_class_search_ancestor() として切り出して、rb_class_inherited_p() でもこれを利用するようにしています。 次の r45585 とも関係しているかも。

nobu: r45585 2014-04-14 17:20:10 +0900

UnboundMethod#bind で既に必要な IClass が存在していたら挿入しないようにしています。 UnboundMethod#bind した Method を call したメソッド中の super の呼び出しが失敗するのを修正した r45565 で今度はメソッド探索で無限ループに陥る不具合があったそうで、その修正になります。 [ruby-core:62014] [Bug #9721]

naruse: r45586 2014-04-14 19:08:02 +0900

addr2line.c で実行中のプログラムの実行形式ファイルのパスを取得する方法の FreeBSD 版の実装を追加しています。 sysctl(3) で {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1} というのを指定すると取れるそうです。なおコミットログによるとプログラムを呼び出す側がセットしておくものっぽくて、sh, csh, tcsh, bash, zsh はセットしてくれるけど gdb はしてくれない、と書いてある気がします。

naruse: r45587 2014-04-14 19:08:04 +0900

addr2line.c の C level backtrace 取得で fill_lines() がベースアドレスを返すようにして r45563 で導入した dladdr_fbases に格納するようにしています。 PIE でなかった時にこれまで呼び元で traces のアドレスを元に dladdr(3) を呼んでいたのを fill_lines() の中で .dynsym/.dynstr のセクションの情報を元に dladdr(3) を呼んでいるのでその結果を返して使いまわすようにしたということかなと思います。