Внутренние изменения 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
используют result.num как индекс в
EX(call_slots).
-
Байткод ZEND_NEW использует
extended_value как индекс в
EX(call_slots).
-
Байткоды ZEND_DO_FCALL
и
ZEND_DO_FCALL_BY_NAME
используют op2.num как индекс в
EX(call_slots).
-
Добавлен op_array->used_stack,
вычисляемый в момент компиляции; which is calculated at
compile time; соответствующее место под стек
выделяется совместно с 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() для доступа к
скомпилированным переменным по номеру.