From: Derick Rethans Date: Sat, 11 Jan 2003 16:12:44 +0000 (+0000) Subject: - Ported the zend_execute_internal hook to ZendEngine2. X-Git-Tag: PHP_5_0_dev_before_13561_fix~317 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2c44fab3a02ea818f5a6059679392119704e5df0;p=php - Ported the zend_execute_internal hook to ZendEngine2. --- 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