[Anthy-dev 2502] Re: ScmObjInternalのCompacting

Back to archive index

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*****



Anthy-dev メーリングリストの案内
Back to archive index