Lines Matching refs:op_array

32 static void zend_extension_op_array_ctor_handler(zend_extension *extension, zend_op_array *op_array)  in zend_extension_op_array_ctor_handler()  argument
35 extension->op_array_ctor(op_array); in zend_extension_op_array_ctor_handler()
39 static void zend_extension_op_array_dtor_handler(zend_extension *extension, zend_op_array *op_array) in zend_extension_op_array_dtor_handler() argument
42 extension->op_array_dtor(op_array); in zend_extension_op_array_dtor_handler()
46 void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_size) in init_op_array() argument
48 op_array->type = type; in init_op_array()
49 op_array->arg_flags[0] = 0; in init_op_array()
50 op_array->arg_flags[1] = 0; in init_op_array()
51 op_array->arg_flags[2] = 0; in init_op_array()
53 op_array->refcount = (uint32_t *) emalloc(sizeof(uint32_t)); in init_op_array()
54 *op_array->refcount = 1; in init_op_array()
55 op_array->last = 0; in init_op_array()
56 op_array->opcodes = emalloc(initial_ops_size * sizeof(zend_op)); in init_op_array()
58 op_array->last_var = 0; in init_op_array()
59 op_array->vars = NULL; in init_op_array()
61 op_array->T = 0; in init_op_array()
63 op_array->function_name = NULL; in init_op_array()
64 op_array->filename = zend_get_compiled_filename(); in init_op_array()
65 op_array->doc_comment = NULL; in init_op_array()
67 op_array->arg_info = NULL; in init_op_array()
68 op_array->num_args = 0; in init_op_array()
69 op_array->required_num_args = 0; in init_op_array()
71 op_array->scope = NULL; in init_op_array()
72 op_array->prototype = NULL; in init_op_array()
74 op_array->live_range = NULL; in init_op_array()
75 op_array->try_catch_array = NULL; in init_op_array()
76 op_array->last_live_range = 0; in init_op_array()
78 op_array->static_variables = NULL; in init_op_array()
79 ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, &op_array->static_variables); in init_op_array()
80 op_array->last_try_catch = 0; in init_op_array()
82 op_array->fn_flags = 0; in init_op_array()
84 op_array->last_literal = 0; in init_op_array()
85 op_array->literals = NULL; in init_op_array()
87 ZEND_MAP_PTR_INIT(op_array->run_time_cache, NULL); in init_op_array()
88 op_array->cache_size = zend_op_array_extension_handles * sizeof(void*); in init_op_array()
90 memset(op_array->reserved, 0, ZEND_MAX_RESERVED_RESOURCES * sizeof(void*)); in init_op_array()
93 …nt(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_op_array_ctor_handler, op_array); in init_op_array()
131 destroy_op_array(&function->op_array); in zend_function_dtor()
250 zend_op_array *op_array; in destroy_zend_class() local
256 ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) { in destroy_zend_class()
257 if (op_array->type == ZEND_USER_FUNCTION) { in destroy_zend_class()
258 destroy_op_array(op_array); in destroy_zend_class()
420 ZEND_API void destroy_op_array(zend_op_array *op_array) in destroy_op_array() argument
424 if (op_array->static_variables) { in destroy_op_array()
425 HashTable *ht = ZEND_MAP_PTR_GET(op_array->static_variables_ptr); in destroy_op_array()
433 if ((op_array->fn_flags & ZEND_ACC_HEAP_RT_CACHE) in destroy_op_array()
434 && ZEND_MAP_PTR(op_array->run_time_cache)) { in destroy_op_array()
435 efree(ZEND_MAP_PTR(op_array->run_time_cache)); in destroy_op_array()
438 if (!op_array->refcount || --(*op_array->refcount) > 0) { in destroy_op_array()
442 efree_size(op_array->refcount, sizeof(*(op_array->refcount))); in destroy_op_array()
444 if (op_array->vars) { in destroy_op_array()
445 i = op_array->last_var; in destroy_op_array()
448 zend_string_release_ex(op_array->vars[i], 0); in destroy_op_array()
450 efree(op_array->vars); in destroy_op_array()
453 if (op_array->literals) { in destroy_op_array()
454 zval *literal = op_array->literals; in destroy_op_array()
455 zval *end = literal + op_array->last_literal; in destroy_op_array()
461 || !(op_array->fn_flags & ZEND_ACC_DONE_PASS_TWO)) { in destroy_op_array()
462 efree(op_array->literals); in destroy_op_array()
465 efree(op_array->opcodes); in destroy_op_array()
467 if (op_array->function_name) { in destroy_op_array()
468 zend_string_release_ex(op_array->function_name, 0); in destroy_op_array()
470 if (op_array->doc_comment) { in destroy_op_array()
471 zend_string_release_ex(op_array->doc_comment, 0); in destroy_op_array()
473 if (op_array->live_range) { in destroy_op_array()
474 efree(op_array->live_range); in destroy_op_array()
476 if (op_array->try_catch_array) { in destroy_op_array()
477 efree(op_array->try_catch_array); in destroy_op_array()
480 if (op_array->fn_flags & ZEND_ACC_DONE_PASS_TWO) { in destroy_op_array()
481 …nt(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_op_array_dtor_handler, op_array); in destroy_op_array()
484 if (op_array->arg_info) { in destroy_op_array()
485 uint32_t num_args = op_array->num_args; in destroy_op_array()
486 zend_arg_info *arg_info = op_array->arg_info; in destroy_op_array()
488 if (op_array->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) { in destroy_op_array()
492 if (op_array->fn_flags & ZEND_ACC_VARIADIC) { in destroy_op_array()
507 static void zend_update_extended_stmts(zend_op_array *op_array) in zend_update_extended_stmts() argument
509 zend_op *opline = op_array->opcodes, *end=opline+op_array->last; in zend_update_extended_stmts()
530 static void zend_extension_op_array_handler(zend_extension *extension, zend_op_array *op_array) in zend_extension_op_array_handler() argument
533 extension->op_array_handler(op_array); in zend_extension_op_array_handler()
537 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
541 for (i = 0; i < op_array->last_try_catch; i++) { in zend_check_finally_breakout()
542 if ((op_num < op_array->try_catch_array[i].finally_op || in zend_check_finally_breakout()
543 op_num >= op_array->try_catch_array[i].finally_end) in zend_check_finally_breakout()
544 && (dst_num >= op_array->try_catch_array[i].finally_op && in zend_check_finally_breakout()
545 dst_num <= op_array->try_catch_array[i].finally_end)) { in zend_check_finally_breakout()
547 CG(active_op_array) = op_array; in zend_check_finally_breakout()
548 CG(zend_lineno) = op_array->opcodes[op_num].lineno; in zend_check_finally_breakout()
550 } else if ((op_num >= op_array->try_catch_array[i].finally_op in zend_check_finally_breakout()
551 && op_num <= op_array->try_catch_array[i].finally_end) in zend_check_finally_breakout()
552 && (dst_num > op_array->try_catch_array[i].finally_end in zend_check_finally_breakout()
553 || dst_num < op_array->try_catch_array[i].finally_op)) { in zend_check_finally_breakout()
555 CG(active_op_array) = op_array; in zend_check_finally_breakout()
556 CG(zend_lineno) = op_array->opcodes[op_num].lineno; in zend_check_finally_breakout()
562 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
577 zend_op_array *op_array, uint32_t var_num, uint32_t kind, uint32_t start, uint32_t end) { in emit_live_range_raw() argument
580 op_array->last_live_range++; in emit_live_range_raw()
581 op_array->live_range = erealloc(op_array->live_range, in emit_live_range_raw()
582 sizeof(zend_live_range) * op_array->last_live_range); in emit_live_range_raw()
585 range = &op_array->live_range[op_array->last_live_range - 1]; in emit_live_range_raw()
586 range->var = (uint32_t) (intptr_t) ZEND_CALL_VAR_NUM(NULL, op_array->last_var + var_num); in emit_live_range_raw()
593 zend_op_array *op_array, uint32_t var_num, uint32_t start, uint32_t end, in emit_live_range() argument
595 zend_op *def_opline = &op_array->opcodes[start], *orig_def_opline = def_opline; in emit_live_range()
596 zend_op *use_opline = &op_array->opcodes[end]; in emit_live_range()
669 emit_live_range_raw(op_array, var_num, ZEND_LIVE_NEW, orig_start + 1, start + 1); in emit_live_range()
681 if (needs_live_range && !needs_live_range(op_array, orig_def_opline)) { in emit_live_range()
692 (uint32_t) (intptr_t) ZEND_CALL_VAR_NUM(NULL, op_array->last_var + var_num); in emit_live_range()
695 if (needs_live_range && !needs_live_range(op_array, orig_def_opline)) { in emit_live_range()
704 start = block_start_op - op_array->opcodes; in emit_live_range()
706 emit_live_range_raw(op_array, var_num, kind, start, end); in emit_live_range()
716 start = def_opline + 1 - op_array->opcodes; in emit_live_range()
717 end = use_opline - op_array->opcodes; in emit_live_range()
718 emit_live_range_raw(op_array, var_num, kind, start, end); in emit_live_range()
723 emit_live_range_raw(op_array, var_num, kind, start, end); in emit_live_range()
770 zend_op_array *op_array, zend_needs_live_range_cb needs_live_range) { in zend_calc_live_ranges() argument
771 uint32_t opnum = op_array->last; in zend_calc_live_ranges()
772 zend_op *opline = &op_array->opcodes[opnum]; in zend_calc_live_ranges()
774 uint32_t var_offset = op_array->last_var; in zend_calc_live_ranges()
775 uint32_t *last_use = do_alloca(sizeof(uint32_t) * op_array->T, use_heap); in zend_calc_live_ranges()
776 memset(last_use, -1, sizeof(uint32_t) * op_array->T); in zend_calc_live_ranges()
778 ZEND_ASSERT(!op_array->live_range); in zend_calc_live_ranges()
803 emit_live_range(op_array, var_num, num, last_use[var_num], needs_live_range); in zend_calc_live_ranges()
826 op_array, var_num, opnum, last_use[var_num], needs_live_range); in zend_calc_live_ranges()
843 if (op_array->last_live_range > 1) { in zend_calc_live_ranges()
844 zend_live_range *r1 = op_array->live_range; in zend_calc_live_ranges()
845 zend_live_range *r2 = r1 + op_array->last_live_range - 1; in zend_calc_live_ranges()
854 r1 = op_array->live_range; in zend_calc_live_ranges()
855 r2 = r1 + op_array->last_live_range - 1; in zend_calc_live_ranges()
870 zend_op_array *op_array, zend_needs_live_range_cb needs_live_range) { in zend_recalc_live_ranges() argument
872 ZEND_ASSERT(op_array->live_range); in zend_recalc_live_ranges()
873 efree(op_array->live_range); in zend_recalc_live_ranges()
874 op_array->live_range = NULL; in zend_recalc_live_ranges()
875 op_array->last_live_range = 0; in zend_recalc_live_ranges()
876 zend_calc_live_ranges(op_array, needs_live_range); in zend_recalc_live_ranges()
879 ZEND_API int pass_two(zend_op_array *op_array) in pass_two() argument
883 if (!ZEND_USER_CODE(op_array->type)) { in pass_two()
887 zend_update_extended_stmts(op_array); in pass_two()
891 …rgument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_op_array_handler, op_array); in pass_two()
895 if (CG(context).vars_size != op_array->last_var) { in pass_two()
896op_array->vars = (zend_string**) erealloc(op_array->vars, sizeof(zend_string*)*op_array->last_var); in pass_two()
897 CG(context).vars_size = op_array->last_var; in pass_two()
901 if (CG(context).opcodes_size != op_array->last) { in pass_two()
902 op_array->opcodes = (zend_op *) erealloc(op_array->opcodes, sizeof(zend_op)*op_array->last); in pass_two()
903 CG(context).opcodes_size = op_array->last; in pass_two()
905 if (CG(context).literals_size != op_array->last_literal) { in pass_two()
906 op_array->literals = (zval*)erealloc(op_array->literals, sizeof(zval) * op_array->last_literal); in pass_two()
907 CG(context).literals_size = op_array->last_literal; in pass_two()
910 op_array->opcodes = (zend_op *) erealloc(op_array->opcodes, in pass_two()
911 ZEND_MM_ALIGNED_SIZE_EX(sizeof(zend_op) * op_array->last, 16) + in pass_two()
912 sizeof(zval) * op_array->last_literal); in pass_two()
913 if (op_array->literals) { in pass_two()
914 memcpy(((char*)op_array->opcodes) + ZEND_MM_ALIGNED_SIZE_EX(sizeof(zend_op) * op_array->last, 16), in pass_two()
915 op_array->literals, sizeof(zval) * op_array->last_literal); in pass_two()
916 efree(op_array->literals); in pass_two()
917op_array->literals = (zval*)(((char*)op_array->opcodes) + ZEND_MM_ALIGNED_SIZE_EX(sizeof(zend_op) … in pass_two()
919 CG(context).opcodes_size = op_array->last; in pass_two()
920 CG(context).literals_size = op_array->last_literal; in pass_two()
925 op_array->fn_flags |= ZEND_ACC_DONE_PASS_TWO; in pass_two()
927 opline = op_array->opcodes; in pass_two()
928 end = opline + op_array->last; in pass_two()
935 uint32_t slot = ZEND_MM_ALIGNED_SIZE_EX(op_array->cache_size, 8); in pass_two()
937 op_array->cache_size += sizeof(zval); in pass_two()
942 opline->op1.opline_num = op_array->try_catch_array[opline->op1.num].finally_op; in pass_two()
943 ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op1); in pass_two()
948 uint32_t jmp_target = zend_get_brk_cont_target(op_array, opline); in pass_two()
950 if (op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK) { in pass_two()
951 zend_check_finally_breakout(op_array, opline - op_array->opcodes, jmp_target); in pass_two()
956 ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op1); in pass_two()
960 zend_resolve_goto_label(op_array, opline); in pass_two()
961 if (op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK) { in pass_two()
962 zend_check_finally_breakout(op_array, opline - op_array->opcodes, opline->op1.opline_num); in pass_two()
966 ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op1); in pass_two()
970 opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, opline->extended_value); in pass_two()
980 ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op2); in pass_two()
985 zend_op *call = &op_array->opcodes[opline->op2.opline_num - 1]; in pass_two()
992 ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op2); in pass_two()
998 opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, opline->extended_value); in pass_two()
1002 ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op2); in pass_two()
1007 if (op_array->fn_flags & ZEND_ACC_GENERATOR) { in pass_two()
1018 Z_LVAL_P(zv) = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, Z_LVAL_P(zv)); in pass_two()
1021 opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, opline->extended_value); in pass_two()
1026 ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline, opline->op1); in pass_two()
1028 …opline->op1.var = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + opline->op… in pass_two()
1031 ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline, opline->op2); in pass_two()
1033 …opline->op2.var = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + opline->op… in pass_two()
1036 …opline->result.var = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + opline-… in pass_two()
1042 zend_calc_live_ranges(op_array, NULL); in pass_two()