]> granicus.if.org Git - php/commitdiff
- Ported the zend_execute_internal hook to ZendEngine2.
authorDerick Rethans <derick@php.net>
Sat, 11 Jan 2003 16:12:44 +0000 (16:12 +0000)
committerDerick Rethans <derick@php.net>
Sat, 11 Jan 2003 16:12:44 +0000 (16:12 +0000)
Zend/zend.c
Zend/zend_execute.c
Zend/zend_execute.h
Zend/zend_execute_API.c

index d268bfb2a4dac396e47b33b897ba7a7fdfeaaecd..3ddb4e279e8fbb4df07faca7e3f3334c8b729531 100644 (file)
@@ -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();
 
index e5f10e5ffe1111d5500257fecbf5188661bfaacd..368906f9b17ab6b3b75f307e64521787ce7b77d7 100644 (file)
@@ -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;
index 6b31cbcdffc930de1ab5de94043dd875e6666c3d..ef2ddd80ddf76d792176e92304f07612ec22b633 100644 (file)
@@ -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)
 {
index eff737716223625074e178fd8cc15105bd9cd39e..ea5f8df57c4b4e28f47cdc75fceb8b1989b35729 100644 (file)
@@ -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>