Lines Matching refs:op_array

34 static void zend_extension_op_array_ctor_handler(zend_extension *extension, zend_op_array *op_array)  in zend_extension_op_array_ctor_handler()  argument
37 extension->op_array_ctor(op_array); in zend_extension_op_array_ctor_handler()
41 static void zend_extension_op_array_dtor_handler(zend_extension *extension, zend_op_array *op_array) in zend_extension_op_array_dtor_handler() argument
44 extension->op_array_dtor(op_array); in zend_extension_op_array_dtor_handler()
48 void init_op_array(zend_op_array *op_array, uint8_t type, int initial_ops_size) in init_op_array() argument
50 op_array->type = type; in init_op_array()
51 op_array->arg_flags[0] = 0; in init_op_array()
52 op_array->arg_flags[1] = 0; in init_op_array()
53 op_array->arg_flags[2] = 0; in init_op_array()
55 op_array->refcount = (uint32_t *) emalloc(sizeof(uint32_t)); in init_op_array()
56 *op_array->refcount = 1; in init_op_array()
57 op_array->last = 0; in init_op_array()
58 op_array->opcodes = emalloc(initial_ops_size * sizeof(zend_op)); in init_op_array()
60 op_array->last_var = 0; in init_op_array()
61 op_array->vars = NULL; in init_op_array()
63 op_array->T = 0; in init_op_array()
65 op_array->function_name = NULL; in init_op_array()
66 op_array->filename = zend_string_copy(zend_get_compiled_filename()); in init_op_array()
67 op_array->doc_comment = NULL; in init_op_array()
68 op_array->attributes = NULL; in init_op_array()
70 op_array->arg_info = NULL; in init_op_array()
71 op_array->num_args = 0; in init_op_array()
72 op_array->required_num_args = 0; in init_op_array()
74 op_array->scope = NULL; in init_op_array()
75 op_array->prototype = NULL; in init_op_array()
77 op_array->live_range = NULL; in init_op_array()
78 op_array->try_catch_array = NULL; in init_op_array()
79 op_array->last_live_range = 0; in init_op_array()
81 op_array->static_variables = NULL; in init_op_array()
82 ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, NULL); in init_op_array()
83 op_array->last_try_catch = 0; in init_op_array()
85 op_array->fn_flags = 0; in init_op_array()
87 op_array->last_literal = 0; in init_op_array()
88 op_array->literals = NULL; in init_op_array()
90 op_array->num_dynamic_func_defs = 0; in init_op_array()
91 op_array->dynamic_func_defs = NULL; in init_op_array()
93 ZEND_MAP_PTR_INIT(op_array->run_time_cache, NULL); in init_op_array()
94 op_array->cache_size = zend_op_array_extension_handles * sizeof(void*); in init_op_array()
96 memset(op_array->reserved, 0, ZEND_MAX_RESERVED_RESOURCES * sizeof(void*)); in init_op_array()
99 …nt(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_op_array_ctor_handler, op_array); in init_op_array()
149 destroy_op_array(&function->op_array); in zend_function_dtor()
527 ZEND_API void zend_destroy_static_vars(zend_op_array *op_array) in zend_destroy_static_vars() argument
529 if (ZEND_MAP_PTR(op_array->static_variables_ptr)) { in zend_destroy_static_vars()
530 HashTable *ht = ZEND_MAP_PTR_GET(op_array->static_variables_ptr); in zend_destroy_static_vars()
533 ZEND_MAP_PTR_SET(op_array->static_variables_ptr, NULL); in zend_destroy_static_vars()
538 ZEND_API void destroy_op_array(zend_op_array *op_array) in destroy_op_array() argument
542 if ((op_array->fn_flags & ZEND_ACC_HEAP_RT_CACHE) in destroy_op_array()
543 && ZEND_MAP_PTR(op_array->run_time_cache)) { in destroy_op_array()
544 efree(ZEND_MAP_PTR(op_array->run_time_cache)); in destroy_op_array()
547 if (op_array->function_name) { in destroy_op_array()
548 zend_string_release_ex(op_array->function_name, 0); in destroy_op_array()
551 if (!op_array->refcount || --(*op_array->refcount) > 0) { in destroy_op_array()
555 efree_size(op_array->refcount, sizeof(*(op_array->refcount))); in destroy_op_array()
557 if (op_array->vars) { in destroy_op_array()
558 i = op_array->last_var; in destroy_op_array()
561 zend_string_release_ex(op_array->vars[i], 0); in destroy_op_array()
563 efree(op_array->vars); in destroy_op_array()
566 if (op_array->literals) { in destroy_op_array()
567 zval *literal = op_array->literals; in destroy_op_array()
568 zval *end = literal + op_array->last_literal; in destroy_op_array()
574 || !(op_array->fn_flags & ZEND_ACC_DONE_PASS_TWO)) { in destroy_op_array()
575 efree(op_array->literals); in destroy_op_array()
578 efree(op_array->opcodes); in destroy_op_array()
580 zend_string_release_ex(op_array->filename, 0); in destroy_op_array()
581 if (op_array->doc_comment) { in destroy_op_array()
582 zend_string_release_ex(op_array->doc_comment, 0); in destroy_op_array()
584 if (op_array->attributes) { in destroy_op_array()
585 zend_hash_release(op_array->attributes); in destroy_op_array()
587 if (op_array->live_range) { in destroy_op_array()
588 efree(op_array->live_range); in destroy_op_array()
590 if (op_array->try_catch_array) { in destroy_op_array()
591 efree(op_array->try_catch_array); in destroy_op_array()
594 if (op_array->fn_flags & ZEND_ACC_DONE_PASS_TWO) { in destroy_op_array()
595 …nt(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_op_array_dtor_handler, op_array); in destroy_op_array()
598 if (op_array->arg_info) { in destroy_op_array()
599 uint32_t num_args = op_array->num_args; in destroy_op_array()
600 zend_arg_info *arg_info = op_array->arg_info; in destroy_op_array()
602 if (op_array->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) { in destroy_op_array()
606 if (op_array->fn_flags & ZEND_ACC_VARIADIC) { in destroy_op_array()
617 if (op_array->static_variables) { in destroy_op_array()
618 zend_array_destroy(op_array->static_variables); in destroy_op_array()
620 if (op_array->num_dynamic_func_defs) { in destroy_op_array()
621 for (i = 0; i < op_array->num_dynamic_func_defs; i++) { in destroy_op_array()
624 if (op_array->dynamic_func_defs[i]->static_variables in destroy_op_array()
625 && (op_array->dynamic_func_defs[i]->fn_flags & ZEND_ACC_CLOSURE)) { in destroy_op_array()
626 zend_array_destroy(op_array->dynamic_func_defs[i]->static_variables); in destroy_op_array()
627 op_array->dynamic_func_defs[i]->static_variables = NULL; in destroy_op_array()
629 destroy_op_array(op_array->dynamic_func_defs[i]); in destroy_op_array()
631 efree(op_array->dynamic_func_defs); in destroy_op_array()
635 static void zend_update_extended_stmts(zend_op_array *op_array) in zend_update_extended_stmts() argument
637 zend_op *opline = op_array->opcodes, *end=opline+op_array->last; in zend_update_extended_stmts()
658 static void zend_extension_op_array_handler(zend_extension *extension, zend_op_array *op_array) in zend_extension_op_array_handler() argument
661 extension->op_array_handler(op_array); in zend_extension_op_array_handler()
665 static void zend_check_finally_breakout(zend_op_array *op_array, uint32_t op_num, uint32_t dst_num) in zend_check_finally_breakout() argument
669 for (i = 0; i < op_array->last_try_catch; i++) { in zend_check_finally_breakout()
670 if ((op_num < op_array->try_catch_array[i].finally_op || in zend_check_finally_breakout()
671 op_num >= op_array->try_catch_array[i].finally_end) in zend_check_finally_breakout()
672 && (dst_num >= op_array->try_catch_array[i].finally_op && in zend_check_finally_breakout()
673 dst_num <= op_array->try_catch_array[i].finally_end)) { in zend_check_finally_breakout()
675 CG(active_op_array) = op_array; in zend_check_finally_breakout()
676 CG(zend_lineno) = op_array->opcodes[op_num].lineno; in zend_check_finally_breakout()
678 } else if ((op_num >= op_array->try_catch_array[i].finally_op in zend_check_finally_breakout()
679 && op_num <= op_array->try_catch_array[i].finally_end) in zend_check_finally_breakout()
680 && (dst_num > op_array->try_catch_array[i].finally_end in zend_check_finally_breakout()
681 || dst_num < op_array->try_catch_array[i].finally_op)) { in zend_check_finally_breakout()
683 CG(active_op_array) = op_array; in zend_check_finally_breakout()
684 CG(zend_lineno) = op_array->opcodes[op_num].lineno; in zend_check_finally_breakout()
690 static uint32_t zend_get_brk_cont_target(const zend_op_array *op_array, const zend_op *opline) { in zend_get_brk_cont_target() argument
705 zend_op_array *op_array, uint32_t var_num, uint32_t kind, uint32_t start, uint32_t end) { in emit_live_range_raw() argument
708 op_array->last_live_range++; in emit_live_range_raw()
709 op_array->live_range = erealloc(op_array->live_range, in emit_live_range_raw()
710 sizeof(zend_live_range) * op_array->last_live_range); in emit_live_range_raw()
713 range = &op_array->live_range[op_array->last_live_range - 1]; in emit_live_range_raw()
714 range->var = EX_NUM_TO_VAR(op_array->last_var + var_num); in emit_live_range_raw()
721 zend_op_array *op_array, uint32_t var_num, uint32_t start, uint32_t end, in emit_live_range() argument
723 zend_op *def_opline = &op_array->opcodes[start], *orig_def_opline = def_opline; in emit_live_range()
724 zend_op *use_opline = &op_array->opcodes[end]; in emit_live_range()
795 emit_live_range_raw(op_array, var_num, ZEND_LIVE_NEW, orig_start + 1, start + 1); in emit_live_range()
808 if (needs_live_range && !needs_live_range(op_array, orig_def_opline)) { in emit_live_range()
817 uint32_t rt_var_num = EX_NUM_TO_VAR(op_array->last_var + var_num); in emit_live_range()
818 if (needs_live_range && !needs_live_range(op_array, orig_def_opline)) { in emit_live_range()
835 start = block_start_op - op_array->opcodes; in emit_live_range()
837 emit_live_range_raw(op_array, var_num, kind, start, end); in emit_live_range()
846 start = def_opline + 1 - op_array->opcodes; in emit_live_range()
847 emit_live_range_raw(op_array, var_num, kind, start, end); in emit_live_range()
855 start = def_opline + 1 - op_array->opcodes; in emit_live_range()
856 end = use_opline - op_array->opcodes; in emit_live_range()
857 emit_live_range_raw(op_array, var_num, kind, start, end); in emit_live_range()
862 emit_live_range_raw(op_array, var_num, kind, start, end); in emit_live_range()
911 zend_op_array *op_array, zend_needs_live_range_cb needs_live_range) { in zend_calc_live_ranges() argument
912 uint32_t opnum = op_array->last; in zend_calc_live_ranges()
913 zend_op *opline = &op_array->opcodes[opnum]; in zend_calc_live_ranges()
915 uint32_t var_offset = op_array->last_var; in zend_calc_live_ranges()
916 uint32_t *last_use = do_alloca(sizeof(uint32_t) * op_array->T, use_heap); in zend_calc_live_ranges()
917 memset(last_use, -1, sizeof(uint32_t) * op_array->T); in zend_calc_live_ranges()
919 ZEND_ASSERT(!op_array->live_range); in zend_calc_live_ranges()
944 emit_live_range(op_array, var_num, num, last_use[var_num], needs_live_range); in zend_calc_live_ranges()
967 op_array, var_num, opnum, last_use[var_num], needs_live_range); in zend_calc_live_ranges()
984 if (op_array->last_live_range > 1) { in zend_calc_live_ranges()
985 zend_live_range *r1 = op_array->live_range; in zend_calc_live_ranges()
986 zend_live_range *r2 = r1 + op_array->last_live_range - 1; in zend_calc_live_ranges()
995 r1 = op_array->live_range; in zend_calc_live_ranges()
996 r2 = r1 + op_array->last_live_range - 1; in zend_calc_live_ranges()
1011 zend_op_array *op_array, zend_needs_live_range_cb needs_live_range) { in zend_recalc_live_ranges() argument
1013 ZEND_ASSERT(op_array->live_range); in zend_recalc_live_ranges()
1014 efree(op_array->live_range); in zend_recalc_live_ranges()
1015 op_array->live_range = NULL; in zend_recalc_live_ranges()
1016 op_array->last_live_range = 0; in zend_recalc_live_ranges()
1017 zend_calc_live_ranges(op_array, needs_live_range); in zend_recalc_live_ranges()
1020 ZEND_API void pass_two(zend_op_array *op_array) in pass_two() argument
1024 if (!ZEND_USER_CODE(op_array->type)) { in pass_two()
1028 zend_update_extended_stmts(op_array); in pass_two()
1032 …rgument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_op_array_handler, op_array); in pass_two()
1036 if (CG(context).vars_size != op_array->last_var) { in pass_two()
1037op_array->vars = (zend_string**) erealloc(op_array->vars, sizeof(zend_string*)*op_array->last_var); in pass_two()
1038 CG(context).vars_size = op_array->last_var; in pass_two()
1042 if (CG(context).opcodes_size != op_array->last) { in pass_two()
1043 op_array->opcodes = (zend_op *) erealloc(op_array->opcodes, sizeof(zend_op)*op_array->last); in pass_two()
1044 CG(context).opcodes_size = op_array->last; in pass_two()
1046 if (CG(context).literals_size != op_array->last_literal) { in pass_two()
1047 op_array->literals = (zval*)erealloc(op_array->literals, sizeof(zval) * op_array->last_literal); in pass_two()
1048 CG(context).literals_size = op_array->last_literal; in pass_two()
1051 op_array->opcodes = (zend_op *) erealloc(op_array->opcodes, in pass_two()
1052 ZEND_MM_ALIGNED_SIZE_EX(sizeof(zend_op) * op_array->last, 16) + in pass_two()
1053 sizeof(zval) * op_array->last_literal); in pass_two()
1054 if (op_array->literals) { in pass_two()
1055 memcpy(((char*)op_array->opcodes) + ZEND_MM_ALIGNED_SIZE_EX(sizeof(zend_op) * op_array->last, 16), in pass_two()
1056 op_array->literals, sizeof(zval) * op_array->last_literal); in pass_two()
1057 efree(op_array->literals); in pass_two()
1058op_array->literals = (zval*)(((char*)op_array->opcodes) + ZEND_MM_ALIGNED_SIZE_EX(sizeof(zend_op) … in pass_two()
1060 CG(context).opcodes_size = op_array->last; in pass_two()
1061 CG(context).literals_size = op_array->last_literal; in pass_two()
1064 op_array->T += ZEND_OBSERVER_ENABLED; // reserve last temporary for observers if enabled in pass_two()
1068 op_array->fn_flags |= ZEND_ACC_DONE_PASS_TWO; in pass_two()
1070 opline = op_array->opcodes; in pass_two()
1071 end = opline + op_array->last; in pass_two()
1078 uint32_t slot = ZEND_MM_ALIGNED_SIZE_EX(op_array->cache_size, 8); in pass_two()
1080 op_array->cache_size += sizeof(zval); in pass_two()
1085 opline->op1.opline_num = op_array->try_catch_array[opline->op1.num].finally_op; in pass_two()
1086 ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op1); in pass_two()
1091 uint32_t jmp_target = zend_get_brk_cont_target(op_array, opline); in pass_two()
1093 if (op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK) { in pass_two()
1094 zend_check_finally_breakout(op_array, opline - op_array->opcodes, jmp_target); in pass_two()
1099 ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op1); in pass_two()
1103 zend_resolve_goto_label(op_array, opline); in pass_two()
1104 if (op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK) { in pass_two()
1105 zend_check_finally_breakout(op_array, opline - op_array->opcodes, opline->op1.opline_num); in pass_two()
1109 ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op1); in pass_two()
1121 ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op2); in pass_two()
1126 zend_op *call = &op_array->opcodes[opline->op2.opline_num - 1]; in pass_two()
1133 ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op2); in pass_two()
1139 opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, opline->extended_value); in pass_two()
1143 ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op2); in pass_two()
1148 if (op_array->fn_flags & ZEND_ACC_GENERATOR) { in pass_two()
1160 Z_LVAL_P(zv) = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, Z_LVAL_P(zv)); in pass_two()
1163 opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, opline->extended_value); in pass_two()
1168 ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline, opline->op1); in pass_two()
1170 opline->op1.var = EX_NUM_TO_VAR(op_array->last_var + opline->op1.var); in pass_two()
1173 ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline, opline->op2); in pass_two()
1175 opline->op2.var = EX_NUM_TO_VAR(op_array->last_var + opline->op2.var); in pass_two()
1178 opline->result.var = EX_NUM_TO_VAR(op_array->last_var + opline->result.var); in pass_two()
1184 zend_calc_live_ranges(op_array, NULL); in pass_two()