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

〆。

問題の適用範囲が狭すぎてXbyakも使えなさそう。パディングも嵩張るし、独自(簡易)アセンブラを使うくらいでちょうど良いかも。

*1:一応、独自のマーク付け関数を用意すれば可能。