summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend.c1
-rw-r--r--Zend/zend_execute.c14
-rw-r--r--Zend/zend_execute.h2
-rw-r--r--Zend/zend_execute_API.c1
4 files changed, 17 insertions, 1 deletions
diff --git a/Zend/zend.c b/Zend/zend.c
index d268bfb2a4..3ddb4e279e 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -519,6 +519,7 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions, i
zend_compile_file = compile_file;
zend_execute = execute;
+ zend_execute_internal = NULL;
zend_init_opcodes_handlers();
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index e5f10e5ffe..368906f9b1 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -1159,6 +1159,11 @@ static int zend_check_symbol(zval **pz TSRMLS_DC)
opcode_handler_t zend_opcode_handlers[512];
+ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, int return_value_used TSRMLS_DC)
+{
+ ((zend_internal_function *) execute_data_ptr->function_state.function)->handler(execute_data_ptr->opline->extended_value, (*(temp_variable *)((char *) execute_data_ptr->Ts + execute_data_ptr->opline->result.u.var)).var.ptr, execute_data_ptr->object, return_value_used TSRMLS_CC);
+}
+
ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)
{
zend_execute_data execute_data;
@@ -2550,7 +2555,14 @@ int zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS)
if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
ALLOC_ZVAL(EX_T(EX(opline)->result.u.var).var.ptr);
INIT_ZVAL(*(EX_T(EX(opline)->result.u.var).var.ptr));
- ((zend_internal_function *) EX(function_state).function)->handler(EX(opline)->extended_value, EX_T(EX(opline)->result.u.var).var.ptr, EX(object), return_value_used TSRMLS_CC);
+
+ if (! zend_execute_internal) {
+ /* saves one function hall if the zend_execute_internal is not used */
+ ((zend_internal_function *) EX(function_state).function)->handler(EX(opline)->extended_value, EX_T(EX(opline)->result.u.var).var.ptr, EX(object), return_value_used TSRMLS_CC);
+ } else {
+ zend_execute_internal(execute_data, return_value_used TSRMLS_CC);
+ }
+
EG(current_execute_data) = execute_data;
EX_T(EX(opline)->result.u.var).var.ptr->is_ref = 0;
EX_T(EX(opline)->result.u.var).var.ptr->refcount = 1;
diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h
index 6b31cbcdff..ef2ddd80dd 100644
--- a/Zend/zend_execute.h
+++ b/Zend/zend_execute.h
@@ -51,10 +51,12 @@ typedef union _temp_variable {
BEGIN_EXTERN_C()
ZEND_API extern void (*zend_execute)(zend_op_array *op_array TSRMLS_DC);
+ZEND_API extern void (*zend_execute_internal)(zend_execute_data *execute_data_ptr, int return_value_used TSRMLS_DC);
void init_executor(TSRMLS_D);
void shutdown_executor(TSRMLS_D);
ZEND_API void execute(zend_op_array *op_array TSRMLS_DC);
+ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, int return_value_used TSRMLS_DC);
ZEND_API int zend_is_true(zval *op);
static inline void safe_free_zval_ptr(zval *p)
{
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index eff7377162..ea5f8df57c 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -34,6 +34,7 @@
ZEND_API void (*zend_execute)(zend_op_array *op_array TSRMLS_DC);
+ZEND_API void (*zend_execute_internal)(zend_execute_data *execute_data_ptr, int return_value_used TSRMLS_DC);
#ifdef ZEND_WIN32
#include <process.h>