http://www.kmonos.net/wlog/64.html#_2340060823
おお面白い。 24 は
void** fa0; asm { mov fa0, EBP; }; void** fa1 = cast(void**)*fa0; void** fa2 = cast(void**)*fa1; *dg = sp[0 .. (*dg-sp+(cast(byte*)fa2-cast(byte*)fa1))].dup.ptr + (*dg-sp);
こんな感じでやってやれば大丈夫な気がしますが定かではありません。とりあえず、
int delegate(int) many(int i0, int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, int i9) { return closure((int y){return y+i0+i1+i2+i3+i4+i5+i6+i7+i8+i9;}); } void main() { auto m = many(1,2,3,4,5,6,7,8,9,10); dout.writef(m(11), " ", m(22), "\n"); }
みたいな感じで値が壊れてないことは確認しました。
バックトレース取るのは他にも GCC なら __builtin_frame_address(x) とか、 libunwind とかなら多少ポータブルに。