なかだです。

At Mon, 20 Dec 2004 01:11:54 +0900,
Tanaka Akira wrote in [ruby-dev:25252]:
> 調べてみると、local_append_gen 内の ALLOC_N(ID, 4) で GC が起きたとき
> に問題が起きているようで、
> 
> Index: parse.y
> ===================================================================
> RCS file: /src/ruby/parse.y,v
> retrieving revision 1.363
> diff -u -p -r1.363 parse.y
> --- parse.y	8 Dec 2004 02:46:37 -0000	1.363
> +++ parse.y	19 Dec 2004 15:55:50 -0000
> @@ -7634,6 +7634,7 @@ local_append_gen(parser, id)
>      ID id;
>  {
>      if (lvtbl->tbl == 0) {
> +        rb_gc();
>  	lvtbl->tbl = ALLOC_N(ID, 4);
>  	lvtbl->tbl[0] = 0;
>  	lvtbl->tbl[1] = '_';
> 
> という変更を加えて make すれば再現でき、make の途中で
> ./miniruby ./ext/extmk.rb --dest-dir="" --make="make" --mflags="-n" --make-flags="n" --extout=".ext" --extension  --extstatic  --
> というのが動いたときに core を吐きます。

なぜか再現できてないので未確認ですが、special_local_set()が、作っ
たparser_paramsを指すオブジェクトを保存していないせいだと思いま
す。

しかし、parser_new()は必ずvalueを取り出して保存しなければならな
いわけで、保存先のポインタを渡すなどして確実に保存するようにし
たほうがいいような気もします。他に使っているのもripperしかない
でしょうし。

* parse.y (special_local_set): must keep parser value.


Index: parse.y =================================================================== RCS file: /cvs/ruby/src/ruby/parse.y,v retrieving revision 1.363 diff -U2 -p -r1.363 parse.y --- parse.y 8 Dec 2004 02:46:37 -0000 1.363 +++ parse.y 19 Dec 2004 18:06:40 -0000 @@ -8099,4 +8099,5 @@ special_local_set(c, val) int cnt; struct parser_params *parser = parser_new(); + volatile VALUE p = parser->value; top_local_init();
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