ruby-trunk-changes 2020-06-30

今日は configure 時の CPU アーキテクチャ検出に arm64 を追加する変更などがありました。

[eefc2d8a3c] Kazuhiro NISHIYAMA 2020-06-30 08:13:37 UTC

Integer#zero? の rdoc 用コメントの typo 修正。

[15a312ed40] git 2020-06-30 08:14:18 UTC

version.h の日付更新

[7cb8904a12] Samuel Giddins 2020-06-30 07:13:17 UTC

configure が使う tool/m4/ruby_universal_arch.m4 で定義する RUBY_UNIVERSAL_ARCH というマクロでコンパイルターゲットの CPU アーキテクチャを検出するのに preprocessor のマクロをチェックしてるところに __arm64__ を検出して arm64 という名前をセットする対応を追加しています。"for ARM64 Macs" とあるから AppleMac に ARM を採用するのにむけた対応ですかね。

[74ac12830b] Nobuyoshi Nakada 2020-06-02 23:21:22 UTC

method.h の METHOD_ENTRY_COMPLEMENTED_SET()、METHOD_ENTRY_CACHED_SET()、METHOD_ENTRY_INVALIDATED_SET() などの method entry の flags にビットフラグをセットするマクロで |= による論理和つき代入を使うようにしています。関数マクロの引数の評価を 1回にするためみたいです。

[52ef2477e4] Nobuyoshi Nakada 2020-06-02 23:31:00 UTC

method.h に METHOD_ENTRY_CACHEABLE() というメソッドの可視性(visibility) が protect かどうかをチェックする頻出処理を関数マクロとして切り出すリファクタリング

[1351374bd1] Nobuyoshi Nakada 2020-06-02 23:40:11 UTC

vm_method.c の rb_method_boundp() にて複雑な条件による if 文をネストさせて METHOD_ENTRY_VISI(me) による分岐は if 文内にさらに switch 文を置くようにするリファクタリング

ruby-trunk-changes 2020-06-29

今日は主に goto 文で条件分岐などのブロックの中に飛び込むのをやめるようにしたり goto のかわりに関数に切り出してコードを共有するようにするリファクタリングなどがありました。

[2e8d8d10f2] 卜部昌平 2020-06-10 04:42:30 UTC

ここから pull request https://github.com/ruby/ruby/pull/3247 で行なわれている goto 文をなくしたり、飛び先を整理したりするリファクタリングが続きます。おおまかに分類して 1. switch 文の別の case 節や if 文の別のブロックなどに外から飛び込む goto を廃止して飛び先を外に括りだしたり fall through を利用する。 2. エラー処理など共通の処理をまとめるための goto 文でその処理が一箇所の処理に埋め込まれてるのを関数末尾などに移動したり関数として切り出して呼びかたを共通する。という変更が行なわれているようです。
このコミットでは array.c の rb_ary_behead() の分岐内の処理を behead_shared() という関数に切り出して goto 文をなくしています。 https://github.com/ruby/ruby/pull/3247

[86c869fb59] 卜部昌平 2020-06-11 01:28:34 UTC

同様に array.c の ary_ensure_room_for_unshift() から共通部分を ary_modify_for_unshift() という関数に切り出して goto 文をなくしています。 https://github.com/ruby/ruby/pull/3247

[4dc83eefce] 卜部昌平 2020-06-11 01:48:59 UTC

rb_ary_aset() でも同様に共通の処理を ary_aset_by_rb_ary_store() や ary_aset_by_rb_ary_splice() という関数に切り出して goto をなくすリファクタリングhttps://github.com/ruby/ruby/pull/3247

[73f98d25eb] 卜部昌平 2020-06-11 02:31:27 UTC

ary_join_1() でも ary_join_1_ary() と ary_join_1_str() という関数に切り出して goto をなくすリファクタリングhttps://github.com/ruby/ruby/pull/3247

[4f2425549a] 卜部昌平 2020-06-11 02:45:03 UTC

rb_ary_slice_bang() でも共通部分を ary_slice_bang_by_rb_ary_splice() という関数に切り出して goto 文をなくすリファクタリングhttps://github.com/ruby/ruby/pull/3247

[e634a9d1a5] 卜部昌平 2020-06-11 03:00:43 UTC

ast.c の node_children() で swicth 文の別の case に goto で飛んでるのをやめて fall through するのにまかせるようにしています。 https://github.com/ruby/ruby/pull/3247

[4dfc2f2e3d] 卜部昌平 2020-06-11 03:45:30 UTC

bignum.c の bary_mul_karatsuba_branch() で共通の後処理を関数末尾に移動して常に goto で移動するようにしています。 https://github.com/ruby/ruby/pull/3247

[5a7c0dd038] 卜部昌平 2020-06-11 03:53:12 UTC

bignum.c の str2big_scan_digits() でもたんに return FALSE するために goto 使ってたのを直接 return するように変更しています。 https://github.com/ruby/ruby/pull/3247

[184f0ab4c9] 卜部昌平 2020-06-11 03:56:05 UTC

bignum.c の rb_int_parse_cstr() でも共通の return 時の処理を関数末尾に移動して常に goto で移動するようにしています。 https://github.com/ruby/ruby/pull/3247

[9ec4f1f205] 卜部昌平 2020-06-11 04:18:22 UTC

bignum.c の rb_big_aref() で引数エラー時の return を goto でまとめてたのをやめて同じ return 文をコピーしています。 https://github.com/ruby/ruby/pull/3247

[8d182b04ed] 卜部昌平 2020-06-11 04:23:56 UTC

builtin.c の builtin_lookup() で feature の検索に if 文内に else の節から goto してたのを文字列の比較部分を bin4feature() という関数に切り出しています。たぶんここはそこそこ速度を(起動速度を)気にしたところだと思いますがおそらく通常は bin の初期化時に non-NULL になるので for 文は空まわりするはずですね。そう考えると条件部は !bin のほうが先のほうが良いかも? コンパイラが良きにはからってくれるかも。 https://github.com/ruby/ruby/pull/3247

