summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_execute.c89
-rw-r--r--Zend/zend_execute.h2
-rw-r--r--Zend/zend_execute_API.c2
-rw-r--r--Zend/zend_vm_execute.h2
-rw-r--r--Zend/zend_vm_execute.skl2
5 files changed, 23 insertions, 74 deletions
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);
}