Files
hakorune/docs/private/papers/reference/mir-dumper-guide.md

2.2 KiB
Raw Blame History

MIR Dumper Output Guide

Note: 本ガイドの正典は docs/reference/mir-dumper-guide.md にありますpapers 配下は参照用のコピーです)。

MIRダンプ出力を正しく読み解くためのガイドです。

BoxCall vs 通常のCall の見分け方

BoxCall形式プラグイン/ビルトインBoxのメソッド

%8 = call %7.cloneSelf()
%17 = call %7.open(%14, %16)
%22 = call %7.write(%21)
%23 = call %8.copyFrom(%7)

特徴:

  • call %値.メソッド名(引数) の形式
  • 値(%7, %8などに対して直接メソッドを呼ぶ
  • プラグインBoxやビルトインBoxで使用される

通常のCall形式ユーザー定義Boxのメソッド

%func = const "UserBox.calculate/2"
%result = call %func(%me, %arg1)

特徴:

  • 事前に const "クラス名.メソッド名/引数数" で関数値を取得
  • call %関数値(%me, 引数...) の形式で呼び出し
  • 第1引数は常に %meself相当

実例での比較

plugin_boxref_return.nyashのMIRダンプ

11: %7 = new FileBox()
12: call %7.birth()
13: %8 = call %7.cloneSelf()        ← BoxCallプラグインメソッド
26: %17 = call %7.open(%14, %16)    ← BoxCallプラグインメソッド
33: %22 = call %7.write(%21)        ← BoxCallプラグインメソッド
34: %23 = call %8.copyFrom(%7)      ← BoxCallプラグインメソッド

これらはすべてBoxCall形式で、プラグインのFileBoxメソッドを直接呼び出しています。

ユーザー定義Boxの場合仮想例

; ユーザー定義Box "Calculator" のメソッド呼び出し
%calc_func = const "Calculator.add/2"
%result = call %calc_func(%me, %10, %20)

この場合は、MIR関数として事前にlower済みのメソッドを呼び出しています。

まとめ

  • call %値.メソッド() → BoxCallプラグイン/ビルトイン)
  • call %関数値(%me, ...) → 通常のCallユーザー定義Box

MIRダンプを見る際は、この形式の違いに注目することで、どのタイプのメソッド呼び出しかを判断できます。