[86e3d63772] 卜部昌平 2020-06-12 03:35:45 UTC

class. c の SPECIAL_SINGLETON() というマクロを削除して、利用してたところはただの switch 文で書きなおしています。 https://github.com/ruby/ruby/pull/3247

[3a3728e4b3] 卜部昌平 2020-06-11 04:53:16 UTC

singleton_class_of() でも goto 文で if の分岐の間で飛び込むのをやめて swicth 文で書き直しています。 https://github.com/ruby/ruby/pull/3247

[a93da4970b] 卜部昌平 2020-06-11 05:20:24 UTC

cmp_clamp() で不要な goto で else へ飛び込んでたので、条件を整理して普通の if 文で書きなおしています。 https://github.com/ruby/ruby/pull/3247

[a5342f46e6] 卜部昌平 2020-06-11 05:28:21 UTC

compile.c の iseq_set_exception_table() でも条件を整理して不要な goto 文を削除しています。 https://github.com/ruby/ruby/pull/3247

[a6b1454a5d] 卜部昌平 2020-06-11 05:33:36 UTC

compile.c の optimize_checktype() でもただの return FALSE のために goto 文が使われてたのを廃止しています。 https://github.com/ruby/ruby/pull/3247

[1f90690a1d] 卜部昌平 2020-06-11 05:44:24 UTC

compile.c の compile_branch_condition() でもただの retrurn の共有のために goto 文を使ってたのを廃止しています。 https://github.com/ruby/ruby/pull/3247

[cc1e9b8e11] 卜部昌平 2020-06-11 06:18:42 UTC

compile.c の compile_break() で条件を整理して goto 文をなくしています。 https://github.com/ruby/ruby/pull/3247

[cf29de7e6e] 卜部昌平 2020-06-12 03:48:28 UTC

compile.c の compile_next() でも不要な goto 文があったので条件を整理して(? ちょっと局所的にみただけだとこれでいいのかぱっとわからないですが)廃止しています。 https://github.com/ruby/ruby/pull/3247

[aa2cb7f722] 卜部昌平 2020-06-12 04:39:10 UTC

compile.c の compile_redo() でも同様に条件を整理して goto 文を廃止しています。 https://github.com/ruby/ruby/pull/3247

[a8d992ac00] 卜部昌平 2020-06-12 04:45:01 UTC

compile.c の compile_call() でも条件を整理して goto 文を削除しています。 https://github.com/ruby/ruby/pull/3247

[9c92dcf366] 卜部昌平 2020-06-12 04:57:30 UTC

compile.c の ibf_dump_object_object() でも条件を整理して goto 文を廃止しています。 https://github.com/ruby/ruby/pull/3247

[70857ae1aa] 卜部昌平 2020-06-12 05:00:35 UTC

dir.c の glob_make_pattern() でエラー処理を関数末尾に移動して常に goto で移動するようにしています。 https://github.com/ruby/ruby/pull/3247

[99073f49bf] 卜部昌平 2020-06-12 05:08:48 UTC

dir.c の glob_dir_finish() でもエラー処理を関数末尾に移動して常に goto で移動するようにしています。 https://github.com/ruby/ruby/pull/3247

[5e96054519] 卜部昌平 2020-06-12 05:24:41 UTC

dln_find.c の dln_find_1() でエラー処理を関数末尾に移動して常に goto で移動するようにしています。 https://github.com/ruby/ruby/pull/3247

[d060ebf83c] 卜部昌平 2020-06-15 01:13:10 UTC

enum.c の sum_iter() で共通部分を sum_iter_normalize_memo()、sum_iter_fixnum()、sum_iter_bignum()、sum_iter_rational()、sum_iter_some_value()、sum_iter_Kahan_Babuska() といった関数に切り出して goto を削除しています。 https://github.com/ruby/ruby/pull/3247

[a2677815f5] 卜部昌平 2020-06-15 02:37:35 UTC

error.c の rb_check_typeddata() でエラー処理を関数末尾に移動して常に goto 文を利用するようにしています。 https://github.com/ruby/ruby/pull/3247

[0b1b734515] 卜部昌平 2020-06-15 02:58:30 UTC

eval.c の rb_class_modify_check() で不要な goto 文を削除して直接同じ式を書くようにしています。 https://github.com/ruby/ruby/pull/3247

[13bdbfcecb] 卜部昌平 2020-06-15 03:01:50 UTC

eval.c の setup_exception() でエラー処理を関数末尾に移動して常に goto で移動するようにしています。 https://github.com/ruby/ruby/pull/3247

[4606ec4925] 卜部昌平 2020-06-15 03:38:19 UTC

eval.c の make_exception() で早期 return などを併用してエラー処理を末尾に移動して goto を不要にしています。 https://github.com/ruby/ruby/pull/3247

[e9cb092b2d] 卜部昌平 2020-06-15 05:27:29 UTC

file.c の rb_f_test() でもエラー処理を関数末尾に移動して常に goto で移動するようにしています。 https://github.com/ruby/ruby/pull/3247

[228118482e] 卜部昌平 2020-06-15 05:31:31 UTC

gc.c の gc_marks_finish() の goto 文は不要だったみたい? なので条件を追加して対応しています。 https://github.com/ruby/ruby/pull/3247

[c5f4345138] 卜部昌平 2020-06-15 05:36:41 UTC

gc.c の get_envparam_double() でもエラー処理を関数末尾に移動して常に goto で移動するようにしています。 https://github.com/ruby/ruby/pull/3247

[b5adaa8dbd] 卜部昌平 2020-06-15 05:52:02 UTC

goruby.c の goruby_options() でエラー処理を関数末尾に移動して不要な else 節を削除。 https://github.com/ruby/ruby/pull/3247

