Commit:    531e2533dd2baf5cf10e8de7074ca0b94386dba4
Author:    Stanislav Malyshev <s...@php.net>         Fri, 5 Oct 2012 08:14:20 
+0200
Parents:   bda93f54059f99752d03c1d27a6128d6b4264858
Branches:  master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=531e2533dd2baf5cf10e8de7074ca0b94386dba4

Log:
Use zend_execute_internal always to call internal functions

Changed paths:
  M  Zend/zend_dtrace.c
  M  Zend/zend_dtrace.h
  M  Zend/zend_execute.c
  M  Zend/zend_execute.h
  M  Zend/zend_execute_API.c
  M  Zend/zend_vm_def.h
  M  Zend/zend_vm_execute.h

diff --git a/Zend/zend_dtrace.c b/Zend/zend_dtrace.c
index 5b2d0d2..3d109de 100644
--- a/Zend/zend_dtrace.c
+++ b/Zend/zend_dtrace.c
@@ -83,7 +83,7 @@ ZEND_API void dtrace_execute(zend_op_array *op_array 
TSRMLS_DC)
        }
 }
 
-ZEND_API void dtrace_execute_internal(zend_execute_data *execute_data_ptr, int 
return_value_used TSRMLS_DC)
+ZEND_API void dtrace_execute_internal(zend_execute_data *execute_data_ptr, 
zend_fcall_info *fci, int return_value_used TSRMLS_DC)
 {
        int lineno;
        char *filename;
@@ -96,7 +96,7 @@ ZEND_API void dtrace_execute_internal(zend_execute_data 
*execute_data_ptr, int r
                DTRACE_EXECUTE_ENTRY(filename, lineno);
        }
 
-       execute_internal(execute_data_ptr, return_value_used TSRMLS_CC);
+       execute_internal(execute_data_ptr, fci, return_value_used TSRMLS_CC);
 
        if (DTRACE_EXECUTE_RETURN_ENABLED()) {
                DTRACE_EXECUTE_RETURN(filename, lineno);
diff --git a/Zend/zend_dtrace.h b/Zend/zend_dtrace.h
index 65d19ef..49388e5 100644
--- a/Zend/zend_dtrace.h
+++ b/Zend/zend_dtrace.h
@@ -32,11 +32,11 @@ extern "C" {
 #ifdef HAVE_DTRACE
 ZEND_API zend_op_array *(*zend_dtrace_compile_file)(zend_file_handle 
*file_handle, int type TSRMLS_DC);
 ZEND_API void (*zend_dtrace_execute)(zend_op_array *op_array TSRMLS_DC);
-ZEND_API void (*zend_dtrace_execute_internal)(zend_execute_data 
*execute_data_ptr, int return_value_used TSRMLS_DC);
+ZEND_API void (*zend_dtrace_execute_internal)(zend_execute_data 
*execute_data_ptr, zend_fcall_info *fci, int return_value_used TSRMLS_DC);
 
 ZEND_API zend_op_array *dtrace_compile_file(zend_file_handle *file_handle, int 
type TSRMLS_DC);
 ZEND_API void dtrace_execute(zend_op_array *op_array TSRMLS_DC);
-ZEND_API void dtrace_execute_internal(zend_execute_data *execute_data_ptr, int 
return_value_used TSRMLS_DC);
+ZEND_API void dtrace_execute_internal(zend_execute_data *execute_data_ptr, 
zend_fcall_info *fci, int return_value_used TSRMLS_DC);
 #include <zend_dtrace_gen.h>
 
 #endif /* HAVE_DTRACE */
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 149b912..361afc6 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -1475,10 +1475,18 @@ static int zend_check_symbol(zval **pz TSRMLS_DC)
 
 ZEND_API opcode_handler_t *zend_opcode_handlers;
 
-ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, int 
return_value_used TSRMLS_DC)
+ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, 
zend_fcall_info *fci, int return_value_used TSRMLS_DC)
 {
-       zval **return_value_ptr = &(*(temp_variable *)((char *) 
execute_data_ptr->Ts + execute_data_ptr->opline->result.var)).var.ptr;
-       ((zend_internal_function *) 
execute_data_ptr->function_state.function)->handler(execute_data_ptr->opline->extended_value,
 *return_value_ptr, (execute_data_ptr->function_state.function->common.fn_flags 
& ZEND_ACC_RETURN_REFERENCE)?return_value_ptr:NULL, execute_data_ptr->object, 
return_value_used TSRMLS_CC);
+       if(fci != NULL) {
+               ((zend_internal_function *) 
execute_data_ptr->function_state.function)->handler(fci->param_count,
+                               *fci->retval_ptr_ptr, fci->retval_ptr_ptr, 
fci->object_ptr, 1 TSRMLS_CC);
+
+       } else {
+               zval **return_value_ptr = &(*(temp_variable *)((char *) 
execute_data_ptr->Ts + execute_data_ptr->opline->result.var)).var.ptr;
+               ((zend_internal_function *) 
execute_data_ptr->function_state.function)->handler(execute_data_ptr->opline->extended_value,
 *return_value_ptr,
+                                       
(execute_data_ptr->function_state.function->common.fn_flags & 
ZEND_ACC_RETURN_REFERENCE)?return_value_ptr:NULL,
+                                       execute_data_ptr->object, 
return_value_used TSRMLS_CC);
+       }
 }
 
 #define ZEND_VM_NEXT_OPCODE() \
@@ -1513,7 +1521,7 @@ ZEND_API int zend_set_user_opcode_handler(zend_uchar 
opcode, user_opcode_handler
 {
        if (opcode != ZEND_USER_OPCODE) {
                if (handler == NULL) {
-                       /* restore the original handler */                      
+                       /* restore the original handler */
                        zend_user_opcodes[opcode] = opcode;
                } else {
                        zend_user_opcodes[opcode] = ZEND_USER_OPCODE;
diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h
index 4cfc52b..4594eba 100644
--- a/Zend/zend_execute.h
+++ b/Zend/zend_execute.h
@@ -5,7 +5,7 @@
    | Copyright (c) 1998-2012 Zend Technologies Ltd. (http://www.zend.com) |
    +----------------------------------------------------------------------+
    | This source file is subject to version 2.00 of the Zend license,     |
-   | that is bundled with this package in the file LICENSE, and is        | 
+   | that is bundled with this package in the file LICENSE, and is        |
    | available through the world-wide-web at the following url:           |
    | http://www.zend.com/license/2_00.txt.                                |
    | If you did not receive a copy of the Zend license and are unable to  |
@@ -49,8 +49,9 @@ typedef union _temp_variable {
 
 
 BEGIN_EXTERN_C()
+struct _zend_fcall_info;
 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);
+ZEND_API extern void (*zend_execute_internal)(zend_execute_data 
*execute_data_ptr, struct _zend_fcall_info *fci, int return_value_used 
TSRMLS_DC);
 
 void init_executor(TSRMLS_D);
 void shutdown_executor(TSRMLS_D);
@@ -58,7 +59,7 @@ void shutdown_destructors(TSRMLS_D);
 zend_execute_data *zend_create_execute_data_from_op_array(zend_op_array 
*op_array, zend_bool nested TSRMLS_DC);
 ZEND_API void execute(zend_op_array *op_array TSRMLS_DC);
 ZEND_API void execute_ex(zend_execute_data *execute_data TSRMLS_DC);
-ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, int 
return_value_used TSRMLS_DC);
+ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, struct 
_zend_fcall_info *fci, int return_value_used TSRMLS_DC);
 ZEND_API int zend_is_true(zval *op);
 #define safe_free_zval_ptr(p) safe_free_zval_ptr_rel(p ZEND_FILE_LINE_CC 
ZEND_FILE_LINE_EMPTY_CC)
 static zend_always_inline void safe_free_zval_ptr_rel(zval *p 
ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
@@ -272,7 +273,7 @@ static zend_always_inline void *zend_vm_stack_alloc(size_t 
size TSRMLS_DC)
 }
 
 static zend_always_inline void zend_vm_stack_free_int(void *ptr TSRMLS_DC)
-{      
+{
        if (UNEXPECTED(ZEND_VM_STACK_ELEMETS(EG(argument_stack)) == 
(void**)ptr)) {
                zend_vm_stack p = EG(argument_stack);
 
@@ -284,7 +285,7 @@ static zend_always_inline void zend_vm_stack_free_int(void 
*ptr TSRMLS_DC)
 }
 
 static zend_always_inline void zend_vm_stack_free(void *ptr TSRMLS_DC)
-{      
+{
        if (UNEXPECTED(ZEND_VM_STACK_ELEMETS(EG(argument_stack)) == 
(void**)ptr)) {
                zend_vm_stack p = EG(argument_stack);
 
@@ -304,7 +305,7 @@ static zend_always_inline void zend_vm_stack_free(void *ptr 
TSRMLS_DC)
 static zend_always_inline void** zend_vm_stack_push_args(int count TSRMLS_DC)
 {
 
-       if (UNEXPECTED(EG(argument_stack)->top - 
ZEND_VM_STACK_ELEMETS(EG(argument_stack)) < count)  || 
+       if (UNEXPECTED(EG(argument_stack)->top - 
ZEND_VM_STACK_ELEMETS(EG(argument_stack)) < count)  ||
                UNEXPECTED(EG(argument_stack)->top == EG(argument_stack)->end)) 
{
                zend_vm_stack p = EG(argument_stack);
 
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 271d753..9787966 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -39,7 +39,7 @@
 #endif
 
 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);
+ZEND_API void (*zend_execute_internal)(zend_execute_data *execute_data_ptr, 
zend_fcall_info *fci, int return_value_used TSRMLS_DC);
 
 /* true globals */
 ZEND_API const zend_fcall_info empty_fcall_info = { 0, NULL, NULL, NULL, NULL, 
0, NULL, NULL, 0 };
@@ -976,15 +976,12 @@ int zend_call_function(zend_fcall_info *fci, 
zend_fcall_info_cache *fci_cache TS
                if (EX(function_state).function->common.scope) {
                        EG(scope) = EX(function_state).function->common.scope;
                }
-
-               if (!zend_execute_internal) {
+               if(EXPECTED(zend_execute_internal == NULL)) {
                        /* saves one function call if zend_execute_internal is 
not used */
                        ((zend_internal_function *) 
EX(function_state).function)->handler(fci->param_count, *fci->retval_ptr_ptr, 
fci->retval_ptr_ptr, fci->object_ptr, 1 TSRMLS_CC);
                } else {
-                       zend_execute_internal(&execute_data, 1 TSRMLS_CC);
+                       zend_execute_internal(&execute_data, fci, 1 TSRMLS_CC);
                }
-
-
                /*  We shouldn't fix bad extensions here,
                        because it can break proper ones (Bug #34045)
                if (!EX(function_state).function->common.return_reference)
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index ab5102f..b06c09f 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -2024,7 +2024,7 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
                        /* saves one function call if zend_execute_internal is 
not used */
                        fbc->internal_function.handler(opline->extended_value, 
ret->var.ptr, (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) ? 
&ret->var.ptr : NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC);
                } else {
-                       zend_execute_internal(EXECUTE_DATA, 
RETURN_VALUE_USED(opline) TSRMLS_CC);
+                       zend_execute_internal(EXECUTE_DATA, NULL, 
RETURN_VALUE_USED(opline) TSRMLS_CC);
                }
 
                if (!RETURN_VALUE_USED(opline)) {
@@ -2143,7 +2143,7 @@ ZEND_VM_HELPER_EX(zend_finally_handler_leaving, ANY, ANY, 
int type)
                                        for (i=0; 
i<EX(op_array)->last_try_catch; i++) {
                                                if 
(EX(op_array)->try_catch_array[i].try_op > op_num) {
                                                        break;
-                                               } 
+                                               }
                                                if (op_num < 
EX(op_array)->try_catch_array[i].finally_op) {
                                                        finally_op_num = 
EX(op_array)->try_catch_array[i].finally_op;
                                                }
@@ -2155,7 +2155,7 @@ ZEND_VM_HELPER_EX(zend_finally_handler_leaving, ANY, ANY, 
int type)
                                        for (i=0; 
i<EX(op_array)->last_try_catch; i++) {
                                                if 
(EX(op_array)->try_catch_array[i].try_op > op_num) {
                                                        break;
-                                               } 
+                                               }
                                                if (op_num < 
EX(op_array)->try_catch_array[i].finally_op) {
                                                        finally_op_num = 
EX(op_array)->try_catch_array[i].finally_op;
                                                }
@@ -2199,8 +2199,8 @@ ZEND_VM_HELPER_EX(zend_finally_handler_leaving, ANY, ANY, 
int type)
                  for (i=0; i<EG(active_op_array)->last_try_catch; i++) {
                          if (EG(active_op_array)->try_catch_array[i].try_op > 
op_num) {
                                  break;
-                         } 
-                         if (op_num < 
EG(active_op_array)->try_catch_array[i].finally_op 
+                         }
+                         if (op_num < 
EG(active_op_array)->try_catch_array[i].finally_op
                                          && (EX(leaving_dest) < 
EG(active_op_array)->try_catch_array[i].try_op
                                                  || EX(leaving_dest) >= 
EG(active_op_array)->try_catch_array[i].finally_end)) {
                                  finally_op_num = 
EG(active_op_array)->try_catch_array[i].finally_op;
@@ -5164,7 +5164,7 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
                if (EG(active_op_array)->try_catch_array[i].try_op > op_num) {
                        /* further blocks will not be relevant... */
                        break;
-               } 
+               }
                if (op_num < EG(active_op_array)->try_catch_array[i].catch_op) {
                        catch_op_num = 
EX(op_array)->try_catch_array[i].catch_op;
                        catched = i + 1;
@@ -5242,7 +5242,7 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
                        
ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[finally_op_num]);
                        ZEND_VM_CONTINUE();
                }
-       } else if (catched) { 
+       } else if (catched) {
                EX(leaving) = 0;
                ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[catch_op_num]);
                ZEND_VM_CONTINUE();
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 258a85f..8c4b594 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -648,7 +648,7 @@ static int ZEND_FASTCALL 
zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_AR
                        /* saves one function call if zend_execute_internal is 
not used */
                        fbc->internal_function.handler(opline->extended_value, 
ret->var.ptr, (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) ? 
&ret->var.ptr : NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC);
                } else {
-                       zend_execute_internal(execute_data, 
RETURN_VALUE_USED(opline) TSRMLS_CC);
+                       zend_execute_internal(execute_data, NULL, 
RETURN_VALUE_USED(opline) TSRMLS_CC);
                }
 
                if (!RETURN_VALUE_USED(opline)) {
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to