2007年 12月 08日

Deferred チェインのときの setTimeout

http://coderepos.org/share/browser/lang/javascript/jsdeferred/trunk/jsdeferred.js?rev=2761#L119

の setTimeout について、スタックを消費するからこうしている、と書いたのは、next の問題で無駄な Deferred を生成していたせい ( http://subtech.g.hatena.ne.jp/cho45/20071202/1196571302 ) で、Stack over flow がでたことがあったからなんだけど、next の問題は解決したので、あらためて必要かどうか考えたらいらない気がした。

でもって http://coderepos.org/share/changeset/2817 はずしてみた。Safari はスタックサイズがかなりちっちゃくて、600?くらいの再帰でオーバーフローするからテストでは loop(1000 を実行してちゃんと戻ってくるかをテストしてる (loop は内部で next と call よんでる)。

この修正で、チェイン間ではブラウザへ処理がもどらなくなる。もどしたいなら wait(0) を return すればもどせる。

Stack over flow

Mac 10.4.11 Mem 2G

javascript:n=0;(function(){n++;arguments.callee();})();
javascript:alert(n);
Firefox 3.0b1
261503
Safari 3.0.4
500
Opera 9.24
3340
Thunderbird 2.0.0.9
1000

Fx の深さはなんなんだ……

Rhino だとインタプリタモードのときはいくらでもいける……

$ rhino -opt -1 -e 'n=0;(function(){n++;print(n);arguments.callee();})();'
#=> どこまでも
$ rhino -opt 0 -e 'n=0;(function(){n++;print(n);arguments.callee();})();'
2054
/home/cho45/bin/rhino: line 11: 31589 Segmentation fault      "$JAVA" -jar ~/bin/js.jar "$@"
exit 139

あふれると SEGV ってのはどうなんだ

Good Dog Happy Men - 新宿 TOWER RECORD インストアミニライブ

なんか想像以上によかった。ちょっとおかしいぐらい好きなことに打ち込んでる感がやっぱすばらしい。分野の違い、みたいな、うまくいえないけど、そういうのを感じた。なんとなく梅田もちおを想起した。