[5f60538245] 卜部昌平 2020-06-15 06:02:53 UTC

hash.c の any_hash() の if 文を switch 文で書きなおして goto で移動するのをやめています。 https://github.com/ruby/ruby/pull/3247

[1e8461424c] 卜部昌平 2020-06-15 06:12:54 UTC

hash.c の rb_hash_transient_heap_evacuate() でも条件分岐を整理して goto 文を廃止。 https://github.com/ruby/ruby/pull/3247

[0e4ee71546] 卜部昌平 2020-06-15 06:23:16 UTC

io.c の rb_io_each_codepoint() でエラー処理を関数末尾に移動して常に goto を使って移動するように変更。 https://github.com/ruby/ruby/pull/3247

[9e92292e30] 卜部昌平 2020-06-15 06:26:31 UTC

io.c の rb_io_modestr_fmode() でもエラー処理を関数末尾に移動して常に goto で移動するように変更。 https://github.com/ruby/ruby/pull/3247

[e551dfda9f] 卜部昌平 2020-06-15 06:31:07 UTC

load.c の rb_feature_p() でエラー処理を関数末尾に移動して常に goto で移動するように変更。 https://github.com/ruby/ruby/pull/3247

[6575766ea0] 卜部昌平 2020-06-15 07:04:52 UTC

load.c の search_required() でもマイナーなパス(?)の処理を関数末尾に移動して常に goto で移動するように変更しています。 https://github.com/ruby/ruby/pull/3247

[41703fcfab] 卜部昌平 2020-06-15 07:09:33 UTC

marshal.c の r_object0() でも例外処理を独立したブロックに移動して常に goto で移動するようにしています。switch 文の break と case の間に置くのはいいのかな? https://github.com/ruby/ruby/pull/3247

[bf19820bb3] 卜部昌平 2020-06-16 00:42:18 UTC

numeric.c の flo_to_s() でも処理を末尾に移動して常に goto で移動するようにしています。 https://github.com/ruby/ruby/pull/3247

[250189f54f] 卜部昌平 2020-06-16 01:05:46 UTC

numeric.c の int_pow() でも T_BIGNUM の時の処理を関数末尾に移動して常に goto で移動するようにしています。 https://github.com/ruby/ruby/pull/3247

[03354feb6a] 卜部昌平 2020-06-16 01:39:07 UTC

numeric.c の fix_pow() から goto で共有してた処理を fix_pow_inverted() という関数に切り出すことで goto 文を廃止しています。 https://github.com/ruby/ruby/pull/3247

[1f6e74106f] 卜部昌平 2020-06-16 01:49:02 UTC

object.c の class_or_module_required() で switch 文の条件を工夫することで goto を廃止しています。 https://github.com/ruby/ruby/pull/3247

[3b8d9badab] 卜部昌平 2020-06-16 01:50:53 UTC

object.c の rb_mod_const_get() でエラー処理を関数末尾に移動して常に goto で移動するようにしています。 https://github.com/ruby/ruby/pull/3247

[60212cd8ee] 卜部昌平 2020-06-16 01:52:30 UTC

object.c の rb_mod_const_defined() でもエラー処理を関数末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[268962077a] 卜部昌平 2020-06-16 01:53:31 UTC

object.c の rb_mod_const_source_location() でもエラー処理を関数末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[06ed9a7a04] 卜部昌平 2020-06-16 01:56:56 UTC

object.c の rb_convert_to_integer() で base!=0 の時の分岐を最初に行なうようにすることで goto で処理を共有する必要がなくなるようにリファクタリングしています。 https://github.com/ruby/ruby/pull/3247

[82ed66a75a] 卜部昌平 2020-06-16 02:22:04 UTC

object.c の rb_cstr_to_dbl_raise() でエラー処理を関数末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[2390a8bd2e] 卜部昌平 2020-06-16 02:27:30 UTC

proc.c の bind_local_variable_get() のリファクタリングでエラー処理を関数末尾になるように分岐を整理しています。 https://github.com/ruby/ruby/pull/3247

[8b9b51bb3b] 卜部昌平 2020-06-16 03:00:49 UTC

proc.c の rb_method_name_error() で変数の Qundef での初期化により goto をやめるリファクタリング。一連の pull request の変更内ではちょっと珍しいパターンですね。 https://github.com/ruby/ruby/pull/3247

[3db159193e] 卜部昌平 2020-06-16 03:18:51 UTC

proc.c の rb_obj_singleton_method() でも条件分岐を整理することで goto を不要にしてエラー処理を関数末尾にまとめるようにリファクタリングしています。 https://github.com/ruby/ruby/pull/3247

[2bfac015d3] 卜部昌平 2020-06-16 03:24:30 UTC

proc.c の proc_binding() で switch 文の case 節の順序を調節して fall through を利用して goto を使わないようにしています。 https://github.com/ruby/ruby/pull/3247

[9298631316] 卜部昌平 2020-06-16 03:27:33 UTC

process.c の check_exec_redirect_fd() でエラー処理を関数末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[08202d1f0e] 卜部昌平 2020-06-16 03:53:24 UTC

process.c の check_exec_redirect() で Symbol が不正な時のエラー処理を goto を使う必要はなかったのでなくすリファクタリングhttps://github.com/ruby/ruby/pull/3247

[cc27cd26d7] 卜部昌平 2020-06-16 04:02:03 UTC

random.c の rand_range() で goto のラベル fixnum を if 文の外に出してますが、これは FIXNUM_P() のチェックが冗長になるけどいいのかな? goto してるブロックの外側だからこのケースは良しってことかな。 https://github.com/ruby/ruby/pull/3247

[9c5804ac1c] 卜部昌平 2020-06-16 05:31:11 UTC

range.c の range_each() から goto で共有している処理を range_each_bignum_endless()、range_each_fixnum_endless()、range_each_fixnum_loop() といった関数に切り出して goto を廃止しています。 https://github.com/ruby/ruby/pull/3247

