PHP の内部的な変更
-
拡張モジュールで zend_execute() をオーバーライドできなくなりました。
かわりに zend_execute_ex() をオーバーライドしないといけません。
EG(current_execute_data) は既に
zend_execute_ex() で初期化されるようになっているので、
互換性を保つために拡張モジュール側で
EG(current_execute_data)->prev_execute_data を使わないといけないかもしれません。
-
EG(arg_types_stack) や
EX(fbc)、EX(called_scope)、そして
EX(current_object) が削除されました。
-
op_array->nested_calls が追加されました。
これはコンパイル時に計算されます。
-
EX(call_slots) が追加されました。これは、構文的にネストした呼び出し
(foo(bar()) など) に関する情報を格納する配列で、
execute_data とともに事前に割り当てられます。
-
EX(call) が追加されました。これは現在呼び出し中の関数へのポインタで、
EX(call_slots) の要素になります。
-
オペコード
INIT_METHOD_CALL、
ZEND_INIT_STATIC_METHOD_CALL、
ZEND_INIT_FCALL_BY_NAME
そして
ZEND_INIT_NS_FCALL_BY_NAME
が、
EX(call_slots) でのインデックスとして
result.num を使うようになりました。
-
オペコード ZEND_NEW
が、
EX(call_slots) でのインデックスとして
extended_value を使うようになりました。
-
オペコード ZEND_DO_FCALL
および
ZEND_DO_FCALL_BY_NAME
が、
EX(call_slots) でのインデックスとして
op2.num を使うようになりました。
-
op_array->used_stack が追加されました。
これはコンパイル時に計算されます。対応するスタック領域は
execute_data とともに事前に割り当てられます。
その結果、オペコード ZEND_SEND* および ZEND_DO_FCALL*
でスタックオーバーフローのチェックが不要になりました。
-
execute_data->Ts フィールドが削除されました。
VM のテンポラリ変数は常に
execute_data 構造体の直前に配置され、
execute_data->Ts を使わなくても
基底ポインタ execute_data からのオフセットでアクセスできるようになりました。
コンパイラは、この新たなオフセットを op_array->opcodes[*].op?.num
に格納します。マクロ
EX_TMP_VAR() および EX_TMP_VAR_NUM()
を使うと、テンポラリ変数に対してオフセットや数値を使ってアクセスできます。
数字をオフセットに変換するには EX_TMP_VAR_NUM(0,
num) を、そしてオフセットを数字に変換するには
(EX_TMP_VAR_NUM(0,0)-EX_TMP_VAR(0,offset))
が使えます。
-
execute_data->CVs フィールドが削除されました。
VM がコンパイルした変数は常に
execute_data 構造体の直後に配置され、
execute_data->CVs を使わなくても
基底ポインタ execute_data からのオフセットでアクセスできるようになりました。
マクロ EX_CV_NUM() を使えば、コンパイルされた変数に対して数字を使ってアクセスできます。