vm2gol v2 (55) VM命令 set_reg_a, set_reg_b の廃止など



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 合計