[d7eec15f8e] 卜部昌平 2020-06-16 05:42:24 UTC

rational.c の rb_rational_cmp() で if 文を case 文で書き換えて fall through を利用して goto の代用にしています。 https://github.com/ruby/ruby/pull/3247

[689dd3aecb] 卜部昌平 2020-06-16 06:18:55 UTC

rational.c の parse_rat() で条件分岐を整理して if 文の末端のほうのブロックに goto で飛ぶのをやめて外向きに飛ぶようにしています。やっぱり中から外に飛ぶほうが better という方針のようですね。 https://github.com/ruby/ruby/pull/3247

[7cf4625690] 卜部昌平 2020-06-16 06:32:39 UTC

ruby.c の feature_option() でエラー処理を関数末尾に移動して常に goto でジャンプするようにリファクタリングしています。 https://github.com/ruby/ruby/pull/3247

[224e9c3835] 卜部昌平 2020-06-16 06:46:30 UTC

signal.c の signm2signo() でエラー処理を関数末尾に移動して常に goto でジャンプするようにするリファクタリングhttps://github.com/ruby/ruby/pull/3247

[b5eeb3453e] 卜部昌平 2020-06-17 05:28:54 UTC

signal.c の trap_handler() で switch 文の case 節の中に goto の label があったのを switch 文のブロック内の case より前に移動しています。 https://github.com/ruby/ruby/pull/3247

[31a770ac48] 卜部昌平 2020-06-17 05:49:16 UTC

strftime.c の rb_strftime_with_timespec() でエラー処理(といっても return 0 してるだけなのですが……)を関数末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[6df790f22e] 卜部昌平 2020-06-17 05:59:44 UTC

string.c の rb_enc_cr_str_buf_cat() でエラー処理を関数末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[c29ec1ef1a] 卜部昌平 2020-06-17 06:31:10 UTC

string.c の rb_str_index_m() で条件分岐を整理して goto を不要にしています。 https://github.com/ruby/ruby/pull/3247

[c422fc4bbc] 卜部昌平 2020-06-17 07:02:18 UTC

string.c の rb_str_rindex_m() の条件分岐を工夫して goto を廃止するリファクタリングhttps://github.com/ruby/ruby/pull/3247

[d49924ed81] 卜部昌平 2020-06-17 07:05:43 UTC

string.c の rb_str_match() でも条件分岐を工夫して goto を廃止するリファクタリングhttps://github.com/ruby/ruby/pull/3247

[0358846f8c] 卜部昌平 2020-06-18 01:29:25 UTC

string.c の rb_str_update() でも条件分岐を工夫して goto を廃止するリファクタリングhttps://github.com/ruby/ruby/pull/3247

[841eea4bcb] 卜部昌平 2020-06-18 04:18:12 UTC

string.c の rb_str_subpat_set() でも条件分岐を工夫して goto を廃止するリファクタリングhttps://github.com/ruby/ruby/pull/3247

[19f2cabed8] 卜部昌平 2020-06-18 04:41:34 UTC

string.c の rb_str_aset() でも条件分岐を工夫して goto を廃止するリファクタリングhttps://github.com/ruby/ruby/pull/3247

[31e5d138d7] 卜部昌平 2020-06-18 06:21:18 UTC

string.c の rb_str_slice_bang() でエラー処理を関数末尾にあつめて常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[673ddea934] 卜部昌平 2020-06-18 06:24:16 UTC

string.c の get_pat() でも条件分岐を工夫して goto を廃止するリファクタリングhttps://github.com/ruby/ruby/pull/3247

[fdae2063fb] 卜部昌平 2020-06-18 06:24:56 UTC

string.c の get_pat_quoted() でも条件分岐を工夫して goto を廃止するリファクタリングhttps://github.com/ruby/ruby/pull/3247

[c7a4073154] 卜部昌平 2020-06-18 07:36:35 UTC

string.c の chompped_length() から goto で共有している処理を関数 smart_chomp() として切り出して goto を廃止するリファクタリングhttps://github.com/ruby/ruby/pull/3247

[a5ae9aebbc] 卜部昌平 2020-06-18 07:44:49 UTC

string.c の trnext() の goto のラベルを if 文のブロックの 1つ外に出しています。 https://github.com/ruby/ruby/pull/3247

[e3d821a36c] 卜部昌平 2020-06-18 07:52:17 UTC

string.c の rb_str_crypt() のエラー処理を関数末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[5f926b2b00] 卜部昌平 2020-06-18 07:55:52 UTC

string.c の rb_str_partition() でエラー処理を関数末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[ad6512f359] 卜部昌平 2020-06-19 01:46:55 UTC

symbol.c の rb_enc_symname_type() でエラー処理を関数末尾にあつめて常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[8fc8912109] 卜部昌平 2020-06-19 01:50:43 UTC

thread.c の exec_recursive() のエラー処理を関数末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[f402dc3557] 卜部昌平 2020-06-19 01:56:25 UTC

thread_sync.c の rb_szqueue_push() で goto 文は不要で break でループから抜けるだけで代用できたのでそのように変更しています。 https://github.com/ruby/ruby/pull/3247

[0fc569361b] 卜部昌平 2020-06-19 02:58:50 UTC

time.c の num_exact() で条件分岐を工夫して goto を廃止するリファクタリングhttps://github.com/ruby/ruby/pull/3247

[1c0a97bfad] 卜部昌平 2020-06-19 03:39:16 UTC

time.c の vtm_add_offset() で不要な goto 文を削除しています。 https://github.com/ruby/ruby/pull/3247

[ce6be8889f] 卜部昌平 2020-06-19 03:44:57 UTC

time.c の utc_offset_arg() のエラー処理を関数末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[83f6de8691] 卜部昌平 2020-06-19 03:56:13 UTC

