ScmObjに関連して「タグ(tag)」という用語が2つの意味に用いられているようなので整理。
後者は「クラスタグ」と呼ぶべきか? --naoya_t
objの下位1ビット。
以下のマクロでのみ使用されている
/* Check if the ScmObj is a 'pointer'---either to a pair, a heap object, or a ScmFlonum. */ #define SCM_PTRP(obj) (SCM_TAG1(obj) == 0)
コメントにある通り、末端1ビットが 0 である場合は
objの下位2ビット。以下のマクロで使用される。
下位2ビットが0 → SCM_HPTRP(obj)=#t
-------- -------- -------- ------00 Points to a pair or other heap-allocated objects.
下位2ビットが1 → SCM_INTP(obj)=#t
-------- -------- -------- ------01 30ビット乃至62ビット符号つき整数
下位2ビットが2 → SCM_FLONUMP(obj)=#t
-------- -------- -------- -----M10 M が 0 の場合、値は VM レジスタに保存されており、M が 1 の場合はヒープに保存されている。
objの下位3ビット。
objの下位8ビット。
下位3ビットが3 → SCM_CHARP(obj)=#t
-------- -------- -------- 00000011
29ビット。(≦SCM_CHAR_MAX = 0x1fffffff = 536870911)
下位4ビットが11 (0x0b) → SCM_IMMEDIATEP(obj)=#t
-------- -------- -------- 00001011
#f, #t, '(), #<eof>, #<undef>, unbound value の6が使われている(順に0〜5)
下位4ビットが19
-------- -------- -------- 00010011
macro expanderで使用される
objがポインタのとき(objの下位2ビットが00)、objが指すScmHeader構造体のメンバ (ScmByte *)tag の内容。
下位3ビットが7
-------- -------- -------- -----111
pair および flonum 以外の heap-allocated なオブジェクトの最初のワードのみこの形となる。ScmClass へのポインタの下位3ビットがマスクされている形。
ちなみに 8 バイトで境界整列されるのは BohemGC の仕様によるとの記述が gauche.h の ScmClassRec 構造体の定義のコメントにある。
コメントはありません。 コメント/Reading Gauche/Reading Gauche 0.9/gauche.h/ScmObj/タグについて?