Reading Gauche/Reading Gauche 0.9/gauche.h/ScmObj/タグについて の変更点



 #setlinebreak(on)
 #topicpath
 
 *タグについて [#we53f12b]
 ScmObjに関連して「タグ(tag)」という用語が2つの意味に用いられているようなので整理。
 後者は「クラスタグ」と呼ぶべきか? --[[naoya_t]]
 
 * SCM_TAG1(obj) [#e6bc4639]
 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) [#v9c28b31]
 objの下位2ビット。以下のマクロで使用される。
 -SCM_HPTRP
 --SCM_TAG2(obj) が 0 の場合真を戻す
 -SCM_INTP
 --SCM_TAG2(obj) が 1 の場合真を戻す
 -SCM_FLONUMP
 --SCM_TAG2(obj) が 2 の場合真を戻す
 
 ** 00: ポインタ [#x87c3b99]
 下位2ビットが0 → SCM_HPTRP(obj)=#t
  -------- -------- -------- ------00
  Points to a pair or other heap-allocated objects.
 
 ** 01: 整数 (Fixnum) [#y8cc9ff0]
 下位2ビットが1 → SCM_INTP(obj)=#t
  -------- -------- -------- ------01
  30ビット乃至62ビット符号つき整数
 
 ** 02: 実数 (Flonum) [#je456b8c]
 下位2ビットが2 → SCM_FLONUMP(obj)=#t
  -------- -------- -------- -----M10
  M が 0 の場合、値は VM レジスタに保存されており、M が 1 の場合はヒープに保存されている。
 
 * SCM_TAG3(obj) [#x3417de5]
 objの下位3ビット。
 
 * SCM_TAG8(obj) [#iab28838]
 objの下位8ビット。
 
 ** 11: 文字、特殊オブジェクト、パターン変数 [#l6c04ca1]
 *** 00000011: 文字 [characters] [#b9682585]
 下位3ビットが3 → SCM_CHARP(obj)=#t
  -------- -------- -------- 00000011
 29ビット。(≦SCM_CHAR_MAX = 0x1fffffff = 536870911)
  
 &aname(IMMEDIATE_OBJECTS);
 *** 00001011: 特殊オブジェクト [Miscellaneous] [#ud78d58a]
 下位4ビットが11 (0x0b) → SCM_IMMEDIATEP(obj)=#t
  -------- -------- -------- 00001011
 #f, #t, '(), #<eof>, #<undef>, unbound value の6が使われている(順に0〜5)
  
 *** 00010011: [パターン変数] [#kcb81ec5]
 下位4ビットが19
  -------- -------- -------- 00010011
 macro expanderで使用される
 
 * SCM_OBJ(obj)->tag (クラスタグ) [#wa58db31]
 objがポインタのとき(objの下位2ビットが00)、objが指すScmHeader構造体のメンバ (ScmByte *)tag の内容。
 -クラスオブジェクト(ScmClass)を格納する場合、tagメンバにはクラスオブジェクトのポインタアドレスに 7 を加えた値が入る。
 ↑tagメンバの下位3ビットが 7ならクラスオブジェクト。ペア(ScmPair)が格納されている場合は 7 以外になる。
 
 ** 111: ヒープオブジェクト [#c524b919]
 下位3ビットが7
  -------- -------- -------- -----111
 pair および flonum 以外の heap-allocated なオブジェクトの最初のワードのみこの形となる。ScmClass へのポインタの下位3ビットがマスクされている形。
 ちなみに 8 バイトで境界整列されるのは BohemGC の仕様によるとの記述が gauche.h の ScmClassRec 構造体の定義のコメントにある。
 
 *関連 [#c851ca3a]
 **タグ [#k15e6f4b]
 -[[Reading Gauche/gauche.h/ScmObj]]
 -[[Reading Gauche/gauche.h/SCM_PTRP]]
 -[[Reading Gauche/gauche.h/SCM_INTP]]
 -[[Reading Gauche/gauche.h/SCM_CHARP]]
 -[[Reading Gauche/gauche.h/SCM_IMMEDIATEP]]
 -[[Reading Gauche/Reading Gauche 0.9/gauche.h/ScmObj]]
 -[[Reading Gauche/Reading Gauche 0.9/gauche.h/SCM_TAG1]]
 -[[Reading Gauche/Reading Gauche 0.9/gauche.h/SCM_TAG2]]
 -[[Reading Gauche/Reading Gauche 0.9/gauche.h/SCM_TAG3]]
 -[[Reading Gauche/Reading Gauche 0.9/gauche.h/SCM_TAG8]]
 -[[Reading Gauche/Reading Gauche 0.9/gauche.h/SCM_PTRP]]
 -[[Reading Gauche/Reading Gauche 0.9/gauche.h/SCM_HPTRP]]
 -[[Reading Gauche/Reading Gauche 0.9/gauche.h/SCM_HTAG]]
 -[[Reading Gauche/Reading Gauche 0.9/gauche.h/SCM_INTP]]
 -[[Reading Gauche/Reading Gauche 0.9/gauche.h/SCM_CHARP]]
 -[[Reading Gauche/Reading Gauche 0.9/gauche.h/SCM_IMMEDIATEP]]
 **クラスタグ [#f09e4f52]
 -[[Reading Gauche/gauche.h/SCM_CLASS]]
 -[[Reading Gauche/gauche.h/SCM_CLASS_OF]]
 -[[Reading Gauche/gauche.h/SCM_SET_CLASS]]
 -[[Reading Gauche/gauche.h/SCM_CLASS2TAG]]
 -[[Reading Gauche/gauche.h/SCM_HOBJP]]
 -[[Reading Gauche/Reading Gauche 0.9/gauche.h/SCM_CLASS]]
 -[[Reading Gauche/Reading Gauche 0.9/gauche.h/SCM_CLASS_OF]]
 -[[Reading Gauche/Reading Gauche 0.9/gauche.h/SCM_SET_CLASS]]
 -[[Reading Gauche/Reading Gauche 0.9/gauche.h/SCM_CLASS2TAG]]
 -[[Reading Gauche/Reading Gauche 0.9/gauche.h/SCM_HOBJP]]
 
 *参照元 [#peb71f76]
 #related
 
 *コメント [#l5cde1dc]
 #pcomment(,1000,below,reply)

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

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.020 sec.