34#ifdef HAVE_GCC_GLOBAL_REGS
35# pragma GCC diagnostic ignored "-Wvolatile-register-var"
36# if defined(__x86_64__)
38register const zend_op*
volatile opline __asm__(
"%r15");
41register const zend_op*
volatile opline __asm__(
"%edi");
42# elif defined(__aarch64__)
44register const zend_op*
volatile opline __asm__(
"x28");
46# pragma GCC diagnostic warning "-Wvolatile-register-var"
69 zend_vm_stack_free_call_frame_ex(
call_info, old_execute_data);
77#ifndef HAVE_GCC_GLOBAL_REGS
82#ifdef HAVE_GCC_GLOBAL_REGS
105#ifdef HAVE_GCC_GLOBAL_REGS
128 uint32_t first_extra_arg = op_array->
num_args;
131 uint32_t type_flags = 0;
135#ifdef HAVE_GCC_GLOBAL_REGS
136 opline += first_extra_arg;
138 EX(opline) += first_extra_arg;
145 dst = src + (op_array->
last_var + op_array->
T - first_extra_arg);
153 }
while (src !=
end);
164 }
while (src !=
end);
187#ifndef HAVE_GCC_GLOBAL_REGS
190 const zend_op *opline =
EG(opline_before_exception);
195 zend_vm_stack_free_args(
call);
201 zend_vm_stack_free_call_frame(
call);
267#ifndef HAVE_GCC_GLOBAL_REGS
287#ifndef HAVE_GCC_GLOBAL_REGS
304 const zval *
key, uint32_t
flags,
int check_defined_only)
306#ifndef HAVE_GCC_GLOBAL_REGS
326 if (!check_defined_only) {
334 if (!check_defined_only) {
350 return _zend_quick_get_constant(
key,
flags, 0);
355 return _zend_quick_get_constant(
key, 0, 1);
363#ifndef HAVE_GCC_GLOBAL_REGS
372#ifdef HAVE_GCC_GLOBAL_REGS
379#ifdef HAVE_GCC_GLOBAL_REGS
410#define TRACE_RECORD(_op, _info, _ptr) \
411 trace_buffer[idx].info = _op | (_info); \
412 trace_buffer[idx].ptr = _ptr; \
414 if (idx >= JIT_G(max_trace_length) - 2) { \
415 stop = ZEND_JIT_TRACE_STOP_TOO_LONG; \
419#define TRACE_RECORD_VM(_op, _ptr, _op1_type, _op2_type, _op3_type) \
420 trace_buffer[idx].op = _op; \
421 trace_buffer[idx].op1_type = _op1_type; \
422 trace_buffer[idx].op2_type = _op2_type; \
423 trace_buffer[idx].op3_type = _op3_type; \
424 trace_buffer[idx].ptr = _ptr; \
426 if (idx >= JIT_G(max_trace_length) - 2) { \
427 stop = ZEND_JIT_TRACE_STOP_TOO_LONG; \
431#define TRACE_START(_op, _start, _ptr1, _ptr2) \
432 trace_buffer[0].op = _op; \
433 trace_buffer[0].start = _start; \
434 trace_buffer[0].level = 0; \
435 trace_buffer[0].ptr = _ptr1; \
436 trace_buffer[1].last = 0; \
437 trace_buffer[1].ptr = _ptr2; \
438 idx = ZEND_JIT_TRACE_START_REC_SIZE;
440#define TRACE_END(_op, _stop, _ptr) \
441 trace_buffer[1].last = idx; \
442 trace_buffer[idx].op = _op; \
443 trace_buffer[idx].start = trace_buffer[idx].start; \
444 trace_buffer[idx].stop = trace_buffer[0].stop = _stop; \
445 trace_buffer[idx].level = trace_buffer[0].level = ret_level ? ret_level + 1 : 0; \
446 trace_buffer[idx].ptr = _ptr;
448static int zend_jit_trace_recursive_call_count(
const zend_op_array *op_array,
const zend_op_array **unrolled_calls,
int ret_level,
int level)
453 for (i = ret_level; i < level; i++) {
454 count += (unrolled_calls[i] == op_array);
459static int zend_jit_trace_recursive_ret_count(
const zend_op_array *op_array,
const zend_op_array **unrolled_calls,
int ret_level)
464 for (i = 0; i < ret_level; i++) {
465 count += (unrolled_calls[i] == op_array);
473 if (&
ex->func->op_array == orig_op_array &&
ex->opline + 1 == orig_opline) {
476 ex =
ex->prev_execute_data;
482static uint8_t zend_jit_trace_bad_stop_event(
const zend_op *opline,
int count)
484 const zend_op **cache_opline =
JIT_G(bad_root_cache_opline);
485 uint8_t *cache_count =
JIT_G(bad_root_cache_count);
486 uint8_t *cache_stop =
JIT_G(bad_root_cache_stop);
493 if (cache_opline[i] == opline) {
494 if (cache_count[i] >=
count) {
495 return cache_stop[i];
503#define ZEND_CALL_MEGAMORPHIC ZEND_CALL_JIT_RESERVED
513 if (
call->prev_execute_data) {
514 idx = zend_jit_trace_record_fake_init_call_ex(
call->prev_execute_data, trace_buffer, idx, is_megamorphic, init_level + 1);
526 if (
func->common.prop_info) {
549 ||
func->common.scope)) {
560 return zend_jit_trace_record_fake_init_call_ex(
call, trace_buffer, idx, is_megamorphic, 0);
607 uint32_t is_megamorphic,
611#ifdef HAVE_GCC_GLOBAL_REGS
613 const zend_op *save_opline = opline;
615 const zend_op *orig_opline, *end_opline;
625 uint8_t trace_flags, op1_type, op2_type, op3_type;
628 int backtrack_link_to_enter = -1;
629 int backtrack_recursion = -1;
630 int backtrack_ret_recursion = -1;
631 int backtrack_ret_recursion_level = 0;
632 int loop_unroll_limit = 0;
634 int last_loop_level = -1;
637#ifdef HAVE_GCC_GLOBAL_REGS
641 opline =
EX(opline) = op;
649 orig_opline = opline;
651 op_array = &
EX(
func)->op_array;
665#ifdef HAVE_GCC_GLOBAL_REGS
667 opline = save_opline;
669 return ZEND_JIT_TRACE_STOP_EXCEPTION;
675#ifdef HAVE_GCC_GLOBAL_REGS
677 opline = save_opline;
679 return ZEND_JIT_TRACE_STOP_NOT_SUPPORTED;
683 int ret = zend_jit_trace_record_fake_init_call(prev_call, trace_buffer, idx, is_megamorphic);
686#ifdef HAVE_GCC_GLOBAL_REGS
688 opline = save_opline;
690 return ZEND_JIT_TRACE_STOP_BAD_FUNC;
866 uintptr_t prop_offset = (uintptr_t)
CACHED_PTR_EX(cache_slot + 1);
923 stop = ZEND_JIT_TRACE_STOP_INTERPRETER;
928 stop = ZEND_JIT_TRACE_STOP_BAD_FUNC;
936 stop = ZEND_JIT_TRACE_STOP_INTERPRETER;
941#ifdef HAVE_GCC_GLOBAL_REGS
944 stop = ZEND_JIT_TRACE_STOP_RETURN;
954 stop = ZEND_JIT_TRACE_STOP_RETURN;
966 op_array = &
EX(
func)->op_array;
971#ifdef HAVE_GCC_GLOBAL_REGS
976 stop = ZEND_JIT_TRACE_STOP_RETURN;
978 stop = ZEND_JIT_TRACE_STOP_INTERPRETER;
988#ifdef HAVE_GCC_GLOBAL_REGS
993 }
else if (rc == 1) {
998 stop = ZEND_JIT_TRACE_STOP_TOO_DEEP;
1004 stop = ZEND_JIT_TRACE_STOP_TRAMPOLINE;
1010 stop = ZEND_JIT_TRACE_STOP_PROP_HOOK_CALL;
1018 count = zend_jit_trace_recursive_call_count(&
EX(
func)->op_array, unrolled_calls, ret_level, level);
1020 if (opline == orig_opline) {
1021 if (
count + 1 >=
JIT_G(max_recursive_calls)) {
1022 stop = ZEND_JIT_TRACE_STOP_RECURSIVE_CALL;
1025 backtrack_recursion = idx;
1026 }
else if (
count >=
JIT_G(max_recursive_calls)) {
1027 stop = ZEND_JIT_TRACE_STOP_DEEP_RECURSION;
1031 unrolled_calls[ret_level + level] = &
EX(
func)->op_array;
1038 &&
JIT_G(max_recursive_returns) > 0
1042 && zend_jit_trace_has_recursive_ret(
execute_data, trace_buffer[0].op_array, orig_opline, ret_level)) {
1044 stop = ZEND_JIT_TRACE_STOP_TOO_DEEP_RET;
1048 count = zend_jit_trace_recursive_ret_count(&
EX(
func)->op_array, unrolled_calls, ret_level);
1049 if (opline == orig_opline) {
1050 if (
count + 1 >=
JIT_G(max_recursive_returns)) {
1051 stop = ZEND_JIT_TRACE_STOP_RECURSIVE_RET;
1054 backtrack_ret_recursion = idx;
1055 backtrack_ret_recursion_level = ret_level;
1056 }
else if (
count >=
JIT_G(max_recursive_returns)) {
1057 stop = ZEND_JIT_TRACE_STOP_DEEP_RECURSION;
1061 unrolled_calls[ret_level] = &
EX(
func)->op_array;
1063 last_loop_opline =
NULL;
1066 int ret = zend_jit_trace_record_fake_init_call(prev_call, trace_buffer, idx, 0);
1068 stop = ZEND_JIT_TRACE_STOP_BAD_FUNC;
1074 && zend_jit_trace_bad_stop_event(orig_opline,
JIT_G(blacklist_root_trace) - 1) !=
1075 ZEND_JIT_TRACE_STOP_LOOP_EXIT) {
1078 stop = ZEND_JIT_TRACE_STOP_LOOP_EXIT;
1083 && zend_jit_trace_bad_stop_event(orig_opline,
JIT_G(blacklist_root_trace) - 1) !=
1084 ZEND_JIT_TRACE_STOP_RECURSION_EXIT) {
1085 stop = ZEND_JIT_TRACE_STOP_RECURSION_EXIT;
1088 && ret_level < ret_depth) {
1091 last_loop_opline =
NULL;
1094 int ret = zend_jit_trace_record_fake_init_call(prev_call, trace_buffer, idx, 0);
1096 stop = ZEND_JIT_TRACE_STOP_BAD_FUNC;
1102 stop = ZEND_JIT_TRACE_STOP_RETURN;
1107 if (level < last_loop_level) {
1108 last_loop_opline =
NULL;
1113#ifdef HAVE_GCC_GLOBAL_REGS
1117 if (
EX(
call) != prev_call) {
1125 stop = ZEND_JIT_TRACE_STOP_TRAMPOLINE;
1129 stop = ZEND_JIT_TRACE_STOP_BAD_FUNC;
1131 }
else if (
EX(
call)->
func->common.prop_info) {
1133 stop = ZEND_JIT_TRACE_STOP_PROP_HOOK_CALL;
1139 stop = ZEND_JIT_TRACE_STOP_BAD_FUNC;
1148 stop = ZEND_JIT_TRACE_STOP_INTERPRETER;
1156#ifndef HAVE_GCC_GLOBAL_REGS
1157 opline =
EX(opline);
1160 if (
JIT_G(max_polymorphic_calls) == 0
1161 && zend_jit_may_be_polymorphic_call(opline - 1)) {
1165 && trace_buffer[1].opline == opline - 1) {
1176#ifndef HAVE_GCC_GLOBAL_REGS
1177 opline =
EX(opline);
1182 stop = ZEND_JIT_TRACE_STOP_EXCEPTION;
1191 && level + ret_level == 0
1192 && zend_jit_trace_bad_stop_event(orig_opline,
JIT_G(blacklist_root_trace) - 1) !=
1193 ZEND_JIT_TRACE_STOP_COMPILED_LOOP) {
1196 stop = ZEND_JIT_TRACE_STOP_COMPILED_LOOP;
1199 stop = ZEND_JIT_TRACE_STOP_LINK;
1205 stop = ZEND_JIT_TRACE_STOP_LINK;
1208 if (backtrack_link_to_enter < 0) {
1209 backtrack_link_to_enter = idx;
1210 link_to_enter_opline = opline;
1213 stop = ZEND_JIT_TRACE_STOP_LINK;
1217 stop = ZEND_JIT_TRACE_STOP_BLACK_LIST;
1223 if (opline == orig_opline && level + ret_level == 0) {
1224 stop = ZEND_JIT_TRACE_STOP_LOOP;
1230 || level + ret_level != 0) {
1233 bad_stop = zend_jit_trace_bad_stop_event(opline,
1234 JIT_G(blacklist_root_trace) / 2);
1235 if (bad_stop != ZEND_JIT_TRACE_STOP_INNER_LOOP
1236 && bad_stop != ZEND_JIT_TRACE_STOP_LOOP_EXIT) {
1238 || zend_jit_trace_bad_stop_event(orig_opline,
1239 JIT_G(blacklist_root_trace) / 2) != ZEND_JIT_TRACE_STOP_INNER_LOOP) {
1240 stop = ZEND_JIT_TRACE_STOP_INNER_LOOP;
1246 if (opline == last_loop_opline
1247 && level == last_loop_level) {
1248 idx = zend_jit_trace_subtrace(trace_buffer,
1251 stop = ZEND_JIT_TRACE_STOP_LOOP;
1254 }
else if (loop_unroll_limit <
JIT_G(max_loop_unrolls)) {
1256 last_loop_opline = opline;
1257 last_loop_level = level;
1258 loop_unroll_limit++;
1260 stop = ZEND_JIT_TRACE_STOP_LOOP_UNROLL;
1265 stop = ZEND_JIT_TRACE_STOP_NOT_SUPPORTED;
1271 end_opline = opline;
1273 if (backtrack_recursion > 0) {
1274 idx = backtrack_recursion;
1275 stop = ZEND_JIT_TRACE_STOP_RECURSIVE_CALL;
1276 end_opline = orig_opline;
1277 }
else if (backtrack_ret_recursion > 0) {
1278 idx = backtrack_ret_recursion;
1279 ret_level = backtrack_ret_recursion_level;
1280 stop = ZEND_JIT_TRACE_STOP_RECURSIVE_RET;
1281 end_opline = orig_opline;
1282 }
else if (backtrack_link_to_enter > 0) {
1283 if (stop == ZEND_JIT_TRACE_STOP_DEEP_RECURSION
1284 && zend_jit_trace_bad_stop_event(orig_opline,
JIT_G(blacklist_root_trace) / 2) ==
1285 ZEND_JIT_TRACE_STOP_DEEP_RECURSION) {
1286 idx = backtrack_link_to_enter;
1287 stop = ZEND_JIT_TRACE_STOP_LINK;
1288 end_opline = link_to_enter_opline;
1293 if (stop == ZEND_JIT_TRACE_STOP_LINK) {
1303#ifdef HAVE_GCC_GLOBAL_REGS
1305 EX(opline) = opline;
1309#ifdef HAVE_GCC_GLOBAL_REGS
1311 opline = save_opline;
count(Countable|array $value, int $mode=COUNT_NORMAL)
unsigned const char * end
unsigned char key[REFLECTION_KEY_LEN]
const void * orig_handler
const void * orig_handlers[1]
const zend_op_array * op_array
const zend_property_info * prop_info
zend_string * function_name
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format,...)
ZEND_API ZEND_COLD void zend_error(int type, const char *format,...)
#define RETURN_VALUE_USED(opline)
#define ZEND_CLOSURE_OBJECT(op_array)
#define ZEND_CALL_CLOSURE
#define ZEND_ACC_FAKE_CLOSURE
#define ZEND_ACC_HAS_TYPE_HINTS
#define ZEND_INTERNAL_FUNCTION
#define ZEND_USER_FUNCTION
#define ZEND_CALL_HAS_SYMBOL_TABLE
#define ZEND_ACC_CALL_VIA_TRAMPOLINE
struct _zend_op_array zend_op_array
#define OBJ_PROP(obj, offset)
struct _zend_property_info zend_property_info
#define ZEND_CALL_HAS_EXTRA_NAMED_PARAMS
#define RT_CONSTANT(opline, node)
#define ZEND_CALL_INFO(call)
#define ZEND_CALL_DYNAMIC
#define ZEND_ADD_CALL_FLAG(call, flag)
#define ZEND_CALL_FREE_EXTRA_ARGS
#define ZEND_CALL_RELEASE_THIS
#define IS_CONSTANT_UNQUALIFIED_IN_NAMESPACE
#define ZEND_ACC_NEVER_CACHE
#define ZEND_CONSTANT_FLAGS(c)
struct _zend_constant zend_constant
ZEND_API ZEND_COLD void zend_throw_exception_internal(zend_object *exception)
ZEND_API void ZEND_FASTCALL zend_free_extra_named_params(zend_array *extra_named_params)
ZEND_API void zend_clean_and_cache_symbol_table(zend_array *symbol_table)
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_deprecated_function(const zend_function *fbc)
#define CACHED_PTR_EX(slot)
#define CACHE_PTR_EX(slot, ptr)
#define ENCODE_SPECIAL_CACHE_NUM(num)
#define CACHE_PTR(num, ptr)
union _zend_function zend_function
#define ZEND_FUNC_JIT_ON_HOT_TRACE
#define ZEND_FUNC_INFO(op_array)
ZEND_API zval *ZEND_FASTCALL zend_hash_find_known_hash(const HashTable *ht, const zend_string *key)
ZEND_API zval *ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulong h)
#define ZEND_HANDLE_NUMERIC(key, idx)
struct _zend_jit_trace_rec zend_jit_trace_rec
#define ZEND_JIT_TRACE_MAX_CALL_DEPTH
#define ZEND_JIT_COUNTER_INIT
#define ZEND_JIT_TRACE_BAD_ROOT_SLOTS
#define ZEND_JIT_TRACE_MAX_RET_DEPTH
void ZEND_FASTCALL zend_jit_hot_func(zend_execute_data *execute_data, const zend_op *opline)
#define ZEND_JIT_EXIT_CLOSURE_CALL
#define ZEND_OPCODE_RETURN()
#define ZEND_JIT_EXIT_METHOD_CALL
zend_ulong zend_jit_profile_counter
#define ZEND_JIT_TRACE_JITED
#define IS_TRACE_REFERENCE
#define ZEND_OPCODE_TAIL_CALL_EX(handler, arg)
#define ZEND_OPCODE_TAIL_CALL(handler)
#define ZEND_JIT_TRACE_STOP_OK(ret)
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_leave_top_func_helper(uint32_t call_info EXECUTE_DATA_DC)
@ ZEND_JIT_TRACE_VAL_INFO
@ ZEND_JIT_TRACE_OP2_TYPE
@ ZEND_JIT_TRACE_OP1_TYPE
@ ZEND_JIT_TRACE_DO_ICALL
@ ZEND_JIT_TRACE_INIT_CALL
#define ZEND_JIT_TRACE_RETURN_VALUE_USED
int zend_jit_profile_counter_rid
#define ZEND_JIT_TRACE_START_SIDE
#define ZEND_JIT_TRACE_FAKE_INFO(level)
struct _zend_jit_op_array_trace_extension zend_jit_op_array_trace_extension
#define IS_TRACE_INDIRECT
const zend_op * zend_jit_halt_op
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_leave_nested_func_helper(uint32_t call_info EXECUTE_DATA_DC)
#define ZEND_JIT_TRACE_BLACKLISTED
ZEND_OPCODE_HANDLER_RET(ZEND_FASTCALL * zend_vm_opcode_handler_t)(ZEND_OPCODE_HANDLER_ARGS)
#define ZEND_JIT_TRACE_START_ENTER
#define ZEND_JIT_TRACE_UNSUPPORTED
#define ZEND_JIT_TRACE_START_LOOP
#define ZEND_OP_TRACE_INFO(opline, offset)
#define IS_TRACE_TYPE_MASK
struct _zend_jit_op_array_hot_extension zend_jit_op_array_hot_extension
#define ZEND_JIT_TRACE_START_RETURN
#define ZEND_JIT_EXIT_POLYMORPHISM
#define ZEND_JIT_TRACE_FAKE_INIT_CALL
enum _zend_jit_trace_stop zend_jit_trace_stop
struct _zend_jit_op_array_extension zend_jit_op_array_extension
int ZEND_FASTCALL zend_jit_trace_hot_root(zend_execute_data *execute_data, const zend_op *opline)
#define TRACE_RECORD(_op, _info, _ptr)
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_profile_helper(ZEND_OPCODE_HANDLER_ARGS)
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_leave_func_helper(EXECUTE_DATA_D)
void ZEND_FASTCALL zend_jit_undefined_string_key(EXECUTE_DATA_D)
zend_constant *ZEND_FASTCALL zend_jit_get_constant(const zval *key, uint32_t flags)
#define TRACE_RECORD_VM(_op, _ptr, _op1_type, _op2_type, _op3_type)
void ZEND_FASTCALL zend_jit_undefined_long_key(EXECUTE_DATA_D)
void ZEND_FASTCALL zend_jit_undefined_long_key_ex(zend_long key EXECUTE_DATA_DC)
bool ZEND_FASTCALL zend_jit_deprecated_helper(OPLINE_D)
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_leave_top_func_helper(uint32_t call_info EXECUTE_DATA_DC)
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_func_counter_helper(ZEND_OPCODE_HANDLER_ARGS)
zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex, const zend_op *op, zend_jit_trace_rec *trace_buffer, uint8_t start, uint32_t is_megamorphic, int ret_depth)
#define TRACE_START(_op, _start, _ptr1, _ptr2)
void ZEND_FASTCALL zend_jit_copy_extra_args_helper(EXECUTE_DATA_D)
void ZEND_FASTCALL zend_jit_copy_extra_args_helper_no_skip_recv(EXECUTE_DATA_D)
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_leave_nested_func_helper(uint32_t call_info EXECUTE_DATA_DC)
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_ret_trace_helper(ZEND_OPCODE_HANDLER_ARGS)
#define TRACE_END(_op, _stop, _ptr)
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_loop_trace_helper(ZEND_OPCODE_HANDLER_ARGS)
#define ZEND_CALL_MEGAMORPHIC
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_loop_counter_helper(ZEND_OPCODE_HANDLER_ARGS)
ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_func_trace_helper(ZEND_OPCODE_HANDLER_ARGS)
zend_constant *ZEND_FASTCALL zend_jit_check_constant(const zval *key)
struct _zend_string zend_string
ZEND_API const zend_object_handlers std_object_handlers
ZEND_API zend_property_info * zend_get_property_info(const zend_class_entry *ce, zend_string *member, int silent)
#define ZEND_PROPERTY_HOOK_SIMPLE_GET_BIT
#define ZEND_WRONG_PROPERTY_INFO
#define IS_HOOKED_PROPERTY_OFFSET(offset)
#define ZEND_ATTRIBUTE_UNUSED
#define EXPECTED(condition)
#define zend_always_inline
#define UNEXPECTED(condition)
struct _zend_class_entry zend_class_entry
#define Z_REFVAL_P(zval_p)
#define Z_STRVAL_P(zval_p)
#define Z_ARRVAL_P(zval_p)
#define Z_REFCOUNTED_P(zval_p)
#define Z_TYPE_INFO_P(zval_p)
#define IS_TYPE_REFCOUNTED
#define Z_OBJCE_P(zval_p)
#define Z_INDIRECT_P(zval_p)
#define Z_TYPE_FLAGS_SHIFT
struct _zend_execute_data zend_execute_data
#define ZVAL_COPY_VALUE(z, v)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)
zend_property_info * prop_info
fbc internal_function handler(call, ret)
#define ZEND_OPCODE_HANDLER_RET
#define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU
#define ZEND_OPCODE_HANDLER_ARGS
#define ZEND_OPCODE_HANDLER_ARGS_DC
ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(uint8_t opcode)
#define ZEND_FETCH_STATIC_PROP_IS
#define ZEND_ASSIGN_DIM_OP
#define ZEND_ASSIGN_STATIC_PROP_REF
#define ZEND_UNSET_STATIC_PROP
#define ZEND_FETCH_LIST_R
#define ZEND_INCLUDE_OR_EVAL
#define ZEND_FETCH_LIST_W
#define ZEND_CALLABLE_CONVERT
#define ZEND_VM_OP1_FLAGS(flags)
#define ZEND_FETCH_OBJ_FUNC_ARG
#define ZEND_FETCH_STATIC_PROP_R
#define ZEND_PRE_DEC_STATIC_PROP
#define ZEND_ASSIGN_STATIC_PROP_OP
#define ZEND_FETCH_DIM_FUNC_ARG
#define ZEND_POST_INC_STATIC_PROP
#define ZEND_HANDLE_EXCEPTION
#define ZEND_FETCH_STATIC_PROP_UNSET
#define ZEND_FETCH_OBJ_IS
#define ZEND_FETCH_OBJ_UNSET
#define ZEND_POST_DEC_OBJ
#define ZEND_ISSET_ISEMPTY_PROP_OBJ
#define ZEND_FETCH_STATIC_PROP_FUNC_ARG
#define ZEND_ISSET_ISEMPTY_STATIC_PROP
#define ZEND_ASSIGN_STATIC_PROP
#define ZEND_POST_DEC_STATIC_PROP
#define ZEND_PRE_INC_STATIC_PROP
#define ZEND_ISSET_ISEMPTY_DIM_OBJ
#define ZEND_FETCH_STATIC_PROP_W
#define ZEND_ASSIGN_OBJ_OP
#define ZEND_ASSIGN_OBJ_REF
#define ZEND_FETCH_STATIC_PROP_RW
#define ZEND_FETCH_CLASS_CONSTANT
#define ZEND_FETCH_DIM_IS
#define ZEND_FETCH_OBJ_RW
#define ZEND_FETCH_DIM_UNSET
#define ZEND_POST_INC_OBJ
#define ZEND_DO_FCALL_BY_NAME
#define ZEND_INIT_STATIC_METHOD_CALL
#define ZEND_FETCH_DIM_RW