ひとり勉強会

ひとり楽しく勉強会

YARVソースコード勉強会 (14)

お久しぶりです。週一の勉強会だったはずなのにお久しぶりです。

[YARV] insnhelper.h

insns.defはYARVの命令の実装なので、VMの内部状態をいろいろと操作します。VM前々回見たようなデータ構造で表現されてるわけですが、これをもう少し抽象化して、簡潔にアクセスするためのマクロが insnhelper.h というファイルに用意されていました。

#define REG_CFP (reg_cfp)
#define REG_PC  (REG_CFP->pc)
#define REG_SP  (REG_CFP->sp)
#define REG_LFP (REG_CFP->lfp)
#define REG_DFP (REG_CFP->dfp)

制御フレーム上の重要なアドレスを指す変数達。

#define GET_SP()   (USAGE_ANALYSIS_REGISTER_HELPER(1, 0, REG_SP))
#define SET_SP(x)  (REG_SP  = (USAGE_ANALYSIS_REGISTER_HELPER(1, 1, (x))))

#define GET_LFP()  (USAGE_ANALYSIS_REGISTER_HELPER(3, 0, REG_LFP))
#define SET_LFP(x) (REG_LFP = (USAGE_ANALYSIS_REGISTER_HELPER(3, 1, (x))))

#define GET_DFP()  (USAGE_ANALYSIS_REGISTER_HELPER(4, 0, REG_DFP))
#define SET_DFP(x) (REG_DFP = (USAGE_ANALYSIS_REGISTER_HELPER(4, 1, (x))))

それらへのsetter/getterマクロ。USAGE_ANALYSIS_REGISTER_HELPERマクロは、YARVではオプションによってどのレジスタがどのくらい使われたかなどの統計を取れるようになっているので、その統計作業用マクロです。値としては単にマクロの第3引数の値になります。

#define GET_PC()           (USAGE_ANALYSIS_REGISTER_HELPER(0, 0, REG_PC))
#define SET_PC(x)          (REG_PC = (USAGE_ANALYSIS_REGISTER_HELPER(0, 1, x)))

#define JUMP(dst)          (REG_PC += (dst))

PCの操作。などなど。他いろいろとマクロが定義されています。