レンジオペレータを追加してみよう的な記事を見てやってみたので備忘録。 https://phpinternals.net/articles/implementing_a_range_operator_into_php
わりとコピペなので深堀り(各関数が何やってるかとか)は別途やる予定。
PHPのビルド方法
だいたいこんな感じでビルドできる。
git clone git@github.com:php/php-src.git
cd php-src
./buildconf
./configure --with-iconv=/path/to/libiconv --enable-opcache
make -j4
このあとに、make installしても良いが面倒?な場合はsapi/cli/php
が作られるのでそれを実行して動作確認するでも良さそう。
拡張モジュールは modules/
にある。
設定変えたりブランチ変えて再ビルドしたいときはこんな感じで
make clean
./buildconf --force
./config.nice
make -j4
詳細はPHP Internals Book にめっちゃ書かれているので参照すると良さそう
レンジオペレータの追加
実装したものはこちら
php internalsの記事 にあるように、 以下を実装していけばOK
1. Lexerの修正
- Zend/Zend/zend_language_scanner.l
2. Parserの修正
- Zend/zend_ast.h
- Zend/zend_language_parser.y
3. ASTからVMコードの出力
- Zend/zend_compile.c
4. VMの変更(オペレータ追加)
- Zend/zend_vm_def.h
zend_vm_def.hを修正して make
すると以下のファイルが自動生成される。
(PHPでCを生成しているの凄い。これも後で深堀りしたい
- Zend/zend_vm_execute.h
- Zend/zend_vm_handlers.h
- Zend/zend_vm_opcodes.h
- Zend/zend_vm_opcodes.c
Zend/zend_vm_gen.php を使って生成しているのでこのスクリプトを実行するのでもOK(試してない
echoの改変例
https://github.com/tzmfreedom/php-src/commit/71f330a36f6863af382df0d774c7803f95e4d489
とりあえずwrite()しまくる wei
ステートメントを追加してみた。
echoのコピペ。
coreの変更なのでmod_phpでもCLIでも wei
が使えるようになる。