In message <E11nOeW-0005jl-00 / ev.netlab.co.jp>
matz / netlab.co.jp writes:

> このパッチだけから推測すると以下の点がまずそうです。
> 
>   * pi, eul, inf, ninfが保護されていない。
> 
>     これらはローカル変数にすべきでしょう。グローバル変数から
>     参照されるオブジェクトはGCの対象にならないので、途中で回
>     収される危険があります。

GC の対象に*なる*ので? それにしても何だか良くわからないので質問です.


最初の物ではグローバル変数を Data_Wrap_Struct した上で,
rb_define_const していました.PI ならこんな感じ.

    extern QELT qpi[];          /* array of QELT defined in qfloat */
    
    Init_qfloat()
    {
         VALUE PI;
    
         PI = Data_Wrap_Struct(rb_cQfloat, 0, free, qpi);
         rb_define_const(rb_cQfloat, "PI", PI);
    }

rb_define_const して ruby から参照しているから GC されないつもりだった
のですが,これがしっかり GC の対象になってしまった?

# ruby から直接参照されないグローバル変数は保護しなければいけない,っ
# ていうのはありますが.これは参照しているし.


パッチ後の物は

    extern QELT qpi[];          /* array of QELT defined in qfloat */
    QELT *pi
    
    Init_qfloat()
    {
        VALUE PI;
    
        pi = ALLOC_N(QELT, NQ); /* pointer to head of array */
        qmov(qpi, pi);
        PI = Data_Wrap_Struct(rb_cQfloat, 0, free, pi);
        rb_define_const(rb_cQfloat, "PI", PI);
    }

で,本当はこのままだと危険だから rb_global_variable で保護しなければい
けない?

# でも ruby から参照してるんですよね.っていうか,前のが GC が原因でま
# ずいのならこちらでも同じようにまずいはず.


-- 
柳川和久 @ 東大阪市 . 大阪府                              November 16, 1999
Never put off till tomorrow what you can do today.