Внутренние изменения 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() для доступа к скомпилированным переменным по номеру.