Reading Gauche/Reading Gauche 0.9/gauche.h/ScmObj/タグについて


Top / Reading Gauche / Reading Gauche 0.9 / gauche.h / ScmObj / タグについて

タグについて

ScmObjに関連して「タグ(tag)」という用語が2つの意味に用いられているようなので整理。
後者は「クラスタグ」と呼ぶべきか? --naoya_t

SCM_TAG1(obj)

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 である場合は

SCM_TAG2(obj)

objの下位2ビット。以下のマクロで使用される。

00: ポインタ

下位2ビットが0 → SCM_HPTRP(obj)=#t

-------- -------- -------- ------00
Points to a pair or other heap-allocated objects.

01: 整数 (Fixnum)

下位2ビットが1 → SCM_INTP(obj)=#t

-------- -------- -------- ------01
30ビット乃至62ビット符号つき整数

02: 実数 (Flonum)

下位2ビットが2 → SCM_FLONUMP(obj)=#t

-------- -------- -------- -----M10
M が 0 の場合、値は VM レジスタに保存されており、M が 1 の場合はヒープに保存されている。

SCM_TAG3(obj)

objの下位3ビット。

SCM_TAG8(obj)

objの下位8ビット。

11: 文字、特殊オブジェクト、パターン変数

00000011: 文字 [characters]

下位3ビットが3 → SCM_CHARP(obj)=#t

-------- -------- -------- 00000011

29ビット。(≦SCM_CHAR_MAX = 0x1fffffff = 536870911)

00001011: 特殊オブジェクト [Miscellaneous]

下位4ビットが11 (0x0b) → SCM_IMMEDIATEP(obj)=#t

-------- -------- -------- 00001011

#f, #t, '(), #<eof>, #<undef>, unbound value の6が使われている(順に0〜5)

00010011: [パターン変数]

下位4ビットが19

-------- -------- -------- 00010011

macro expanderで使用される

SCM_OBJ(obj)->tag (クラスタグ)

objがポインタのとき(objの下位2ビットが00)、objが指すScmHeader構造体のメンバ (ScmByte *)tag の内容。

111: ヒープオブジェクト

下位3ビットが7

-------- -------- -------- -----111

pair および flonum 以外の heap-allocated なオブジェクトの最初のワードのみこの形となる。ScmClass へのポインタの下位3ビットがマスクされている形。
ちなみに 8 バイトで境界整列されるのは BohemGC の仕様によるとの記述が gauche.h の ScmClassRec 構造体の定義のコメントにある。

関連

タグ

クラスタグ

参照元

コメント

コメントはありません。 コメント/Reading Gauche/Reading Gauche 0.9/gauche.h/ScmObj/タグについて?

お名前:

MENU

now: 5

リンク


最新の20件
2018-10-07 2018-09-20 2018-09-03 2018-05-09 2017-09-29 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-05-29 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 3987, today: 1, yesterday: 1

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2010-01-29 (金) 16:13:38 (3217d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.053 sec.