SBCLのsrc/runtimeディレクトリのC言語で記述された箇所を読む努力をしてみる。脳みそのスペックと英語力と注意力が無いので多々憶測を含む。
lispobjは名前のとおりlispのオブジェクトを表すものだと思われるが、こいつがどのように利用されているか見ていく。
N_WORD_BITS == 32とする(genesis/config.h)。 runtime.hやgenesis/constants.hあたりにタグなどの定義がある。
定義(runtime.h)
/* fake it on alpha32 */
typedef unsigned int lispobj;
#define LOW_WORD(c) ((long)(c) & 0xFFFFFFFFL)
LOWTAG
LOWTAG_MASKはconstants.h(自動生成される)で7と定義されている。 lispobjの下位3ビットを利用したタグ。
- タグの値:定義されている定数の名前
- 0:EVEN_FIXNUM_LOWTAG
- 1:INSTANCE_POINTER_LOWTAG
- 2:OTHER_IMMEDIATE_0_LOWTAG
- 3:LIST_POINTER_LOWTAG
- 4:ODD_FIXNUM_LOWTAG
- 5:FUN_POINTER_LOWTAG
- 6:OTHER_IMMEDIATE_1_LOWTAG
- 7:OTHER_POINTER_LOWTAG
ビット0が立っていれば何らかのポインタである。
整数をN_FIXNUM_TAG_BITS(2)左にシフトすることで偶数ならEVEN_FIXNUM_LOWTAGが、奇数ならODD_FIXNUM_LOWTAGがLOWTAGにセットされる。なのでfixnumが表現できるのは
__attribute__((noreturn))]であるlose関数を呼び出す。29ビット30ビット。 OTHER_IMMEDIATE_x_LOWTAGはWIDETAGで何を示すのかを表すっぽい。 WIDETAG
WIDETAG_MASKが255と定義されているので、lispobjの下位8ビットがWIDETAG。 xxx_WIDETAGと定義されている定数の下位3ビットが2か6になっているので、LOWTAGが OTHER_IMMEDIATE_x_LOWTAGのときはWIDETAGで値の種類を判別するのだと思う。 メモ
lispobjとはとくに関係ないけど、runtime.hのQSHOW_SIGNALSを真にすると実行中にいろいろメッセージを吐くようになる。 make.shを実行すると、runtimeディレクトリにsbclという実行ファイルが作られる。 --core引数をつけずに実行すると、search_for_core関数でコアファイルを探そうとする。 コアファイルはcoreparse.cのload_core_file関数で読み込まれるが、その際コアファイルと実行ファイルのビルドIDが一致しなければnever_returns [
loseはわりといろんなところから呼ばれている。処理を続行できないエラーの場合に呼び出しているのだろう。
load_core_fileは最初に実行すべき関数のlispobjを返す。このlispobjを main関数の終わり付近でcreate_initial_thread関数の引数として利用する。
0 件のコメント:
コメントを投稿