青木です。

  In mail "[ruby-dev:25258] Re: core dump if local_append_gen invokes GC"
  Yukihiro Matsumoto <matz / ruby-lang.org> wrote:

> まつもと ゆきひろです

> |なぜか再現できてないので未確認ですが、special_local_set()が、作っ
> |たparser_paramsを指すオブジェクトを保存していないせいだと思いま
> |す。
> |
> |しかし、parser_new()は必ずvalueを取り出して保存しなければならな
> |いわけで、保存先のポインタを渡すなどして確実に保存するようにし
> |たほうがいいような気もします。他に使っているのもripperしかない
> |でしょうし。
> |
> |* parse.y (special_local_set): must keep parser value.
> 
> 抜本的な改善はあおきさんに任せるとして、当面はこのパッチで行
> こうと思います。コミットしてください。

いちおう修正しましたが、中田さんのパッチ以上にきれいには
なりませんでした。struct parser_params には VALUE のメンバが
あるので、どちらにしろパーサオブジェクト自体を VALUE 化して
メンバをマーク対象にする必要があります。

そう考えると、parser_new() は VALUE にしなければならないものを
非 VALUE で返すわけで、危なすぎて実質上使えません。そこで
parser_new() は static にして、VALUE を返す rb_parser_s_new()
を新設しました。こっちもとりあえず static にしてあります。
-------------------------------------------------------------------
青木峰郎