2009/09/27
C++ メンバ関数のポインタをアドレスとして取得
C++ のメンバ関数は関数ポインタをとる事は出来てもアドレスは無理。とはいえ JIT で必要なので以下の方法でとる事に。
実体は this が第一引数のマングリングされた関数だから呼べるのは当たり前だけど合法かが微妙。
const Object t = Object::makeFixnum(1234); fixedint (Object::*func1)() const = &Object::toFixnum; // メンバ関数ポインタによる呼び出し printf("func1=%d\n", (t.*func1)()); // 無理矢理 void** p = reinterpret_cast<void**>(&func1); fixedint (*func2)(const Object*) = reinterpret_cast<fixedint (*)(const Object*)>(*p); printf("func2=%d address=%p\n", (*func2)(&t), func2);
Permalink | コメント(6) | トラックバック(0) | 23:40
![]()
分岐が動くようになった - JIT実験中
(let* ([label (gensym)] [asm (assemble `((movq rax ,(vm-make-fixnum 2)) (movq rbx ,(vm-make-fixnum 2)) (cmpq rax rbx) (je ,label) (movq rax ,(vm-make-fixnum 3)) (label ,label) (retq)))] [proc (u8-list->c-procedure asm)]) (test-true (procedure? proc)) (test-eq 2 (proc)))
Permalink | コメント(3) | トラックバック(0) | 15:16
![]()
Profile
Mona OS - Free operating system
Contact
Search
Books
Articles
- 過去のおすすめ本一覧
- ハッカー養成塾:ハッカーへの遠回り
- 関数型言語の勉強の連載
- 一人読書会
- Ubuntu 7.10 Gutsy インストール
- Ubuntu 7.10 Gutsyへアップグレード
- Ubuntu 6.06 LTSインストール
- Ubuntu 6.10 Edgy インストール
- 計算機プログラムの構造と解釈
- Modern C++ Design読書会
- はてな退職のお知らせ
- プログラマとして最低限身につけるべき知識
Reading Gauche
Books
Swimming(m)
PV
23360555


