YamaKen
yamak****@bp*****
2005年 10月 7日 (金) 07:57:07 JST
At Thu, 06 Oct 2005 12:28:07 -1000 (HST), shiro****@lava***** wrote: > > From: YamaKen <yamak****@bp*****> > Subject: [Anthy-dev 2499] Re: ScmObjInternalのCompacting > Date: Fri, 07 Oct 2005 06:46:57 +0900 > > > で、ちょっと考えてるうちに反則気味の手を思い付いたんですが、gc > > bitを多値フラグとして借用したvalueconsはどうでしょう。 > > ScmOp_values()が値を返してからScmOp_call_with_values()と > > ScmOp_SRFI8_receive()が値を受け取るまでの間にはGCが起動する機会 > > は無いのでいけるはずです。 > > (call-with-values (lambda () > (dynamic-wind > (lambda () ...) > (lambda () (values 1 2)) > (lambda () ...))) > consumer) > > でも大丈夫ですか? あ、これはダメですね。ご指摘ありがとうございます。 ScmObjのエンコーディングがどうなるかによりますが、cellに格納され てないScmObjにもgc bitのフィールドがあるならスタック上に保持され たvalueconsはGCが走ってる間も安全にgc bitを保持できますね。 そうでない場合はScm_DynamicWind()の中で一旦情報を退避するように すれば対応できますが、他の関数でも一通りチェックする必要があるし、 ユーザがCで関数を書く場合に危険ですね。 いずれにしても十分注意するようにします。 ------------------------------- ヤマケン yamak****@bp*****