time.c の find_time_t() の goto のラベルを if 文のブロックの 1つ外に移動しています。 https://github.com/ruby/ruby/pull/3247

[fd0e935886] 卜部昌平 2020-06-19 03:59:31 UTC

time.c の time_mload() のエラー処理を関数末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[3d636eccfc] 卜部昌平 2020-06-19 05:14:02 UTC

transcode.c の make_econv_exception() でエラー処理を関数末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[421db59c9e] 卜部昌平 2020-06-19 06:51:17 UTC

variable.c の rb_path_to_class() でエラー処理を関数末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[1e9d58391c] 卜部昌平 2020-06-22 01:15:32 UTC

variable.c の rb_copy_generic_ivar() のエラー処理を関数末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[b95b249784] 卜部昌平 2020-06-22 01:18:28 UTC

variable.c の rb_mod_remove_cvar() でエラー処理を関数末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[f12efec2c2] 卜部昌平 2020-06-22 01:57:01 UTC

vm.c の vm_exec_handle_exception() if 文内で共通の処理を goto で共有していたのをブロックの先頭で必要な type のセットだけ分岐(というか配列の参照による書き換え)で対応するようにリファクタリングしています。こんな配列の宣言のしかたははじめてみた。古めのコンパイラで通るかな…。 https://github.com/ruby/ruby/pull/3247

[edb1680a05] 卜部昌平 2020-06-22 01:59:19 UTC

vm_eval.c の rb_method_call_status() のエラー処理を関数の末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[6e67b30503] 卜部昌平 2020-06-22 02:00:31 UTC

vm_eval.c の method_missing() のエラー処理を関数末尾に移動して常に goto でジャンプするようにしています。 https://github.com/ruby/ruby/pull/3247

[1bf0d36171] 卜部昌平 2020-06-22 02:07:26 UTC

vm_insnhelper.c の vm_getivar() で goto での移動を if のブロックの中から外に飛ぶ方向にするようにリファクタリングしています。 https://github.com/ruby/ruby/pull/3247

[801752f577] 卜部昌平 2020-06-24 01:58:13 UTC

error.c の rb_check_typeddata() から builtin_class_name() を呼び出してたのを displaying_class_of() という専用の関数を定義してこちらを利用するようにリファクタリングしています。

[2b636dc81d] 卜部昌平 2020-06-24 02:04:19 UTC

eval.c の make_exception() で引数の数が 1つの時の早期 return するようにするリファクタリング

[bacd03ebdf] 卜部昌平 2020-06-24 02:15:38 UTC

compile.c の compile_redo() の ISeq の type の判定が反転していたところを修正。

[c8dc2bf140] 卜部昌平 2020-06-24 07:19:55 UTC

マクロ RBIMPL_UNREACHABLE_RETURN() の定義で引数に渡されたものを展開結果にも含めるようにしています。 UNREACHABLE_RETURN() と書き間違えたのがわかるようにとのことですが後に 1ce9c37257111df15ca646c526b86798fab5775e で revert されています。

[de3e931df7] 卜部昌平 2020-06-24 07:23:59 UTC

末尾に到達しない関数に UNREACHABLE_RETURN() を追加してコンパイラの警告を抑制するようにしています。

[da8af471fb] 卜部昌平 2020-06-25 00:50:06 UTC

time.c の find_time_t() で status のリセット漏れを修正。

[2bd0f37e2b] 卜部昌平 2020-06-25 01:26:34 UTC

dir.c の glob_opendir() で goto でジャンプするエラー処理を関数末尾に移動するためブロックの外に出しています。

[a523eca1c2] 卜部昌平 2020-06-25 05:03:23 UTC

symbol.c の rb_enc_symname_type() のリファクタリング。 enc_synmane_type_leading_chars() という関数を導入して goto を減らそうとしているようです。

[1020e120e0] git 2020-06-29 02:06:18 UTC

version.h の日付更新

[94ab244b43] 卜部昌平 2020-06-29 02:43:48 UTC

eval.c の rb_class_modify_check() で不正なタイプのオブジェクトが渡されて Check_Type() で例外発生させた後に UNREACHABLE を追加しています。 gcc で警告が出るのでその抑制のためとのこと。

[3621a7debf] Bart de Water 2020-06-28 21:18:34 UTC

標準添付ライブラリ webrick や rubyspec で OpenSSL::HMAC.digest や OpenSSL::X509::Certificate#sign に渡す digest のアルゴリズムを OpenSSL::Digest::SHA1 などのクラスを渡してたのを文字列を渡すように変更しています。最近類似の変更があったけど、この定数を使うのって deprecated なんだ。

ruby-trunk-changes 2020-06-28

今日は rubyspec の更新と拡張ライブラリ fiddle の可変長引数の C 関数を呼び出す機能追加などがありました。

[64d8c0815e] Benoit Daloze 2020-06-27 13:51:35 UTC

mspec の upstream からのマージ。 Truffle Ruby 向けの変更が含まれてるようです。

[b3fa158d1c] Benoit Daloze 2020-06-27 13:51:37 UTC

rubyspec の upstream からのマージ。

[25fbc88666] Nobuyoshi Nakada 2020-06-27 14:13:58 UTC

compile.c のコメントに非 ASCII 文字が含まれててコンパイラによっては警告が出るそうなので置換。ぱっと見だとわかりませんが "-" のようにみえる文字がそうだったようです。

[50fbd00e76] Sutou Kouhei 2020-06-26 22:10:37 UTC

拡張ライブラリ fiddle の Check_Max_Args_() という関数マクロの定義を文にするため do{...}while(0) を使うようにしています。

[9f740acaf9] Sutou Kouhei 2020-06-26 22:11:19 UTC

拡張ライブラリ fiddle の変数名を内容に合わせて改名。

[ae18220f99] Sutou Kouhei 2020-06-26 22:25:47 UTC

拡張ライブラリ fiddle で可変長引数の C 関数を呼べるように機能追加しています。

