おぎろぐはてブロ

なんだかんだエンジニアになって10年以上

intercept拡張モジュールをいじってみる (予告編)

前回の続きで、次は「pre-intercept時に引数を捕まえるようにする」を実装するつもり (その次は「書き換えられるようにする」、ですね)なのです。

実装するには、interceptのターゲットに渡されている引数をコピーして、call_user_functionしているときに渡せばよい。お、これは、func_get_args系の関数の変な動きから、EG(argument_stack)を中途半端に眺める - おぎろぐはてなで解析したところで、EG(argument_stack)からとってくれば行けるんじゃん?と思ったら勘が外れたので、ちと GDBでトレースしたり zend_call_function あたりのソースコードを読んでるところ。今日はタイムアップ。
てっきり EG(argument_stack).top_elements - 2 あたりに引数詰められてるかと思ったら、入ってなかった。勘違いだといいのだけれど。。んー。

今日分かったことは、zend_call_functionからzend_execute (intercept_executeでフックしたやつ)を呼んでいるということ、そして、zend_call_functionの中で、argument_stackをいじっていること。