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()
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()
42 extension->op_array_dtor(op_array); in zend_extension_op_array_dtor_handler()
46 static void op_array_alloc_ops(zend_op_array *op_array, zend_uint size) in op_array_alloc_ops() argument
48 op_array->opcodes = erealloc(op_array->opcodes, size * sizeof(zend_op)); in op_array_alloc_ops()
51 void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_size TSRMLS_DC) in init_op_array() argument
53 op_array->type = type; in init_op_array()
62 op_array->refcount = (zend_uint *) emalloc(sizeof(zend_uint)); in init_op_array()
63 *op_array->refcount = 1; in init_op_array()
64 op_array->last = 0; in init_op_array()
65 op_array->opcodes = NULL; in init_op_array()
66 op_array_alloc_ops(op_array, initial_ops_size); in init_op_array()
68 op_array->last_var = 0; in init_op_array()
69 op_array->vars = NULL; in init_op_array()
71 op_array->T = 0; in init_op_array()
73 op_array->nested_calls = 0; in init_op_array()
74 op_array->used_stack = 0; in init_op_array()
76 op_array->function_name = NULL; in init_op_array()
77 op_array->filename = zend_get_compiled_filename(TSRMLS_C); in init_op_array()
78 op_array->doc_comment = NULL; in init_op_array()
79 op_array->doc_comment_len = 0; in init_op_array()
81 op_array->arg_info = NULL; in init_op_array()
82 op_array->num_args = 0; in init_op_array()
83 op_array->required_num_args = 0; in init_op_array()
85 op_array->scope = NULL; in init_op_array()
87 op_array->brk_cont_array = NULL; in init_op_array()
88 op_array->try_catch_array = NULL; in init_op_array()
89 op_array->last_brk_cont = 0; in init_op_array()
91 op_array->static_variables = NULL; in init_op_array()
92 op_array->last_try_catch = 0; in init_op_array()
93 op_array->has_finally_block = 0; in init_op_array()
95 op_array->this_var = -1; in init_op_array()
97 op_array->fn_flags = CG(interactive)?ZEND_ACC_INTERACTIVE:0; in init_op_array()
99 op_array->early_binding = -1; in init_op_array()
101 op_array->last_literal = 0; in init_op_array()
102 op_array->literals = NULL; in init_op_array()
104 op_array->run_time_cache = NULL; in init_op_array()
105 op_array->last_cache_slot = 0; in init_op_array()
107 memset(op_array->reserved, 0, ZEND_MAX_RESERVED_RESOURCES * sizeof(void*)); in init_op_array()
109 …xtensions, (llist_apply_with_arg_func_t) zend_extension_op_array_ctor_handler, op_array TSRMLS_CC); in init_op_array()
131 static void zend_cleanup_op_array_data(zend_op_array *op_array) in zend_cleanup_op_array_data() argument
133 if (op_array->static_variables) { in zend_cleanup_op_array_data()
134 zend_hash_clean(op_array->static_variables); in zend_cleanup_op_array_data()
354 ZEND_API void destroy_op_array(zend_op_array *op_array TSRMLS_DC) in destroy_op_array()
356 zend_literal *literal = op_array->literals; in destroy_op_array()
360 if (op_array->static_variables) { in destroy_op_array()
361 zend_hash_destroy(op_array->static_variables); in destroy_op_array()
362 FREE_HASHTABLE(op_array->static_variables); in destroy_op_array()
365 if (op_array->run_time_cache) { in destroy_op_array()
366 efree(op_array->run_time_cache); in destroy_op_array()
369 if (--(*op_array->refcount)>0) { in destroy_op_array()
373 efree(op_array->refcount); in destroy_op_array()
375 if (op_array->vars) { in destroy_op_array()
376 i = op_array->last_var; in destroy_op_array()
379 str_efree(op_array->vars[i].name); in destroy_op_array()
381 efree(op_array->vars); in destroy_op_array()
385 end = literal + op_array->last_literal; in destroy_op_array()
390 efree(op_array->literals); in destroy_op_array()
392 efree(op_array->opcodes); in destroy_op_array()
394 if (op_array->function_name) { in destroy_op_array()
395 efree((char*)op_array->function_name); in destroy_op_array()
397 if (op_array->doc_comment) { in destroy_op_array()
398 efree((char*)op_array->doc_comment); in destroy_op_array()
400 if (op_array->brk_cont_array) { in destroy_op_array()
401 efree(op_array->brk_cont_array); in destroy_op_array()
403 if (op_array->try_catch_array) { in destroy_op_array()
404 efree(op_array->try_catch_array); in destroy_op_array()
406 if (op_array->fn_flags & ZEND_ACC_DONE_PASS_TWO) { in destroy_op_array()
407 …xtensions, (llist_apply_with_arg_func_t) zend_extension_op_array_dtor_handler, op_array TSRMLS_CC); in destroy_op_array()
409 if (op_array->arg_info) { in destroy_op_array()
410 for (i=0; i<op_array->num_args; i++) { in destroy_op_array()
411 str_efree(op_array->arg_info[i].name); in destroy_op_array()
412 if (op_array->arg_info[i].class_name) { in destroy_op_array()
413 str_efree(op_array->arg_info[i].class_name); in destroy_op_array()
416 efree(op_array->arg_info); in destroy_op_array()
427 zend_op *get_next_op(zend_op_array *op_array TSRMLS_DC) in get_next_op()
429 zend_uint next_op_num = op_array->last++; in get_next_op()
433 if (op_array->fn_flags & ZEND_ACC_INTERACTIVE) { in get_next_op()
440 op_array_alloc_ops(op_array, CG(context).opcodes_size); in get_next_op()
443 next_op = &(op_array->opcodes[next_op_num]); in get_next_op()
450 int get_next_op_number(zend_op_array *op_array) in get_next_op_number() argument
452 return op_array->last; in get_next_op_number()
455 zend_brk_cont_element *get_next_brk_cont_element(zend_op_array *op_array) in get_next_brk_cont_element() argument
457 op_array->last_brk_cont++; in get_next_brk_cont_element()
458op_array->brk_cont_array = erealloc(op_array->brk_cont_array, sizeof(zend_brk_cont_element)*op_arr… in get_next_brk_cont_element()
459 return &op_array->brk_cont_array[op_array->last_brk_cont-1]; in get_next_brk_cont_element()
462 static void zend_update_extended_info(zend_op_array *op_array TSRMLS_DC) in zend_update_extended_info()
464 zend_op *opline = op_array->opcodes, *end=opline+op_array->last; in zend_update_extended_info()
485 static void zend_extension_op_array_handler(zend_extension *extension, zend_op_array *op_array TSRM… in zend_extension_op_array_handler()
488 extension->op_array_handler(op_array); in zend_extension_op_array_handler()
492 static void zend_check_finally_breakout(zend_op_array *op_array, zend_uint op_num, zend_uint dst_nu… in zend_check_finally_breakout() argument
496 for (i = 0; i < op_array->last_try_catch; i++) { in zend_check_finally_breakout()
497 if ((op_num < op_array->try_catch_array[i].finally_op || in zend_check_finally_breakout()
498 op_num >= op_array->try_catch_array[i].finally_end) in zend_check_finally_breakout()
499 && (dst_num >= op_array->try_catch_array[i].finally_op && in zend_check_finally_breakout()
500 dst_num <= op_array->try_catch_array[i].finally_end)) { in zend_check_finally_breakout()
502 CG(active_op_array) = op_array; in zend_check_finally_breakout()
503 CG(zend_lineno) = op_array->opcodes[op_num].lineno; in zend_check_finally_breakout()
505 } else if ((op_num >= op_array->try_catch_array[i].finally_op in zend_check_finally_breakout()
506 && op_num <= op_array->try_catch_array[i].finally_end) in zend_check_finally_breakout()
507 && (dst_num > op_array->try_catch_array[i].finally_end in zend_check_finally_breakout()
508 || dst_num < op_array->try_catch_array[i].finally_op)) { in zend_check_finally_breakout()
510 CG(active_op_array) = op_array; in zend_check_finally_breakout()
511 CG(zend_lineno) = op_array->opcodes[op_num].lineno; in zend_check_finally_breakout()
517 static void zend_adjust_fast_call(zend_op_array *op_array, zend_uint fast_call, zend_uint start, ze… in zend_adjust_fast_call() argument
522 for (i = 0; i < op_array->last_try_catch; i++) { in zend_adjust_fast_call()
523 if (op_array->try_catch_array[i].finally_op > start in zend_adjust_fast_call()
524 && op_array->try_catch_array[i].finally_end < end) { in zend_adjust_fast_call()
525 op_num = op_array->try_catch_array[i].finally_op; in zend_adjust_fast_call()
526 start = op_array->try_catch_array[i].finally_end; in zend_adjust_fast_call()
532 ZEND_ASSERT(op_array->opcodes[op_num - 2].opcode == ZEND_FAST_CALL); in zend_adjust_fast_call()
533 op_array->opcodes[op_num - 2].extended_value = ZEND_FAST_CALL_FROM_FINALLY; in zend_adjust_fast_call()
534 op_array->opcodes[op_num - 2].op2.opline_num = fast_call; in zend_adjust_fast_call()
538 static void zend_resolve_fast_call(zend_op_array *op_array, zend_uint fast_call, zend_uint op_num T… in zend_resolve_fast_call() argument
543 for (i = 0; i < op_array->last_try_catch; i++) { in zend_resolve_fast_call()
544 if (op_num >= op_array->try_catch_array[i].finally_op in zend_resolve_fast_call()
545 && op_num < op_array->try_catch_array[i].finally_end) { in zend_resolve_fast_call()
546 finally_op_num = op_array->try_catch_array[i].finally_op; in zend_resolve_fast_call()
552 ZEND_ASSERT(op_array->opcodes[finally_op_num - 2].opcode == ZEND_FAST_CALL); in zend_resolve_fast_call()
553 if (op_array->opcodes[fast_call].extended_value == 0) { in zend_resolve_fast_call()
554 op_array->opcodes[fast_call].extended_value = ZEND_FAST_CALL_FROM_FINALLY; in zend_resolve_fast_call()
555 op_array->opcodes[fast_call].op2.opline_num = finally_op_num - 2; in zend_resolve_fast_call()
560 static void zend_resolve_finally_call(zend_op_array *op_array, zend_uint op_num, zend_uint dst_num … in zend_resolve_finally_call() argument
564 zend_uint i = op_array->last_try_catch; in zend_resolve_finally_call()
567 zend_check_finally_breakout(op_array, op_num, dst_num TSRMLS_CC); in zend_resolve_finally_call()
573 if (op_array->try_catch_array[i].finally_op && in zend_resolve_finally_call()
574 op_num >= op_array->try_catch_array[i].try_op && in zend_resolve_finally_call()
575 op_num < op_array->try_catch_array[i].finally_op - 1 && in zend_resolve_finally_call()
576 (dst_num < op_array->try_catch_array[i].try_op || in zend_resolve_finally_call()
577 dst_num > op_array->try_catch_array[i].finally_end)) { in zend_resolve_finally_call()
581 start_op = get_next_op_number(op_array); in zend_resolve_finally_call()
583 opline = get_next_op(op_array TSRMLS_CC); in zend_resolve_finally_call()
587 zend_adjust_fast_call(op_array, start_op, in zend_resolve_finally_call()
588 op_array->try_catch_array[i].finally_op, in zend_resolve_finally_call()
589 op_array->try_catch_array[i].finally_end TSRMLS_CC); in zend_resolve_finally_call()
590 if (op_array->try_catch_array[i].catch_op) { in zend_resolve_finally_call()
592 opline->op2.opline_num = op_array->try_catch_array[i].catch_op; in zend_resolve_finally_call()
593 opline->op1.opline_num = get_next_op_number(op_array); in zend_resolve_finally_call()
595 opline = get_next_op(op_array TSRMLS_CC); in zend_resolve_finally_call()
599 …zend_resolve_fast_call(op_array, start_op + 1, op_array->try_catch_array[i].finally_op - 2 TSRMLS_… in zend_resolve_finally_call()
601 … zend_resolve_fast_call(op_array, start_op, op_array->try_catch_array[i].finally_op - 2 TSRMLS_CC); in zend_resolve_finally_call()
603 opline->op1.opline_num = op_array->try_catch_array[i].finally_op; in zend_resolve_finally_call()
608 if (op_array->try_catch_array[i].finally_op && in zend_resolve_finally_call()
609 op_num >= op_array->try_catch_array[i].try_op && in zend_resolve_finally_call()
610 op_num < op_array->try_catch_array[i].finally_op - 1 && in zend_resolve_finally_call()
611 (dst_num < op_array->try_catch_array[i].try_op || in zend_resolve_finally_call()
612 dst_num > op_array->try_catch_array[i].finally_end)) { in zend_resolve_finally_call()
614 opline = get_next_op(op_array TSRMLS_CC); in zend_resolve_finally_call()
618 opline->op1.opline_num = op_array->try_catch_array[i].finally_op; in zend_resolve_finally_call()
623 opline = get_next_op(op_array TSRMLS_CC); in zend_resolve_finally_call()
624 *opline = op_array->opcodes[op_num]; in zend_resolve_finally_call()
627 opline = op_array->opcodes + op_num; in zend_resolve_finally_call()
638 static void zend_resolve_finally_ret(zend_op_array *op_array, zend_uint op_num TSRMLS_DC) in zend_resolve_finally_ret() argument
643 for (i = 0; i < op_array->last_try_catch; i++) { in zend_resolve_finally_ret()
644 if (op_array->try_catch_array[i].try_op > op_num) { in zend_resolve_finally_ret()
647 if (op_num < op_array->try_catch_array[i].finally_op) { in zend_resolve_finally_ret()
648 finally_op_num = op_array->try_catch_array[i].finally_op; in zend_resolve_finally_ret()
650 if (op_num < op_array->try_catch_array[i].catch_op) { in zend_resolve_finally_ret()
651 catch_op_num = op_array->try_catch_array[i].catch_op; in zend_resolve_finally_ret()
657 op_array->opcodes[op_num].extended_value = ZEND_FAST_RET_TO_FINALLY; in zend_resolve_finally_ret()
658 op_array->opcodes[op_num].op2.opline_num = finally_op_num; in zend_resolve_finally_ret()
661 op_array->opcodes[op_num].extended_value = ZEND_FAST_RET_TO_CATCH; in zend_resolve_finally_ret()
662 op_array->opcodes[op_num].op2.opline_num = catch_op_num; in zend_resolve_finally_ret()
666 static void zend_resolve_finally_calls(zend_op_array *op_array TSRMLS_DC) in zend_resolve_finally_calls()
671 for (i = 0, j = op_array->last; i < j; i++) { in zend_resolve_finally_calls()
672 opline = op_array->opcodes + i; in zend_resolve_finally_calls()
677 zend_resolve_finally_call(op_array, i, (zend_uint)-1 TSRMLS_CC); in zend_resolve_finally_calls()
685 nest_levels = Z_LVAL(op_array->literals[opline->op2.constant].constant); in zend_resolve_finally_calls()
688 jmp_to = &op_array->brk_cont_array[array_offset]; in zend_resolve_finally_calls()
693 …zend_resolve_finally_call(op_array, i, opline->opcode == ZEND_BRK ? jmp_to->brk : jmp_to->cont TSR… in zend_resolve_finally_calls()
698 if (Z_TYPE(op_array->literals[opline->op2.constant].constant) != IS_LONG) { in zend_resolve_finally_calls()
700 opline->op2.zv = &op_array->literals[opline->op2.constant].constant; in zend_resolve_finally_calls()
701 zend_resolve_goto_label(op_array, opline, 1 TSRMLS_CC); in zend_resolve_finally_calls()
706 zend_resolve_finally_call(op_array, i, opline->op1.opline_num TSRMLS_CC); in zend_resolve_finally_calls()
709 zend_resolve_fast_call(op_array, i, i TSRMLS_CC); in zend_resolve_finally_calls()
712 zend_resolve_finally_ret(op_array, i TSRMLS_CC); in zend_resolve_finally_calls()
720 ZEND_API int pass_two(zend_op_array *op_array TSRMLS_DC) in pass_two()
724 if (op_array->type!=ZEND_USER_FUNCTION && op_array->type!=ZEND_EVAL_CODE) { in pass_two()
727 if (op_array->has_finally_block) { in pass_two()
728 zend_resolve_finally_calls(op_array TSRMLS_CC); in pass_two()
731 zend_update_extended_info(op_array TSRMLS_CC); in pass_two()
734 …end_extensions, (llist_apply_with_arg_func_t) zend_extension_op_array_handler, op_array TSRMLS_CC); in pass_two()
737 if (!(op_array->fn_flags & ZEND_ACC_INTERACTIVE) && CG(context).vars_size != op_array->last_var) { in pass_two()
738op_array->vars = (zend_compiled_variable *) erealloc(op_array->vars, sizeof(zend_compiled_variable… in pass_two()
739 CG(context).vars_size = op_array->last_var; in pass_two()
741 if (!(op_array->fn_flags & ZEND_ACC_INTERACTIVE) && CG(context).opcodes_size != op_array->last) { in pass_two()
742 op_array->opcodes = (zend_op *) erealloc(op_array->opcodes, sizeof(zend_op)*op_array->last); in pass_two()
743 CG(context).opcodes_size = op_array->last; in pass_two()
745 …if (!(op_array->fn_flags & ZEND_ACC_INTERACTIVE) && CG(context).literals_size != op_array->last_li… in pass_two()
746op_array->literals = (zend_literal*)erealloc(op_array->literals, sizeof(zend_literal) * op_array->… in pass_two()
747 CG(context).literals_size = op_array->last_literal; in pass_two()
750 opline = op_array->opcodes; in pass_two()
751 end = opline + op_array->last; in pass_two()
754 opline->op1.zv = &op_array->literals[opline->op1.constant].constant; in pass_two()
757 opline->op2.zv = &op_array->literals[opline->op2.constant].constant; in pass_two()
762 zend_resolve_goto_label(op_array, opline, 1 TSRMLS_CC); in pass_two()
767 opline->op1.jmp_addr = &op_array->opcodes[opline->op1.opline_num]; in pass_two()
775 opline->op2.jmp_addr = &op_array->opcodes[opline->op2.opline_num]; in pass_two()
779 if (op_array->fn_flags & ZEND_ACC_GENERATOR) { in pass_two()
793 op_array->fn_flags |= ZEND_ACC_DONE_PASS_TWO; in pass_two()