[6429b6d973] Sutou Kouhei 2020-06-26 22:27:05 UTC

拡張ライブラリ fiddle の ext/fiddle/function.c に #include <stdbool.h> を追加しています。

[a40b390b17] Sutou Kouhei 2020-06-26 23:31:59 UTC

拡張ライブラリ fiddle のテストで sprintf() を利用するところで Windows ではシンボル名が _snprintf になるので環境によって変えるようにしています。

[f2bcdc7283] Sutou Kouhei 2020-06-27 02:01:22 UTC

拡張ライブラリ fiddle の mswin 環境サポートのために extconf.rb などを書きかえています。とはいえ大部分は変数名などをより説明的にする改名などなので本質的なのは -DHAVE_FFI_PREP_CIF_VAR を追加するところくらいかな? https://github.com/ruby/fiddle/pull/43

[c405a8d37a] Nobuyoshi Nakada 2020-06-27 15:57:37 UTC

f2bcdc7283f2137e0916e251df3a52c40b1f6151 の fiddle の extconf.rb の同梱版 libffi を使うオプション指定についての条件分岐でデフォルト(オプションが指定されてない時)では同梱版を利用するようにしています。

[247dd8743e] git 2020-06-27 17:03:05 UTC

version.h の日付更新

[0703e01471] Takashi Kokubun 2020-06-27 17:07:47 UTC

7561db8c009bb79a75024fa4ed0350bfb3d0626c で Integer#zero? の実装を inline 可能な C 関数に委譲した ruby 実装におきかえたのと同様に Integer の abs, bit_length, even?, integer?, magnitude, odd?, ord, to_i, to_int などのメソッドも Primitive.attr! 'inline' と Primitive.cexpr! を用いた ruby 実装に変更しています。 https://github.com/ruby/ruby/pull/3264

[48fb6299c6] Nobuyoshi Nakada 2020-06-28 01:34:01 UTC

ae18220f9904c70304bd1672eecadbb3618fc7e5 の fiddle での可変長引数関数サポートの変更で非常に古い libffi だと ffi_prep_cif_var() という関数がなくて失敗するので HAVE_FFI_PREP_CIF_VAR をチェックして定数 Fiddle::TYPE_VARIADIC を定義するようにしています。

[44a659ad97] Nobuyoshi Nakada 2020-06-28 04:20:40 UTC

組み込みメソッドを ruby 実装したスクリプトを事前コンパイルして読み込む tool/mk_builtin_loader.rb でファイルパスのセパレーターの File::ALT_SEPARATOR を File::SEPARATOR に置換しています。つまり Windows 環境でファイルパスのセパレーターが "\" になってるものを "/" に置換しているようです。

[1020f7e3aa] Nobuyoshi Nakada 2020-06-28 05:12:26 UTC

44a659ad976221cfec3355e036daeb4e4942db55 のファイルパス置換を生成するソースコード内のコメントに埋め込むファイルパスも置換するように前のほうに移動しています。

[09b936d89c] Nobuyoshi Nakada 2020-06-28 05:13:48 UTC

tool/mk_builtin_loader.rb で生成する C ソースコードの #line に埋め込むソースコード行数の基準になる行番号を固定で書いてたのを ruby スクリプト内の __LINE__ を基準に計算するようにしています。この間に C のソースコード出力以外の行を追加するとずれちゃうので注意ですね。

ruby-trunk-changes 2020-06-27

今日は pattern match の array pattern や find pattern の最適化などがありました。

[61984d4760] Nobuyoshi Nakada 2020-06-26 15:47:36 UTC

compile.c の compile_args() でキーワード引数を compile する際に node->nd_head->nd_brace を一時的に書き換えてコンパイルしてたのを compile_hash() の引数に method_call_keywords というのを追加して直接 compile_hash() を呼び出すようにリファクタリングしています。

[74c345c7b8] Nobuyoshi Nakada 2020-06-26 17:05:39 UTC

61984d4760889fd098dff006b2cf6506aa8fb341リファクタリングにより不要になった定数マクロの定義を削除しています。

[d6c9c014e2] git 2020-06-27 01:55:39 UTC

version.h の日付更新

[6770d8f1b0] Vladimir Dementyev 2020-03-03 23:45:57 UTC

pattern match の array pattern を使うベンチマークスクリプトを追加しています。

[5320375732] Vladimir Dementyev 2020-03-03 23:42:48 UTC

pattern match の array pattern を ISeq に compile した時に case の値を deconstruct メソッドで配列に展開した結果の VM スタック上の位置を記憶して使いまわすようにしています。ちょっとコンパイル結果のサイズが増えそうだけどメソッド呼び出しが減るので in 節が複数あればたいてい速くなりそう。

[c9ee34a18b] Vladimir Dementyev 2020-06-14 19:00:51 UTC

ddded1157a90d21cb54b9f07de35ab9b4cc472e1 で導入された pattern match の新しい find pattern を ISeq に compile した時に case の値を deconstruct メソッドで配列に展開した結果の VM スタック上の位置を記憶して使いまわすようにしています。ちょっとコンパイル結果のサイズが増えそうだけどメソッド呼び出しが減るので in 節が複数あればたいてい速くなりそう。

[7a5a0dfa5e] Kazuki Tsujimoto 2020-06-27 04:52:23 UTC

pattern match のテストの未使用変数による警告除去。

[609ac6ee2c] Takashi Kokubun 2020-06-27 05:41:38 UTC

5c03e4680e724faeedb2c5fc1581d5fcb66aaff2 で標準添付ライブラリ rinda のテストのタイムアウトを MJIT 有効化時に伸ばす変更を revert して、かわりに skip するようにしています。

ruby-trunk-changes 2020-06-26

今日は昨日の opt_invokebuiltin_delegate_leave 命令を使うメソッドの TracePoint での return イベント発火の再修正や拡張ライブラリ fiddle の不具合修正などがありました。

