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() を使えば、コンパイルされた変数に対して数字を使ってアクセスできます。