ruby-trunk-changes 2020-07-07

今日はオブジェクトを格納する page のサイズをシステムのページサイズx4 よりちょっと小さくしていたオフセットをなくす変更などがありました。

[2c6512fe67] Jean Boussier 2020-06-27 21:10:42 UTC

file.c の rb_check_realpath_internal() という関数で Linux または macOS 以外の環境でのみ必要な stat(2) の呼び出しを preprocessor の分岐で括っています。 realpath(3) が成功してるからもう不要なはずということですが一部の環境(OS)では realpath(3) が実際には存在しないファイルパスを返す可能性があるためのチェックとのことです。 https://github.com/ruby/ruby/pull/3267

[b02a9584a1] git 2020-07-06 15:26:58 UTC

version.h の日付更新

[b06a4dc6f1] Aaron Patterson 2020-06-25 22:20:25 UTC

オブジェクトの実体である struct RVALUE を配列状につめこむ heap の領域(page)を確保する時に、malloc() が返すアドレスの前にメタデータを格納する領域を使うという前提で REQUIRED_SIZE_BY_MALLOC という定数で定義しているサイズぶん page のサイズを減らしてたのをやめています。ひとつには jemalloc() を使っている場合はメタデータは専用のページに作られるため単に無駄な隙間になってしまうというのと、glibc の実装の場合は確保した領域が OS 管理の page をまたがってしまうことがある(このため ruby のメモリ管理上の page が OS の page を余分に多くまたがってしまうのでパフォーマンス悪化に繋りうる)こと、さらに現在可能な場合は posix_memalign() などで OS の page に align して確保するようになっているため、実はメタデータが OS 管理側の page でひとつ前のところに乗ってしまって意図したようになってないという問題があるそうです。jemalloc() のほうはいいけど posix_memalign() の時の問題はこれでは解決しなさそうな気もするけどどうなんだろ。 [ruby-core:99000] [Feature #17002]

ruby-trunk-changes 2020-07-06

今日は拡張ライブラリ bigdecimal の更新や Struct のメンバー参照メソッドの JIT 向け最適化(メンバー数が多い時のみ)などがありました。

[6236bbf363] Nobuyoshi Nakada 2020-07-05 12:59:22 UTC

拡張ライブラリ bigdecimal のテスト test/bigdecimal/test_bigdecimal.rb で重複したテスト内容があったようで一方を削っています。

[41fef191d1] Nobuyoshi Nakada 2020-07-05 13:08:04 UTC

tool/sync_default_gems.rb に対象の default gem として bigdecimal を追加しています。

[988b4bc9ea] git 2020-07-05 15:28:53 UTC

version.h の日付更新

[8e189df32c] manga_osyo 2020-07-05 11:58:55 UTC

RubyVM::AbstractSzyntaxTree.of で OP_ASGN2 ノードの子要素がひとつ足りてなかった不具合を修正しています。 "+=" みたいな演算子つき代入の syntax sugar に対応したノードですね。

[1aed23c18d] Nobuyoshi Nakada 2020-07-05 15:33:03 UTC

tool/sync_default_gems.rb の commit hash の範囲指定による cherry pick 指示に複数の範囲を同時に指定できるように機能拡張しています。

[d69510b6cd] Nobuyoshi Nakada 2020-07-05 16:14:42 UTC

ext/bigdecimal/util/depend が dd0c75fdc2104a6ba38b68d4431a572504a3bbc2 移行不要になってたので削除しています。

[ceb9d516c6] Jeremy Evans 2019-10-08 22:23:46 UTC

拡張ライブラリ bigdecimalBigDecimal#initialize_copy, #initialize_dup, #initialize_clone などのメソッドを undef しています。 initialized_copy は明示的にメソッド定義してしまっていたのでそれを消してますが、initialize_dup/initialize_clone っていうメソッドを呼ぶ内部的な挙動ってあるんでしたっけ? dup/clone の時にこの名前のメソッドがあれば優先的に呼ぶんでしたっけ。どうやらそうみたいだ……。

[f00efef30a] Kenta Murata 2019-10-09 01:27:08 UTC

拡張ライブラリ bigdecimal の Kernel#BigDecimal() の引数に Complex を渡された時に虚数部(img)が 0 であれば対応するようにしています。

[d36b197d7c] Jeremy Evans 2019-10-08 22:23:46 UTC

ceb9d516c6d17b0619cf53dfba7cb7b29fe073e4 で追加した BigDecimal#initialize_{copy,dup,clone} の明示的な undef を削除しています。 BigDecimalインスタンスは freeze されてるので Kernel から継承(Mix-in)したメソッドで FrozenError が発生するのでそれにまかせています。

[6607212224] Jeremy Evans 2019-10-09 21:10:04 UTC

d36b197d7c1ce5684fb215697dc2d404cbd730d0 で修正した bigdecimal のテストで 2.4 以前だと freeze されたオブジェクトの変更は FrozenError ではなくただの RuntimeError だったのでそれにも対応するようにしています。

[03a33603c6] Kenta Murata 2019-10-09 01:39:39 UTC

拡張ライブラリ bigdecimal で Complex#to_d メソッドも追加しています。Kernel#BigDecimal() と同様に虚数部が 0 なら変換するようにしています。

[40b82afe6a] Kenta Murata 2019-10-09 01:50:59 UTC

拡張ライブラリ bigdecimal で 2.5 以前の ruby に対応するため rb_complex_real() と rb_complex_imag() の代替実装を追加しています。そういえば struct RComplex 構造体を不可視にするという変更がすこし前にありましたね。

[e794d96ca4] Kenta Murata 2019-10-09 01:51:25 UTC

拡張ライブラリ bigdecimal の gemspec ファイルで対応する ruby バージョンを 2.4 以降に更新しています。

[6a826eb4b0] Kenta Murata 2019-12-23 02:07:23 UTC

拡張ライブラリ bigdecimalBigDecimal#to_s が返す文字列の Encodig を常に US-ASCII にするようにしています。なんでかなと思ったら "ASCII-8BIT" になってしまう場合があったようです。 https://github.com/ruby/bigdecimal/issues/159

[efe851a0df] Kenta Murata 2019-12-25 06:26:23 UTC

拡張ライブラリ bigdecimal の gemspec ファイルでのバージョンを 2.0.1 に更新しています。

[d94ef7c6b6] Nobuyoshi Nakada 2020-07-06 01:46:57 UTC

関数 method_missing() 内で GET_EC() で rb_execution_context_t を得てたのを引数で受け取るようにして呼び元の ec を渡すようにしています。おそらく呼び元の ec も同じものではあると思いますが。

[167d139487] Takashi Kokubun 2020-07-06 07:11:51 UTC

Struct のインスタンスである構造体クラスにメンバー名のメソッドを定義する define_aref_method() (ただし最初の 10個までは専用の関数を使ってメソッド定義するので、それ以上のメンバーをもつ時だけ使われる)で利用する builtin 関数呼び出しの ISeq のフラグ builtin_inline_p に true をセットして MJIT でスタックフレーム省略させるようにしています。

ruby-trunk-changes 2020-07-05

今日は Range#minmax の不具合修正などがありました。

[9fc564cfef] Nobuyoshi Nakada 2020-07-04 10:38:27 UTC

7a5da7d55d40e431e561ab2c891b7cab155e74db で .gitignore から ".*-*" を削った影響でほかにも .ruby-version も無視したかったので追加しています。

[bf1a6771f3] Sam Bostock 2020-07-04 02:56:07 UTC

d5c60214c45bafc1cf2a516f852394986f9c84bb で Range#minmax に独自の実装を追加して最適化した時に、要素が数値ではなかった時の挙動に問題があったので修正しています。 C の実装を直接呼んでいたのをメソッド呼び出しを使うようにしています。 [Bug #17012] [Bug #17014]

[c4bdb6428e] git 2020-07-04 17:02:44 UTC

version.h の日付更新

[c146362555] Jeremy Evans 2020-07-04 17:12:02 UTC

bf1a6771f305ea286a3ae575676924551c03e857 でメソッド呼び出しの都度 rb_intern() を呼んでたのを static 変数を参照するようにしています。 [Bug #17012] [Bug #17014]

[e4f7eee009] Takashi Kokubun 2020-07-04 22:37:20 UTC

a69dd699ee630dd1086627dbca15a218a8538b6f の MJIT でのインスタンス変数へアクセスする命令のコンパイル時に inline cache を利用する変更でインスタンス変数テーブルが struct RVALUE に埋め込みかどうかがコード生成時の期待と実行時の flags の ROBJECT_EMBED ビットフラグでの判定とで一致してるかを確認する条件を追加しています。SEGV する可能性があったようです。

[95f5fd9a55] Koichi Sasada 2020-07-05 01:43:08 UTC

組み込みメソッドの ruby 実装から C のコードを呼び出す機能の一部 Primitive.cinit! が 74e1bca79d703f2658ac9cfa6d990e7e77c59757 の変更に追随していなかったのを修正。

[04c704c5c9] Nobuyoshi Nakada 2020-07-05 08:12:20 UTC

coroutine/arm32/Context.S と coroutine/arm64/Context.S の行末の空白を除去。

[41168f69fb] Nobuyoshi Nakada 2020-07-05 08:27:12 UTC

Coroutine 実装 coroutine/arm32/Context.S、coroutine/arm64/Context.S、coroutine/ppc64le/Context.S で coroutine_transfer というシンボル名に SYMBOL_PREFIX という(これもマクロかな) export 用の prefix を追加するようにしているようです。

[358f91bf6f] Nobuyoshi Nakada 2020-07-05 09:59:06 UTC

gems/bundled_gems に空行や先頭に # のある行(コメント)をスキップして無視することができるようにしています。

[12b377a96c] Nobuyoshi Nakada 2020-07-05 10:00:46 UTC

bundled gem の minitest と test-unit のバージョンをそれぞれ 5.14.1 と 3.3.6 に更新しています。

[4ea57c2a39] Nobuyoshi Nakada 2020-07-05 10:15:03 UTC

358f91bf6f9999ba4683f702bc47483789bd4e7e の gems/bundled_gems のコメント行対応の defs/gmake.mk の対応で Makefile 内での "#" にエスケープが必要だったのでバックスラッシュを追加しています。

ruby-trunk-changes 2020-07-04

今日は Object# tap や Kernel#then, #frozen? などのメソッドを ruby 実装にする変更や MJIT でインスタンス変数操作向けの最適化、builtin 関数呼び出しの cexpr!/cstmt! の C の式/文から ruby 側のローカル変数を参照できるようにする機能強化などがありました。

[e8010c7401] Burdette Lamar 2020-07-03 14:49:36 UTC

Array のメソッドの rdoc 用コメントの markup 修正やサンプルなどの強化。 https://github.com/ruby/ruby/pull/3276

[f3a0d7a203] Takashi Kokubun 2020-07-03 16:52:35 UTC

Object#tap の実装を ruby 実装にしています。 tap みたいなのは ruby 実装のほうが速そうですね。 https://github.com/ruby/ruby/pull/3281

[ccb2e6eaa5] git 2020-07-03 16:52:54 UTC

version.h の日付更新

[a69dd699ee] Takashi Kokubun 2020-07-04 00:52:52 UTC

インスタンス変数のテーブルのインデックスの inline cache の値を可能なら MJIT で JIT コンパイルした時にも利用するようにする機能を追加しています。 https://github.com/ruby/ruby/pull/3284

[24fa37d87a] Takashi Kokubun 2020-07-04 01:02:43 UTC

Kernel#then, Kernel#yield_self, Kernel#frozen? などのメソッドも ruby 実装にしています。 then/yield_self はブロックが与えられてた場合は純粋な ruby 実装になってます(そうでない時は Enumerator を返すので C 関数を builtin 関数機能で呼び出す)。 https://github.com/ruby/ruby/pull/3283

[7a5da7d55d] David Rodríguez 2020-06-15 14:48:33 UTC

.gitignore から "." で始まって "-" を含むファイル名のパターンを消しています。 元々なにを意図して ignore してたのかわかりませんが、.gitlab-ci.yml.tt みたいな名前が無視されてしまうからとのこと。 bundler による gem 生成時のためのテンプレートファイルの名前ですね。 かわりに .downloaded-cache や .top-enc.mk などいくつか明示的に .gitignore に追加しています。

[74e1bca79d] Koichi Sasada 2020-07-04 08:23:34 UTC

ruby 実装の組み込みメソッド定義から Primitive.cexpr! や Primitive.cstmt! での実装を呼び出す時に、ruby 側のメソッド引数のほかにメソッド内のローカル変数の参照も集めて C 実装内から参照できるようにしています。

ruby-trunk-changes 2020-07-03

今日はデバッグ用の機能追加や json の更新の再修正などがありました。

[59ded36c60] Hiroshi SHIBATA 2020-07-02 11:48:56 UTC

tool/lib/test/unit/assertions.rb で定義されていた assert_pattern_list という assertion メソッドを tool/lib/test/unit/core_assertions.rb に移動しています。 default gem (drb) のテストで使えるようにするためみたいですね。

[e6a8590aa4] Yusuke Endoh 2020-07-03 02:05:08 UTC

c565dfb09ad7d55fa671f65cea7088a914bf1931json のテストでの $LOAD_PATH へのパス追加時に絶対パスに変換しておく修正 (参考 https://mametter.hatenablog.com/entry/2020/03/24/123456)0aac138e0b507c8a361f7cf2f30c276e7110ea33json-2.3.1 への更新時に戻ってしまってたので再適用しています。

[05a12297c3] git 2020-07-03 02:27:07 UTC

version.h の日付更新

[1e039474a2] Yusuke Endoh 2020-07-03 02:45:58 UTC

JSON のテストで非常に大きな数値を表す対数表記を JSON.parse するテストで警告が出るのを抑制するため一時的に $VERBOSE = nil しておくようにしています。

[01776ca1c0] Hiroshi SHIBATA 2020-07-03 03:50:37 UTC

GitHub Actions の CodeQL でのチェックで拡張ライブラリの mkmf.rb での確認のために生成する conftest.c は無視させるようにしています。

[8655c2e690] Koichi Sasada 2020-07-03 07:55:54 UTC

RUBY_DEBUG_LOG() というマクロを追加してデバッグ情報を記録するようにしています。 USE_RUBY_DEBUG_LOG マクロを指定してビルドした時にだけ使えて、環境変数 RUBY_DEBUG_LOG で格納(出力)先がメモリ上/stderr/指定のファイルなどに切り替えができるというもののようです。 https://github.com/ruby/ruby/pull/3279

[a0f12a0258] Koichi Sasada 2020-07-03 07:56:44 UTC

グローバル変数の参照を compile した時に GENTRY という型(実体は VALUE) を使ってたのをやめめ ID で代替するようにしています。 GENTRY 知らなかったな……。 https://github.com/ruby/ruby/pull/3278

ruby-trunk-changes 2020-07-02

今日は主に Rational の実装の最適化や Integer の一部のメソッドの最適化などがありました。

[29ecce4d72] Nobuyoshi Nakada 2020-05-30 05:59:44 UTC

rational.c の Integer#% メソッドを呼び出してた関数 f_odd_p() を削除して rb_int_odd_p() を直接呼ぶことで代替するようにしています。

[53d2bfd540] Nobuyoshi Nakada 2020-05-30 09:15:31 UTC

rational.c の f_add()、f_lt_p()、f_eqeq_p() などの関数で第1引数が Integer の時にメソッド呼び出しするかわりに直接 C 実装の関数を呼び出すショートカットを追加しています。

[254bed3027] Nobuyoshi Nakada 2020-05-30 09:34:32 UTC

rational.c の nurat_sub() という関数を rb_rational_minus() に改名して static 修飾子をはずして別のソースファイルからも呼べるようにしています。

[49029811d9] Nobuyoshi Nakada 2020-05-30 09:39:56 UTC

254bed302752a401b5fcc3b6c65a9c93711d91d6 で改名した関数 rb_rational_minus() も利用して rational.c の nurat_rationalize() (Rational#rationalize の実装)で f_sub()/f_add() のかわりに直接 rb_rational_minus()/rb_rational_plus() を呼ぶようにしたり、Float から Rationalize への変換で負の時にも precision の指定がきくようにする修正や中間オブジェクトの生成を抑えるようにする変更など。

[bf3f03c925] 卜部昌平 2020-07-02 00:44:23 UTC

Integer の to_i, to_int, ord などの C 実装を呼ぶまでもないメソッドの ruby 実装で builtin 関数呼び出しもなくして直接 ruby だけで実装するようにしています。たしかに。

[08ba5bec2b] git 2020-07-02 05:34:56 UTC

version.h の日付更新

ruby-trunk-changes 2020-07-01

今日は拡張ライブラリ json の更新がありました。ドキュメントの更新のほか JSON.parse 時の Hash キーの文字列の余分なオブジェクト生成の抑制がありパフォーマンス向上が望めそうです。

[4689fd5f99] BurdetteLamar 2020-05-06 12:59:54 UTC

拡張ライブラリ json の rdoc 用コメントに JSON の parse の入出力の具体的な例やオプションの効果についてのサンプルなどを追記したりしています。

[fe10323a35] Marc-Andre Lafortune 2020-06-25 06:42:44 UTC

拡張ライブラリ json のテスト test/json/json_fixtures_test.rb の setup でファイルを Dir.glob するパターンのミスでテスト対象のファイルが空っぽになってしまってなにもテストしていなかったのを修正しています。

[99980b3034] BurdetteLamar 2020-06-25 17:09:28 UTC

4689fd5f9982a148052d76e8e1a7bd85256baec6 の拡張ライブラリ json の rdoc 用コメントの編集/追記からサンプルの修正や実装に依存しすぎる詳細? を削ったりしています。

[be6447381c] BurdetteLamar 2020-06-25 18:58:45 UTC

拡張ライブラリ json の rdoc 用コメントの再修正。エンコード結果の表示でダブルクオーテーションのエスケープをなくすためシングルクオートでくくった表示に変更しています。

[7d8ce96de6] BurdetteLamar 2020-06-25 21:49:39 UTC

拡張ライブラリ json の rdoc 用コメントの 99980b3034f59eb1253411f1220e1591f47a49c1 と同様に詳しすぎる記述? を削除しています。

[cb3e62511c] Watson 2018-02-27 13:40:58 UTC

拡張ライブラリ jsonJSON.parse で Hash オブジェクトを生成する時に key になる文字列をあらかじめ freeze したものを rb_hash_aset() に渡すことでコピーが作られるのを抑制しています。これは効果ありそうですね。

[d69b55ac05] BurdetteLamar 2020-06-28 18:55:17 UTC

拡張ライブラリ json の rdoc 用コメントに call-seq を追加しています。

[26041da2fb] Marc-Andre Lafortune 2020-06-30 04:28:23 UTC

拡張ライブラリ json の rdoc 用コメントの typo 修正。

[0aac138e0b] Hiroshi SHIBATA 2020-07-01 09:50:39 UTC

拡張ライブラリ json のバージョンを 2.3.1 に更新しています。

[68d7e93b3b] git 2020-07-01 09:51:19 UTC

version.h の日付更新