[2d89af45ea] Richard Schneeman 2020-06-25 14:34:11 UTC

標準添付ライブラリ delegate の SimpleDelegator の rdoc 用コメントのサンプルコードに require "delegate" を明示するようにしています。

[289a28e68f] git 2020-06-25 15:21:39 UTC

version.h の日付更新

[8070cb56db] Koichi Sasada 2020-06-26 01:21:56 UTC

3e02cd518fbe4d91c2aca7fbc3c5aafa387d3cb7ruby 実装の組み込みメソッドからの return イベントが TracePoint で発火しない不具合対策は opt_invokebuiltin_delegate_leave 命令の trace 版を opt_invokebuiltin_delegate とすることで後ろに控えてる leave 命令に fallback させるというものでしたが、encoded_insn_data の notrace_encoded_insn のほうに登録する命令も opt_invokebuiltin_delegate にするようにしています。一度 TracePoint が使われたら無効状態にしても opt_invokebuiltin_delegate+leave にするようにするということかなぁ。 https://github.com/ruby/ruby/pull/3256

[5c03e4680e] Takashi Kokubun 2020-06-26 05:11:40 UTC

標準添付ライブラリ rinda のテストのタイムアウト値を MJIT が有効だったら伸ばすようにしています。

[a640bcee04] Yusuke Endoh 2020-06-26 05:15:01 UTC

3e02cd518fbe4d91c2aca7fbc3c5aafa387d3cb7 で追加した TracePoint のテストで assert_match の引数にかっこなしで正規表現リテラルを渡したため "/" ががあいまいという警告が出てたので明示的に引数にかっこをつけるようにしています。

[9dbc2294a6] Takashi Kokubun 2020-06-26 05:21:12 UTC

8070cb56db18966b7186255d46eef869e7fdd9cb の変更による影響を避けるためと思いますが ruby 実装で C 関数への委譲を使ってる組み込みメソッドが opt_invokebuiltin_delegate_leave 命令を利用していることを確認するテストが TracePoint が有効だと失敗してしまうので子プロセスを起動してそこで実行するようにしています。

[7982dc1dfd] Takashi Kokubun 2020-06-26 06:27:46 UTC

Vm の最適化命令を MJIT で JIT コンパイルした時に call cache に保持されている C 関数のポインタが目的の関数と一致しているかまでチェックするようにして call cache を利用できるようにしています。 opt_eq が高速化できたようです。

[40b40523dc] Takashi Kokubun 2020-06-26 06:50:18 UTC

precompile_inlinable_iseqs() で --jit-verbose が設定された時の inline 化されたメソッドの ISeq 情報を表示する時の表示内容の変更および JIT 時に生成されるコード内のデバッグ用(必ず偽になる if 文の中になってるので手元で編集して出力する用なのでしょう)の call cache に C 関数が格納されてる時の対応するメソッド名の出力追加。

[4949df498a] Nobuyoshi Nakada 2020-06-26 06:27:18 UTC

拡張ライブラリ fiddle の Fiddle::Function の実装で引数を受け取った配列オブジェクト書きかえる時に r53082 で変数名を typo していたのを、同名の変数を宣言するかたちで r53086 で直してしまっていたので無駄な配列確保になっていたのを修正しているようです。

[200c5f4075] Takashi Kokubun 2020-06-26 07:54:05 UTC

NEWS に MJIT 関連の最近の変更をまとめて追記しています。

[a0aacd2efc] Takashi Kokubun 2020-06-26 08:36:23 UTC

