hoc 不具合にて何点かメモ
int (*)(void) な配列に double (*)(void) な値が入っててそれを呼び出してしまった場合、内部的に (とくに return 時) どういった事象が発生しているのかがさっぱり分からんかった。
ちなみに disas してオチてる箇所も特定はできてるんでもう少し暇があれば何故か、は分かりそうなんですが微妙。
で、int な戻り値は (x86 系では) eax 使ってるのは分かっていたんですが double な戻り値はどうやってんの?について調べものしてみたんですが、検索の仕方が悪かったらしく微妙なコンテンツばかりヒット。
一応、以下にナニげなポインタを備忘録がわりにメモ。(あんまし参考になりません。FPU とか浮動小数点レジスタとかで検索かけた方が良いのかも)
- SPARC と x86 のアーキテクチャの相違 (呼び出し規約)
http://jp.sum.com/products/software/solaris/wp/Solaris_x86/chap4.html - プログラミング序論
http://www.ics.kagoshima-u.ac.jp/edu/gengo0/index.html - Using and Porting the GNU Compiler Collection (GCC)
http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_toc.html
正確に言うと double (*)(void) じゃなくて double と ポインタの共用体を返却してるんだよねぇ。しかも gdb 上で disas したら eax に返却値を突っ込んでるぽく見えるし。
とりあえず面倒くさいので execute から呼ばれる pop だけ、int を返却するようラップして誤魔化してしまいました。(こら