From: Dmitry Stogov Date: Thu, 29 Jun 2017 07:10:57 +0000 (+0300) Subject: Split zend_init_execute_data() into zend_init_func_execute_data() and zend_init_code_... X-Git-Tag: php-7.2.0alpha3~23 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bbb786c85ba93994ec0ac3025f0f84caea317483;p=php Split zend_init_execute_data() into zend_init_func_execute_data() and zend_init_code_execute_data() --- diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 09aa4576ff..e2b750303f 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2238,88 +2238,35 @@ static zend_always_inline void i_init_code_execute_data(zend_execute_data *execu } /* }}} */ -static zend_always_inline void i_init_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value) /* {{{ */ +ZEND_API void zend_init_func_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value) /* {{{ */ { - ZEND_ASSERT(EX(func) == (zend_function*)op_array); - - EX(opline) = op_array->opcodes; - EX(call) = NULL; - EX(return_value) = return_value; - - if (EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE) { - zend_attach_symbol_table(execute_data); - } else { - uint32_t first_extra_arg, num_args; - - /* Handle arguments */ - first_extra_arg = op_array->num_args; - num_args = EX_NUM_ARGS(); - if (UNEXPECTED(num_args > first_extra_arg)) { - if (EXPECTED(!(op_array->fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE))) { - zval *end, *src, *dst; - uint32_t type_flags = 0; - - if (EXPECTED((op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) == 0)) { - /* Skip useless ZEND_RECV and ZEND_RECV_INIT opcodes */ - EX(opline) += first_extra_arg; - } - - /* move extra args into separate array after all CV and TMP vars */ - end = EX_VAR_NUM(first_extra_arg - 1); - src = end + (num_args - first_extra_arg); - dst = src + (op_array->last_var + op_array->T - first_extra_arg); - if (EXPECTED(src != dst)) { - do { - type_flags |= Z_TYPE_INFO_P(src); - ZVAL_COPY_VALUE(dst, src); - ZVAL_UNDEF(src); - src--; - dst--; - } while (src != end); - } else { - do { - type_flags |= Z_TYPE_INFO_P(src); - src--; - } while (src != end); - } - ZEND_ADD_CALL_FLAG(execute_data, ((type_flags >> Z_TYPE_FLAGS_SHIFT) & IS_TYPE_REFCOUNTED)); - } - } else if (EXPECTED((op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) == 0)) { - /* Skip useless ZEND_RECV and ZEND_RECV_INIT opcodes */ - EX(opline) += num_args; - } - - /* Initialize CV variables (skip arguments) */ - if (EXPECTED((int)num_args < op_array->last_var)) { - zval *var = EX_VAR_NUM(num_args); - zval *end = EX_VAR_NUM(op_array->last_var); - - do { - ZVAL_UNDEF(var); - var++; - } while (var != end); - } + EX(prev_execute_data) = EG(current_execute_data); + if (!op_array->run_time_cache) { + op_array->run_time_cache = zend_arena_alloc(&CG(arena), op_array->cache_size); + memset(op_array->run_time_cache, 0, op_array->cache_size); } + i_init_func_execute_data(execute_data, op_array, return_value); +} +/* }}} */ +ZEND_API void zend_init_code_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value) /* {{{ */ +{ + EX(prev_execute_data) = EG(current_execute_data); if (!op_array->run_time_cache) { - if (op_array->function_name) { - op_array->run_time_cache = zend_arena_alloc(&CG(arena), op_array->cache_size); - } else { - op_array->run_time_cache = emalloc(op_array->cache_size); - } + op_array->run_time_cache = emalloc(op_array->cache_size); memset(op_array->run_time_cache, 0, op_array->cache_size); } - EX_LOAD_RUN_TIME_CACHE(op_array); - EX_LOAD_LITERALS(op_array); - - EG(current_execute_data) = execute_data; + i_init_code_execute_data(execute_data, op_array, return_value); } /* }}} */ ZEND_API void zend_init_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value) /* {{{ */ { - EX(prev_execute_data) = EG(current_execute_data); - i_init_execute_data(execute_data, op_array, return_value); + if (EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE) { + zend_init_code_execute_data(execute_data, op_array, return_value); + } else { + zend_init_func_execute_data(execute_data, op_array, return_value); + } } /* }}} */ diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 5938a97a9e..c412d80209 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -37,6 +37,8 @@ void init_executor(void); void shutdown_executor(void); void shutdown_destructors(void); ZEND_API void zend_init_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value); +ZEND_API void zend_init_func_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value); +ZEND_API void zend_init_code_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value); ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value); ZEND_API void execute_ex(zend_execute_data *execute_data); ZEND_API void execute_internal(zend_execute_data *execute_data, zval *return_value); diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 77345c4286..f3777d767b 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -822,7 +822,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) / int call_via_handler = (func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) != 0; const zend_op *current_opline_before_exception = EG(opline_before_exception); - zend_init_execute_data(call, &func->op_array, fci->retval); + zend_init_func_execute_data(call, &func->op_array, fci->retval); zend_execute_ex(call); EG(opline_before_exception) = current_opline_before_exception; if (call_via_handler) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 89b9b2621f..66cb245717 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -63121,7 +63121,7 @@ ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value) execute_data->symbol_table = &EG(symbol_table); } EX(prev_execute_data) = EG(current_execute_data); - i_init_execute_data(execute_data, op_array, return_value); + i_init_code_execute_data(execute_data, op_array, return_value); zend_execute_ex(execute_data); zend_vm_stack_free_call_frame(execute_data); } diff --git a/Zend/zend_vm_execute.skl b/Zend/zend_vm_execute.skl index eb60787042..8eda5a48b0 100644 --- a/Zend/zend_vm_execute.skl +++ b/Zend/zend_vm_execute.skl @@ -37,7 +37,7 @@ ZEND_API void zend_{%EXECUTOR_NAME%}(zend_op_array *op_array, zval *return_value execute_data->symbol_table = &EG(symbol_table); } EX(prev_execute_data) = EG(current_execute_data); - i_init_execute_data(execute_data, op_array, return_value); + i_init_code_execute_data(execute_data, op_array, return_value); zend_{%EXECUTOR_NAME%}_ex(execute_data); zend_vm_stack_free_call_frame(execute_data); }