NEWS に method cache の変更についての予約エントリを追加しています。あとで ko1 さんが書くよとのこと。 b9007b6c548f91e88fd3f2ffa23de740431fa969 のメソッドキャッシュ機構変更についてですね。 [Feature #16614]

ruby-trunk-changes 2020-06-25

今日は一行メソッド定義の後のインデント不一致警告が誤って出る不具合の修正や ruby 実装による inline 化された組み込みメソッドを MJIT の JIT 対象からはずす変更などがありました。

[fe82f72951] Nobuyoshi Nakada 2020-06-24 14:55:29 UTC

yycompile0() で struct parser_params::debug_lines に文字列を詰めて初期化する時に改行を含む文字列で初期化しておくようにしています。 RubyVM::AbstractSyntaxTree.of のためとのことだけどさてどういうことだろ。

[5dfe95d10e] git 2020-06-24 15:20:44 UTC

version.h の日付更新

[419b0596a2] Nobuyoshi Nakada 2020-06-24 16:13:46 UTC

拡張ライブラリ ripper のテストに 1行メソッド定義の構文を parse するテストを追加しています。

[3d8705dcfd] Nobuyoshi Nakada 2020-06-24 16:14:26 UTC

parse.y の 1行メソッド定義のアクション部で def のトークンの token_info が残っているため次に出てくる end と対応付いてしまいインデントの不一致の警告が誤って出てしまっていた不具合を修正しています。

[5e860ed4c1] Burdette Lamar 2020-06-24 18:31:42 UTC

Array のメソッドの rdoc 用コメントのサンプルの書きなおしなど。 https://github.com/ruby/ruby/pull/3252

[ab62aa7037] Takashi Kokubun 2020-06-25 05:43:13 UTC

3e02cd518fbe4d91c2aca7fbc3c5aafa387d3cb7 で追加した TracePoint で ruby 実装の組み込みメソッドの return イベントを取るテストで子プロセスを起動して実行するようにしています。 CI でたまに失敗するのでその対策みたいです。

[bb4a2351cb] Takashi Kokubun 2020-06-25 05:58:22 UTC

Primitive.attr! で inline と指定された ruby 実装の組み込みメソッドは MJIT で JIT 対象としないようにしています。JIT 化しても最適化の余地がなくてあまり意味がないからとのこと。

[4dbb10f29f] Hiroshi SHIBATA 2019-12-22 23:49:50 UTC

拡張ライブラリ json の gemspec ファイルの required_ruby_version を 2.0 以降とする変更。

[1b076ca30d] Hiroshi SHIBATA 2019-12-29 10:59:55 UTC

同じく拡張ライブラリ json の gemspec ファイルの spec.date の指定を消しています。この項目は rubygems.org が自動で設定してくれるのでファイルに書く必要はないと。

[4eff8a662a] noraj 2020-01-03 15:10:42 UTC

同じく拡張ライブラリ json の gemspec ファイルに spec.metadata を追加して関連サイトへの URL を追加しています。

[9a78e24f7d] Nobuyoshi Nakada 2020-06-25 06:44:47 UTC

標準添付ライブラリ json, psych, stringio, racc, rdoc などの gemspec ファイルから spec.rubygems_version の指定を削除しています。

[6fdd5e26c6] Nobuyoshi Nakada 2020-06-25 09:21:41 UTC

defs/gmake.mk の make spec/bundler と spec/bundler/ のターゲット名を別々に列挙してたのを spec/bundler のみにしています GNU make のバージョンによって "/" でおわるターゲットがないものと同じと扱われるか別のものとして扱われるかが異なり、make spec/bundler/xxx によるファイル指定でのテストとして処理されるのを防ぐためのようです。

ruby-trunk-changes 2020-06-24

今日は MJIT によるメソッド inline 化による最適化の強化や ruby 実装による組み込みメソッドで TracePoint の return イベントが発火しなくなってた不具合の修正、拡張ライブラリ ripper でインデント不一致の警告が検出されなくなってた不具合の修正などがありました。

[dc351ff984] Burdette Lamar 2020-06-23 13:58:26 UTC

Array のメソッドの rdoc 用コメントの英文修正やサンプル追加など。 https://github.com/ruby/ruby/pull/3237

[b71047cca3] Masataka Pocke Kuwabara 2020-06-23 12:11:03 UTC

RubyVM::AbstractSyntaxTree モジュールの rdoc 用コメントの説明でこれが Class だと書かれてたところを修正。

[fbb32b1f48] git 2020-06-24 06:18:18 UTC

version.h の日付更新

[3e02cd518f] Takashi Kokubun 2020-06-24 06:41:57 UTC

ruby 実装によるメソッド定義で Primitivie.func みたいなメソッド呼び出しにみせかけた C 関数呼び出しを利用したメソッドからの return イベントが TracePoint で発火しないという不具合の修正。C 関数を末尾呼び出ししてて opt_invokebuiltin_delegate_leave 命令を使う時に trace 版命令としては opt_invokebuiltin_delegate の trace あり版を使わないといけなかった模様。うーんこれってつまり trace 版に ISeq を書き換える時に opt_invokebuiltin_delegate_leave を使ってたところは opt_invokebuiltin_delegate + leave 命令になるんでしたっけ? この変更がそうするためのものなんだろうか(しかしこれで leave が追加されるような気がしないけど)。
[追記] 元々 opt_invokebuiltin_delegate_leave を使う場合でもその後に leave 命令が追加されるようにコンパイルされていたので、trace 化時に命令を変えるだけで leave に fallback できる状態だったそうです。 https://twitter.com/k0kubun/status/1275858824134459392 [/追記]

[946e5cc668] Takashi Kokubun 2020-06-24 06:49:03 UTC

Kernel#class メソッドを C 関数定義から ruby 実装による C API 呼び出しを Primitive.cexpr! で行なうようにして、さらに Primitive.attr!("inline") を指定することで MJIT での inline 化可能にする最適化。組み込みメソッドを ruby 実装にして JIT したら速くなるねという話が実際に進行してきていますね。 https://github.com/ruby/ruby/pull/3250

[6ecef1199e] Takashi Kokubun 2020-06-24 06:50:31 UTC

3e02cd518fbe4d91c2aca7fbc3c5aafa387d3cb7 の rb_vm_encoded_insn_data_table_init() での変更で警告避けのための明示的なキャスト追加。

[e0037997d9] Takashi Kokubun 2020-06-24 06:56:01 UTC

GitHub Actions の各種コンパイラでのビルドを試す Actions での slack 通知のメッセージに workflow 名を含めるようにしています。

[737da8d383] Takashi Kokubun 2020-06-24 06:57:26 UTC

さらに 3e02cd518fbe4d91c2aca7fbc3c5aafa387d3cb7 の rb_vm_encoded_insn_data_table_init() での追加部分の明示的なキャスト追加。

[50c63ab38d] Takashi Kokubun 2020-06-24 07:29:53 UTC

ruby 実装された組み込みメソッドで C 関数を呼び出して戻り値にしているものの ISeq に opt_invokebuiltin_delegate_leave 命令が使われてることを確認するテストが 3e02cd518fbe4d91c2aca7fbc3c5aafa387d3cb7 の変更で TracePoint が有効な状態だと失敗してしまうので子プロセスを起動してそこで ISeq を取り出させるように修正しています。

[7f29e34f35] Nobuyoshi Nakada 2020-06-24 10:50:51 UTC

拡張ライブラリ ripper のテストのヘルパーメソッド warning/warn で DummyParser#parse のブロック内で return してるのでメソッド呼び出し以降には処理が続かないはずなのでそれを明確にするため処理が到達すると assert(false) で明示的に失敗させるようにしています。

[263b941321] Nobuyoshi Nakada 2020-06-24 10:53:14 UTC

拡張ライブラリ ripper の Ripper#parse でインデントの不整合についての警告が Ripper#warn メソッドで検出されなくなっていた不具合を修正しています。 yylex() 内での dispatch_delayed_token() や dispatch_scan_event() の呼び出しをソース内の位置を表す yylloc へのセットの後に移動しています。いやーこの差分で警告が出なくなってたというのはさすがにテストなしでは気がつけないのでやっぱり parser は難しいですね。 [ruby-core:98928] [Bug #16981]