SCM_PROCEDUREP マクロ

gauche.h が gauche-0.1 見てた頃と随分違う印象。てーかわしが削除した部分なんだろな。
見ててワケワカなので調べプロセスを以下に控え。まずマクロ本体の定義が以下

#define SCM_PROCEDUREP(obj) \
    (SCM_HOBJP(obj) && SCM_CLASS_APPLICABLE_P(SCM_CLASS_OF(obj)))

SCM_HOBJP マクロは HEAP ALLOCATED OBJECT かどうかを判定するものらしい。

#define SCM_HOBJP(obj)  (SCM_PTRP(obj)&&SCM_TAG(SCM_OBJ(obj)->tag)==3)

SCM_PTRP マクロと SCM_TAG の定義が以下

#define	SCM_TAG(obj)     (SCM_WORD(obj) & 0x03)
#define SCM_PTRP(obj)    (SCM_TAG(obj) == 0)

うーん。一瞬真が戻りっこなさげに見えた。これはリハビリなんだろうか、という気分に。整理してみると

  • obj は Pointer でなければならない
  • obj が指す領域 (ココがぱっと見わからんかった) の tag 属性の末端 2bit が 11 でないと駄目

という条件を満足するのが HEAP ALLOCATED OBJECT である、と。次はもう片方の式ですが、まず SCM_CLASS_OF の定義が以下

/* Extract the class pointer from the tag.
   You can use these only if SCM_HOBJP(obj) != FALSE */
#define SCM_CLASS_OF(obj)      SCM_CLASS((SCM_OBJ(obj)->tag - 3))

こんどは tag から 3 引いている。マクロにも SCM_HOBJP(obj) が FALSE の時はこれ使えんからね、とあるな。3 引いたらポインタ値になる、というのが前提で、指してる領域が SCM_CLASS_APPLICABLE_P だったら云々、ですか。

#define SCM_CLASS_APPLICABLE_P(obj) (SCM_CLASS_FLAGS(obj)&SCM_CLASS_APPLICABLE)

指してる領域 (ScmClassRec 構造体の) flags 属性が 0x4 だったら真。
ちょっと出かける用件があるのでここで中断。どうやってまとめたものやら。

帰宅。また割り込み入るかもしれませんが作業再開。微妙にオチてないのが

SCM_CLASS_APPLICABLE_P(SCM_CLASS_OF(obj))

だったり。ええと以下の前提なのかな??

  • SCM_HOBJP が真を戻すオブジェクトは tag 属性から 3 引いたら (tag の末端 2bit 11 前提)、そのオブジェクトが属するクラスのオブジェクトへのポインタになっている??

って SCM_HOBJP マクロの定義のま上にコメントあり

/*
* HEAP ALLOCATED OBJECTS
*
* A heap allocated object has its class tag in the first word
* (except pairs). Masking the lower two bits of class tag
* gives a pointer to the class object.
*/

あるいは gauche.h の最初にある TAG に関するコメントにも解説あり

* [Heap object]
* -------- -------- -------- ------11
* Only appears at the first word of heap-allocated
* objects except pairs. Masking lower 2bits gives
* a pointer to ScmClass.

ペア以外、って連呼されてますな。基本的に先頭ワードはタグになってて HEAP ALLOCATED OBJECT だと指してる領域の先頭ワードの末端 2bit は 11 でそっから 3 引いたらクラスオブジェクトへのポインタになってるのが前提、と。
で、この情報をどこまで概要に盛り込めば良いのでしょうか。