[ruby-list:40807] Re: YAML.dump で無限ループになる
From:
"H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date:
2005-05-08 06:46:46 UTC
List:
ruby-list #40807
こんにちは、山本です。
>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 に振っておきます)