From: nobu@... Date: 2004-12-20T03:17:35+09:00 Subject: [ruby-dev:25255] Re: core dump if local_append_gen invokes GC なかだです。 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はできる。 中田 伸悦