- 目次ページに戻る / 前 / 次
- 前回からの差分をまとめて見る
VM命令 set_reg_a, set_reg_b の廃止
cp
命令で書き換えられるため不要になっています。
「set_reg_a
, set_reg_b
を使って書いた方が意図も明確で可読性も高い」みたいなメリットも大してないので、廃止しました。
書き換えの例:
- set_reg_a 42 + cp 42 reg_a
一番最初の頃に追加した命令なので、名残惜しい感じがしなくもないですけどね……。
codegen_call_set() で codegen_call() を流用
移植していたときにコードの重複に気付きつつも後回しにしていた部分。
codegen_call_set()
から codegen_call()
を呼び出す形にしました。
--- a/vgcg.rb +++ b/vgcg.rb @@ -249,21 +249,10 @@ def codegen_call(fn_arg_names, lvar_names, stmt_rest) puts " add_sp #{fn_args.size}" end -# TODO codegen_call を流用できそう def codegen_call_set(fn_arg_names, lvar_names, stmt_rest) lvar_name, fn_temp = stmt_rest - fn_name, *fn_args = fn_temp - fn_args.reverse.each do |fn_arg| - codegen_expr( - fn_arg_names, lvar_names, fn_arg - ) - puts " push reg_a" - end - - codegen_vm_comment("call_set #{fn_name}") - puts " call #{fn_name}" - puts " add_sp #{fn_args.size}" + codegen_call(fn_arg_names, lvar_names, fn_temp) lvar_addr = to_lvar_addr(lvar_names, lvar_name) puts " cp reg_a #{lvar_addr}"
その他の修正
- コメントの整理・フォーマット・変数名リネーム
- テスト失敗時に diff が大量に出る問題への対策
- Rubocop まわりのメンテナンス(放置気味)
命令廃止とフォーマット修正が効いて 84行減り、1500行を切りました。 よしよし。
$ wc -l common.rb vg*.rb 41 common.rb 63 vgasm.rb 398 vgcg.rb 58 vglexer.rb 454 vgparser.rb 449 vgvm.rb 1463 合計