こんにちは、山本です。 >ruby 1.8.2 (2005-04-27) [i386-cygwin] において、 >YAML.dump が無限ループになる場合に遭遇しました。 調べただけで解決にはなってないのですが、 Index: emitter.c =================================================================== RCS file: /src/ruby/ext/syck/emitter.c,v retrieving revision 1.11 diff -u -w -b -p -r1.11 emitter.c --- emitter.c 6 May 2004 06:29:56 -0000 1.11 +++ emitter.c 8 May 2005 06:19:25 -0000 @@ -383,6 +383,8 @@ syck_emitter_start_obj( SyckEmitter *e, */ idx = e->anchors->num_entries + 1; + printf("------> %d %d %d\n", idx, n->pos, e->bufpos); + /* * Create the anchor tag */ if ( n->pos >= e->bufpos ) { とすると、 ------> 1 3 0 ------> 2 680 0 ------> 3 1357 0 ------> 4 2034 0 ------> 5 2511 0 ------> 6 3188 0 ------> 7 3865 4094 (略) ------> 7 3865 8148 (略) となり、Create anchor tag の後の条件文が成り立たなくなっているため、 いつまでたってもアンカーが作られず、無限ループになってしまっています。 e->bufpos が増加していくのは、syck_emitter_flush で e->bufpos += check_room となっているためです。 思うに、 /* * Write the anchor into the buffer */ S_MEMMOVE( start + alen, start, char, e->marker - start ); S_MEMCPY( start + 1, anchor_name, char, strlen( anchor_name ) ); start[0] = '&'; start[alen - 1] = ' '; e->marker += alen; の部分が、そもそもその部分が flush されていると正しく実行できないため、 「固定長バッファ+flush」と「アンカー機能」は互いに矛盾するような気がします。 固定長バッファをやめ、変換結果を全部メモリに格納して、最後に取り出す必要が あるのではないでしょうか。(とは言っても、このライブラリの開発者 why は外国人なので・・・ 一応 ruby-core に振っておきます)