Расширения больше не могут переопределять
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).
Добавлен op_array->used_stack,
вычисляемый в момент компиляции; соответствующее место под стек
выделяется совместно с execute_data. В
результате, байткоды ZEND_SEND* и ZEND_DO_FCALL*
больше не требуют проверки на переполнение стека.
Удалено поле execute_data->Ts.
Временные переменные VM всегда размещаются
сразу перед структурой execute_data,
и теперь более предпочтительно обращаться к ним по
смещению от базового указателя
execute_data вместо того, чтобы
использовать execute_data->Ts.
Компилятор хранит новые смещения в
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 вместо того,
чтобы использовать execute_data->CVs.
Вы можете использовать макрос
EX_CV_NUM() для доступа к
скомпилированным переменным по номеру.