[ruby-list:37750] Re: rb_ary_push

From: nobu.nakada@...
Date: 2003-06-04 13:13:51 UTC
List: ruby-list #37750
なかだです。

At Wed, 4 Jun 2003 20:22:32 +0900,
EMOTO Masahiko wrote:
> プログラム中で配列の大きさ(サンプルではN、M)が小さい時は
> 動作するのですが、大きくすると落ちてしまいます。

スタック上のGCから保護される範囲から、aryとary2が外れているのだ
と思います。

実際のコードや最適化の具合によって条件は変わりますが、一般的に
ruby_init()を呼ぶ関数と同じかそれよりも(コールグラフで)上の関数
では、VALUEを使うのは危険です。rb_ary_new()以降を別関数に分ける
とうまくいくかも知れません。

あるいは、Init_stack()をより上位のアドレスで呼び出すとか。

int
main(int argc, char **argv)
{
  int i,j;
  VALUE ary,ary2;
  ruby_init();
  Init_stack((VALUE*)&argc);  /* <---- ここ */
  ruby_init_loadpath();
  ary = rb_ary_new();
  for(i=0;i<N;i++){
    ary2 = rb_ary_new();
    for(j=0;j<M;j++){
      rb_ary_push(ary2,rb_float_new((double )i));
      rb_ary_push(ary,ary2);
    }
  }
}

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread