abcdumpで無名関数がダンプされない
クロージャの実装方法を探るために、いろんなABCをダンプしていて気がついたのだけれども、tamarin付属のabcdumpで一部のメソッドがダンプされないことがある。
function f(){ return function(){ // ダンプされない return 42;} }
直感的には関数内部で定義している無名関数はダンプされない。より正確には、「無名関数」で「はじめて使う位置よりも前で定義されている(ABC的な意味で)」場合。
命令をダンプしつつ、表示するかどうかのフラグを立ててる(m.anon)。そして、無名関数ではそのフラグの初期値が(たぶん)false。そして、newfunctionされるときにフラグを立てている。
なので、newfunctionするよりも前に宣言されていると表示されていないんじゃないかと疑っている。
とりあえず適当にパッチを書いておいた。
--- a/utils/abcdump.as Tue Jun 10 15:24:03 2008 +0200 +++ b/utils/abcdump.as Wed Jun 11 00:24:56 2008 +0900 @@ -1366,6 +1366,13 @@ package abcdump { if (m.anon) { m.dump(this,indent) + m.anon = false + } + } + for each (var m in methods) + { + if (m.anon) { + m.dump(this,indent) } }
TamarinのMLにメール投げるべきか?