備忘録

もしかすると以前にエントリ入れてるかもしれませんが検索略でメモ。
run_loop() 手続き周辺をきちんと読みたい。どうも何かがツナガッてません。

とりあえず

インストラクションな分岐の直前なコードが以下

        FETCH_INSN(code);
        SWITCH(SCM_VM_INSN_CODE(code)) {

ええと FETCH_INSN が以下なソレを前提とすると

#define FETCH_INSN(var)         ((var) = *PC++)

プログラムカウンタのナニが code に格納されている。ちなみに code は ScmWord 型。これは gauche.h にて定義されている。

typedef unsigned long ScmWord;

32bit 符号ナシ。で、このあたり関連なマクロが以下

/* Macros for transition to the packed code vector of NVM.
   In the packed code vector, VM insns are stored untagged.
   It eliminates the shift in the dispatcher. */
#define SCM_VM_INSN_CODE(obj)       (SCM_WORD(obj)&0x0ff)
#define SCM_VM_INSN_ARG(obj)        ((signed long)SCM_WORD(obj) >> 8)
#define SCM_VM_INSN_ARG0(obj)       ((SCM_WORD(obj) >>  8) & 0x03ff)
#define SCM_VM_INSN_ARG1(obj)       ((SCM_WORD(obj) >> 18) & 0x03ff)

コメントがナニなのでしょうがスルー。引数は 10bit な模様。

    <--A RG1--><- -ARG0--> <-code->
11111111 22222222 33333333 44444444

この解釈でビンゴかどうかは微妙ッス。何故に 10bit なのか、も現時点で不明。

てーか

使用例が例によって思いつかぬ (を