データ構造について自分メモ (Scm_Error とか云々の続き
Scm_MakeError() で何をしているか。
オブジェクト生成は以下のはず
ScmError *e = SCM_ERROR(message_allocate(SCM_CLASS_ERROR, SCM_NIL));
SCM_ERROR マクロは ScmError * にキャストするマクロなのでその中身がナニ。message_allocate は関数になってて定義は以下
static ScmObj message_allocate(ScmClass *klass, ScmObj initargs) { ScmError *e = SCM_ALLOCATE(ScmError, klass); SCM_SET_CLASS(e, klass); e->message = SCM_FALSE; /* would be set by initialize */ return SCM_OBJ(e); }
SCM_ALLOCATE マクロは以下の定義で
/* cliche in allocate method */ #define SCM_ALLOCATE(klassname, klass) \ ((klassname*)Scm_AllocateInstance(klass, sizeof(klassname)))
ええと、ScmError の SCM_CLASS_CATEGORY は何だ。てーか、実際の呼び出しとしては以下に置換されるはず
((ScmError*)Scm_AllocateInstance(SCM_CLASS_ERROR, sizeof(ScmError)))
なのか。で、その中では第一引数について SCM_CLASS_CATEGORY がどうか、な処理になってるんですが、定義を見るに
SCM_DEFINE_BASE_CLASS(Scm_ErrorClass, ScmError, message_print, NULL, NULL, message_allocate, error_cpl+1);
で、これは SCM_CLASS_BASE という文言が見えるので (を、
/* define a class that can be subclassed by Scheme */ #define SCM_DEFINE_BASE_CLASS(cname, ctype, printer, compare, serialize, allocate, cpa) \ SCM__DEFINE_CLASS_COMMON(cname, sizeof(ctype), \ SCM_CLASS_BASE, \ printer, compare, serialize, allocate, cpa)
SCM_CLASS_CATEGORY はそれに当たるはず。
ラスト
きちんと理解できてれば、既存分についてもコメントも入れれるのになぁ、という事に思い至ると同時にもしかして既存分について手を入れてたりするのかも、という寒い思いをしてたりなんかします。
既存は直接直さずに一旦コメント、という事は肝に命ずる必要あり。