162 zend_hash_release(
function->common.attributes);
182 zval *
p = static_members;
198 efree(static_members);
265 zval_ptr_dtor_nogc(&c->
value);
277 zval_ptr_dtor_nogc(
p);
314 zval_ptr_dtor_nogc(&c->
value);
323 zval_ptr_dtor_nogc(
p);
365 _destroy_zend_class_traits_info(ce);
397 zend_hash_release(
prop_info->attributes);
416 zval_ptr_dtor_nogc(&c->
value);
468 zend_hash_release(
prop_info->attributes);
574 if (op_array->
vars) {
586 while (literal <
end) {
587 zval_ptr_dtor_nogc(literal);
627 if (arg_info[i].
name) {
652static void zend_update_extended_stmts(
zend_op_array *op_array)
665 opline->
lineno = (opline+1)->lineno;
682static void zend_check_finally_breakout(
zend_op_array *op_array, uint32_t op_num, uint32_t dst_num)
687 if ((op_num < op_array->try_catch_array[i].finally_op ||
690 dst_num <= op_array->try_catch_array[i].finally_end)) {
691 CG(in_compilation) = 1;
692 CG(active_op_array) = op_array;
696 && op_num <= op_array->try_catch_array[i].finally_end)
698 || dst_num < op_array->try_catch_array[i].finally_op)) {
699 CG(in_compilation) = 1;
700 CG(active_op_array) = op_array;
708 int nest_levels = opline->
op2.
num;
709 int array_offset = opline->
op1.
num;
712 jmp_to = &
CG(
context).brk_cont_array[array_offset];
713 if (nest_levels > 1) {
714 array_offset = jmp_to->
parent;
716 }
while (--nest_levels > 0);
721static void emit_live_range_raw(
733 range->start =
start;
737static void emit_live_range(
744 switch (def_opline->
opcode) {
784 uint32_t orig_start =
start;
786 while (def_opline + 1 < use_opline) {
789 switch (def_opline->
opcode) {
826 if (needs_live_range && !needs_live_range(op_array, orig_def_opline)) {
836 if (needs_live_range && !needs_live_range(op_array, orig_def_opline)) {
848 zend_op *block_start_op = use_opline;
849 while ((block_start_op-1)->opcode ==
ZEND_FREE) {
855 emit_live_range_raw(op_array, var_num,
kind,
start,
end);
865 emit_live_range_raw(op_array, var_num,
kind,
start,
end);
875 emit_live_range_raw(op_array, var_num,
kind,
start,
end);
880 emit_live_range_raw(op_array, var_num,
kind,
start,
end);
883static bool is_fake_def(
zend_op *opline) {
890static bool keeps_op1_alive(
zend_op *opline) {
914 return a->start - b->
start;
929static void zend_calc_live_ranges(
931 uint32_t opnum = op_array->
last;
934 uint32_t var_offset = op_array->
last_var;
935 uint32_t *last_use =
do_alloca(
sizeof(uint32_t) * op_array->
T, use_heap);
936 memset(last_use, -1,
sizeof(uint32_t) * op_array->
T);
958 if (
EXPECTED(last_use[var_num] != (uint32_t) -1)) {
960 if (opnum + 1 != last_use[var_num]) {
971 emit_live_range(op_array, var_num, num, last_use[var_num], needs_live_range);
973 last_use[var_num] = (uint32_t) -1;
979 if (
EXPECTED(last_use[var_num] == (uint32_t) -1)) {
980 if (
EXPECTED(!keeps_op1_alive(opline))) {
991 if (last_use[var_num] != (uint32_t) -1) {
992 if (opnum + 1 != last_use[var_num]) {
994 op_array, var_num, opnum, last_use[var_num], needs_live_range);
996 last_use[var_num] = (uint32_t) -1;
998 }
else if (
EXPECTED(last_use[var_num] == (uint32_t) -1)) {
1002 last_use[var_num] = opnum;
1017 swap_live_range(r1, r2);
1025 if (r1->start > (r1+1)->start) {
1044 zend_calc_live_ranges(op_array, needs_live_range);
1055 zend_update_extended_stmts(op_array);
1068#if ZEND_USE_ABS_CONST_ADDR
1098 end = opline + op_array->
last;
1099 while (opline <
end) {
1100 switch (opline->
opcode) {
1118 uint32_t jmp_target = zend_get_brk_cont_target(op_array, opline);
1121 zend_check_finally_breakout(op_array, opline - op_array->
opcodes, jmp_target);
1212 zend_calc_live_ranges(op_array,
NULL);
memset(ptr, 0, type->size)
unsigned const char * end
zend_string * doc_comment
HashTable constants_table
zend_class_iterator_funcs * iterator_funcs_ptr
zval * default_static_members_table
HashTable * backed_enum_table
struct _zend_class_entry::@126215362204241324314155352336150042254204116267::@166057154351252324007362117353350250255142166322 user
HashTable properties_info
zend_trait_precedence ** trait_precedences
zend_class_name * trait_names
zend_class_name * interface_names
union _zend_class_entry::@126215362204241324314155352336150042254204116267 info
zend_class_arrayaccess_funcs * arrayaccess_funcs_ptr
zend_string * parent_name
int default_properties_count
zend_trait_alias ** trait_aliases
zend_class_entry ** interfaces
int default_static_members_count
struct _zend_property_info ** properties_info_table
zend_string * doc_comment
zval * default_properties_table
zval * default_properties_table
HashTable * backed_enum_table
HashTable * constants_table
op_array_dtor_func_t op_array_dtor
op_array_ctor_func_t op_array_ctor
op_array_handler_func_t op_array_handler
zend_function * prototype
HashTable * static_variables
zend_op_array ** dynamic_func_defs
const zend_property_info * prop_info
zend_string * doc_comment
uint32_t required_num_args
zend_try_catch_element * try_catch_array
zend_live_range * live_range
void * reserved[ZEND_MAX_RESERVED_RESOURCES]
zend_string * function_name
uint32_t num_dynamic_func_defs
zend_trait_method_reference trait_method
zend_string * method_name
zend_trait_method_reference trait_method
zend_string * exclude_class_names[1]
struct _zend_function::@236135173067030250234125302313220025134003177336 common
zend_internal_function internal_function
ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char *format,...)
struct _zend_class_mutable_data zend_class_mutable_data
#define CE_STATIC_MEMBERS(ce)
#define efree_size(ptr, size)
#define ZEND_MM_ALIGNED_SIZE_EX(size, alignment)
#define pefree(ptr, persistent)
#define erealloc(ptr, size)
@ ZEND_AST_CONST_ENUM_INIT
zend_string_release_ex(func->internal_function.function_name, 0)
void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline)
ZEND_API zend_string * zend_get_compiled_filename(void)
#define ZEND_PROPERTY_HOOK_COUNT
zend_result(ZEND_FASTCALL * binary_op_type)(zval *, zval *, zval *)
struct _zend_brk_cont_element zend_brk_cont_element
#define ZEND_USER_CODE(type)
#define CT_CONSTANT(node)
#define ZEND_ACC_IMMUTABLE
#define ZEND_ACC_HAS_TYPE_HINTS
#define ZEND_COMPILE_EXTENDED_STMT
#define ZEND_INTERNAL_FUNCTION
#define ZEND_ACC_DONE_PASS_TWO
bool(* zend_needs_live_range_cb)(zend_op_array *op_array, zend_op *opline)
#define ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline, node)
#define ZEND_USER_FUNCTION
#define ZEND_ACC_GENERATOR
struct _zend_op_array zend_op_array
struct _zend_class_constant zend_class_constant
struct _zend_property_info zend_property_info
#define ZEND_ACC_RESOLVED_PARENT
struct _zend_internal_arg_info zend_internal_arg_info
#define ZEND_ACC_HAS_RETURN_TYPE
struct _zend_arg_info zend_arg_info
#define ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, node)
#define ZEND_ACC_HEAP_RT_CACHE
#define ZEND_ACC_FILE_CACHED
#define ZEND_ACC_RESOLVED_INTERFACES
#define ZEND_ACC_ARENA_ALLOCATED
#define ZEND_USE_ABS_CONST_ADDR
#define ZEND_ACC_VARIADIC
#define ZEND_LIVE_SILENCE
#define ZEND_ACC_HAS_FINALLY_BLOCK
struct _zend_live_range zend_live_range
#define ZEND_INTERNAL_CLASS
struct _zend_internal_function zend_internal_function
zend_result(ZEND_FASTCALL * unary_op_type)(zval *, zval *)
#define ZEND_COMPILE_HANDLE_OP_ARRAY
#define ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, opline_num)
#define ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop)
#define ZEND_REF_DEL_TYPE_SOURCE(ref, source)
#define ZEND_REF_FOREACH_TYPE_SOURCES_END()
ZEND_API uint32_t zend_extension_flags
ZEND_API zend_llist zend_extensions
ZEND_API int zend_op_array_extension_handles
#define ZEND_EXTENSIONS_HAVE_OP_ARRAY_CTOR
#define ZEND_EXTENSIONS_HAVE_OP_ARRAY_HANDLER
#define ZEND_EXTENSIONS_HAVE_OP_ARRAY_DTOR
struct _zend_extension zend_extension
union _zend_function zend_function
ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht)
ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht)
#define ZEND_HASH_MAP_FOREACH_PTR(ht, _ptr)
#define ZEND_HASH_FOREACH_END()
#define ZEND_HASH_FOREACH_VAL(ht, _val)
ZEND_API void zend_llist_apply_with_argument(zend_llist *l, llist_apply_with_arg_func_t func, void *arg)
void(* llist_apply_with_arg_func_t)(void *data, void *arg)
struct _zend_string zend_string
#define ZEND_MAP_PTR_INIT(ptr, val)
#define ZEND_MAP_PTR_GET(ptr)
#define ZEND_MAP_PTR_GET_IMM(ptr)
#define ZEND_MAP_PTR_SET_IMM(ptr, val)
#define ZEND_MAP_PTR(ptr)
#define ZEND_MAP_PTR_SET(ptr, val)
#define ZEND_OBSERVER_ENABLED
ZEND_API void destroy_op_array(zend_op_array *op_array)
ZEND_API void zend_function_dtor(zval *zv)
ZEND_API void pass_two(zend_op_array *op_array)
ZEND_API void destroy_zend_function(zend_function *function)
void init_op_array(zend_op_array *op_array, uint8_t type, int initial_ops_size)
ZEND_API binary_op_type get_binary_op(int opcode)
ZEND_API void destroy_zend_class(zval *zv)
ZEND_API unary_op_type get_unary_op(int opcode)
ZEND_API void zend_destroy_static_vars(zend_op_array *op_array)
ZEND_API void zend_type_release(zend_type type, bool persistent)
void zend_class_add_ref(zval *zv)
void zend_free_internal_arg_info(zend_internal_function *function)
ZEND_API void zend_cleanup_mutable_class_data(zend_class_entry *ce)
ZEND_API void zend_cleanup_internal_class_data(zend_class_entry *ce)
ZEND_API void zend_recalc_live_ranges(zend_op_array *op_array, zend_needs_live_range_cb needs_live_range)
ZEND_API zend_result ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL boolean_not_function(zval *result, zval *op1)
ZEND_API zend_result ZEND_FASTCALL is_not_identical_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL shift_right_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL boolean_xor_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL bitwise_not_function(zval *result, zval *op1)
ZEND_API zend_result ZEND_FASTCALL mod_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL mul_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL div_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL shift_left_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL is_equal_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL is_not_equal_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL bitwise_xor_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL bitwise_and_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL bitwise_or_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL add_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL sub_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL is_smaller_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL is_identical_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_result ZEND_FASTCALL is_smaller_or_equal_function(zval *result, zval *op1, zval *op2)
#define ALLOCA_FLAG(name)
#define EXPECTED(condition)
#define do_alloca(p, use_heap)
#define ZEND_MAX_RESERVED_RESOURCES
#define ZEND_UNREACHABLE()
#define free_alloca(p, use_heap)
#define UNEXPECTED(condition)
struct _zend_class_entry zend_class_entry
ZEND_API void zend_sort(void *base, size_t nmemb, size_t siz, compare_func_t cmp, swap_func_t swp)
int(* compare_func_t)(const void *, const void *)
#define Z_ISREF_P(zval_p)
#define ZEND_TYPE_NAME(t)
#define Z_CONSTANT_FLAGS(zval)
#define Z_ARRVAL_P(zval_p)
struct _zend_array HashTable
#define ZEND_TYPE_HAS_NAME(t)
#define Z_TYPE_INFO_P(zval_p)
#define ZEND_TYPE_HAS_LIST(t)
#define ZEND_TYPE_LIST_FOREACH_END()
#define ZEND_TYPE_USES_ARENA(t)
void(* swap_func_t)(void *, void *)
#define Z_CACHE_SLOT_P(zval_p)
#define ZEND_TYPE_LIST_FOREACH(list, type_ptr)
#define ZEND_TYPE_LIST(t)
ZEND_API void zval_internal_ptr_dtor(zval *zval_ptr)
#define ZEND_VM_SET_OPCODE_HANDLER(opline)
zend_property_info * prop_info
function(EX_VAR(opline->result.var))
#define ZEND_IS_IDENTICAL
#define ZEND_DECLARE_ANON_CLASS
#define ZEND_EXT_FCALL_END
#define ZEND_VERIFY_RETURN_TYPE
#define ZEND_FETCH_LIST_R
#define ZEND_INIT_USER_CALL
#define ZEND_FETCH_LIST_W
#define ZEND_ASSERT_CHECK
#define ZEND_RETURN_BY_REF
#define ZEND_SWITCH_STRING
#define ZEND_IS_NOT_EQUAL
#define ZEND_IS_NOT_IDENTICAL
#define ZEND_INIT_NS_FCALL_BY_NAME
#define ZEND_ADD_ARRAY_ELEMENT
#define ZEND_IS_SMALLER_OR_EQUAL
#define ZEND_INIT_FCALL_BY_NAME
#define ZEND_BIND_LEXICAL
#define ZEND_BIND_INIT_STATIC_OR_JMP
#define ZEND_GENERATOR_RETURN
#define ZEND_ADD_ARRAY_UNPACK
#define ZEND_BEGIN_SILENCE
#define ZEND_JMP_FRAMELESS
#define ZEND_INIT_DYNAMIC_CALL
#define ZEND_INIT_PARENT_PROPERTY_HOOK_CALL
#define ZEND_DO_FCALL_BY_NAME
#define ZEND_INIT_METHOD_CALL
#define ZEND_INIT_STATIC_METHOD_CALL