C言語でCurrying 4
Boehm GCと組み合わせた場合の注意点について述べる。
悪い例。
下のような記述ではGC_malloc()で取得したポインタを部分適用したものの、肝心のメモリ領域が回収されてしまう。何故かと言えば、GC_malloc()で取得したポインタがポインタサイズ境界に位置しておらず、Boehm GCがポインタだと認識できないからだ*1。
58 pop %eax 68 78 56 34 12 push ptr 50 push %eax b8 f0 de bc 9a mov func,%eax ff e0 jmp *%eax
良い(?)例。
クイックハック以外の何者でもない解決策だが、適宜ポインタの位置をサイズ境界に調整すれば想定どおり動くようになる。
58 pop %eax 90 nop 90 nop 68 78 56 34 12 push ptr 50 push %eax 90 nop 90 nop b8 f0 de bc 9a mov func,%eax ff e0 jmp *%eax
*1:一応、独自のマーク付け関数を用意すれば可能。