Внутренние изменения 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
,
вычисляемый в момент компиляции; соответствующее место под стек
выделяется совместно с 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() для доступа к
скомпилированным переменным по номеру.
There are no user contributed notes for this page.