Commit:    326aa087532d7eaecc8fefff58bb2a0b008b5ac8
Author:    Xinchen Hui <larue...@php.net>         Sat, 25 Aug 2012 21:14:51 
+0800
Parents:   9ab45d3edbafa3ee751472c3f8d1fb3f51f38cf1
Branches:  master

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

Log:
Prefer no finally block for most situations

Changed paths:
  M  Zend/zend_vm_def.h
  M  Zend/zend_vm_execute.h

diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index ce1674e..92c5fcf 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -2173,6 +2173,7 @@ ZEND_VM_HELPER_EX(zend_finally_handler_leaving, ANY, ANY, 
int type)
                                if (catch_op_num && finally_op_num) {
                                        /* EG(exception) || EG(prev_exception) 
*/
                                        if (catch_op_num > finally_op_num) {
+                                               zend_exception_save(TSRMLS_C);
                                                EX(leaving) = ZEND_THROW;
                                                
ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[finally_op_num]);
                                        } else {
@@ -2183,6 +2184,7 @@ ZEND_VM_HELPER_EX(zend_finally_handler_leaving, ANY, ANY, 
int type)
                                        EX(leaving) = 0;
                                        
ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[catch_op_num]);
                                } else if (finally_op_num) {
+                                       zend_exception_save(TSRMLS_C);
                                        if (type != ZEND_LEAVE) {
                                                EX(leaving) = type;
                                        }
@@ -2233,12 +2235,12 @@ ZEND_VM_HANDLER(42, ZEND_JMP, ANY, ANY)
 #if DEBUG_ZEND>=2
        printf("Jumping to %d\n", opline->op1.opline_num);
 #endif
-       if (EX(op_array)->has_finally_block) {
-               EX(leaving_dest) = opline->op1.jmp_addr - EX(op_array)->opcodes;
-               ZEND_VM_DISPATCH_TO_HELPER_EX(zend_finally_handler_leaving, 
type, ZEND_JMP);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               ZEND_VM_SET_OPCODE(opline->op1.jmp_addr);
+               ZEND_VM_CONTINUE(); /* CHECK_ME */
        }
-       ZEND_VM_SET_OPCODE(opline->op1.jmp_addr);
-       ZEND_VM_CONTINUE(); /* CHECK_ME */
+       EX(leaving_dest) = opline->op1.jmp_addr - EX(op_array)->opcodes;
+       ZEND_VM_DISPATCH_TO_HELPER_EX(zend_finally_handler_leaving, type, 
ZEND_JMP);
 }
 
 ZEND_VM_HANDLER(43, ZEND_JMPZ, CONST|TMP|VAR|CV, ANY)
@@ -2975,10 +2977,10 @@ ZEND_VM_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
        }
        FREE_OP1_IF_VAR();
 
-       if (EX(op_array)->has_finally_block) {
-               ZEND_VM_DISPATCH_TO_HELPER_EX(zend_finally_handler_leaving, 
type, ZEND_RETURN);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
        }
-       ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
+       ZEND_VM_DISPATCH_TO_HELPER_EX(zend_finally_handler_leaving, type, 
ZEND_RETURN);
 }
 
 ZEND_VM_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY)
@@ -3051,10 +3053,10 @@ ZEND_VM_HANDLER(111, ZEND_RETURN_BY_REF, 
CONST|TMP|VAR|CV, ANY)
 
        FREE_OP1_IF_VAR();
 
-       if (EX(op_array)->has_finally_block) {
-               ZEND_VM_DISPATCH_TO_HELPER_EX(zend_finally_handler_leaving, 
type, ZEND_RETURN_BY_REF);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
        }
-       ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
+       ZEND_VM_DISPATCH_TO_HELPER_EX(zend_finally_handler_leaving, type, 
ZEND_RETURN_BY_REF);
 }
 
 ZEND_VM_HANDLER(108, ZEND_THROW, CONST|TMP|VAR|CV, ANY)
@@ -3398,11 +3400,11 @@ ZEND_VM_HANDLER(50, ZEND_BRK, ANY, CONST)
        el = zend_brk_cont(Z_LVAL_P(opline->op2.zv), opline->op1.opline_num,
                           EX(op_array), EX_Ts() TSRMLS_CC);
        FREE_OP2();
-       if (EX(op_array)->has_finally_block) {
-               EX(leaving_dest) = el->brk;
-               ZEND_VM_DISPATCH_TO_HELPER_EX(zend_finally_handler_leaving, 
type, ZEND_BRK);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
        }
-       ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
+       EX(leaving_dest) = el->brk;
+       ZEND_VM_DISPATCH_TO_HELPER_EX(zend_finally_handler_leaving, type, 
ZEND_BRK);
 }
 
 ZEND_VM_HANDLER(51, ZEND_CONT, ANY, CONST)
@@ -3414,11 +3416,11 @@ ZEND_VM_HANDLER(51, ZEND_CONT, ANY, CONST)
        el = zend_brk_cont(Z_LVAL_P(opline->op2.zv), opline->op1.opline_num,
                           EX(op_array), EX_Ts() TSRMLS_CC);
        FREE_OP2();
-       if (EG(active_op_array)->has_finally_block) {
-               EX(leaving_dest) = el->cont;
-               ZEND_VM_DISPATCH_TO_HELPER_EX(zend_finally_handler_leaving, 
type, ZEND_CONT);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
        }
-       ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
+       EX(leaving_dest) = el->cont;
+       ZEND_VM_DISPATCH_TO_HELPER_EX(zend_finally_handler_leaving, type, 
ZEND_CONT);
 }
 
 ZEND_VM_HANDLER(100, ZEND_GOTO, ANY, CONST)
@@ -3445,11 +3447,11 @@ ZEND_VM_HANDLER(100, ZEND_GOTO, ANY, CONST)
                        }
                        break;
        }
-       if (EX(op_array)->has_finally_block) {
-               EX(leaving_dest) = opline->op1.jmp_addr - EX(op_array)->opcodes;
-               ZEND_VM_DISPATCH_TO_HELPER_EX(zend_finally_handler_leaving, 
type, ZEND_GOTO);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               ZEND_VM_JMP(opline->op1.jmp_addr);
        }
-       ZEND_VM_JMP(opline->op1.jmp_addr);
+       EX(leaving_dest) = opline->op1.jmp_addr - EX(op_array)->opcodes;
+       ZEND_VM_DISPATCH_TO_HELPER_EX(zend_finally_handler_leaving, type, 
ZEND_GOTO);
 }
 
 ZEND_VM_HANDLER(48, ZEND_CASE, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index bd19124..1e0b2b5 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -760,6 +760,7 @@ static int ZEND_FASTCALL 
zend_finally_handler_leaving_SPEC(int type, ZEND_OPCODE
                                if (catch_op_num && finally_op_num) {
                                        /* EG(exception) || EG(prev_exception) 
*/
                                        if (catch_op_num > finally_op_num) {
+                                               zend_exception_save(TSRMLS_C);
                                                EX(leaving) = ZEND_THROW;
                                                
ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[finally_op_num]);
                                        } else {
@@ -770,6 +771,7 @@ static int ZEND_FASTCALL 
zend_finally_handler_leaving_SPEC(int type, ZEND_OPCODE
                                        EX(leaving) = 0;
                                        
ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[catch_op_num]);
                                } else if (finally_op_num) {
+                                       zend_exception_save(TSRMLS_C);
                                        if (type != ZEND_LEAVE) {
                                                EX(leaving) = type;
                                        }
@@ -820,12 +822,12 @@ static int ZEND_FASTCALL  
ZEND_JMP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 #if DEBUG_ZEND>=2
        printf("Jumping to %d\n", opline->op1.opline_num);
 #endif
-       if (EX(op_array)->has_finally_block) {
-               EX(leaving_dest) = opline->op1.jmp_addr - EX(op_array)->opcodes;
-               return zend_finally_handler_leaving_SPEC(ZEND_JMP, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               ZEND_VM_SET_OPCODE(opline->op1.jmp_addr);
+               ZEND_VM_CONTINUE(); /* CHECK_ME */
        }
-       ZEND_VM_SET_OPCODE(opline->op1.jmp_addr);
-       ZEND_VM_CONTINUE(); /* CHECK_ME */
+       EX(leaving_dest) = opline->op1.jmp_addr - EX(op_array)->opcodes;
+       return zend_finally_handler_leaving_SPEC(ZEND_JMP, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
 static int ZEND_FASTCALL  
ZEND_INIT_STRING_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -1530,11 +1532,11 @@ static int ZEND_FASTCALL  
ZEND_BRK_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        el = zend_brk_cont(Z_LVAL_P(opline->op2.zv), opline->op1.opline_num,
                           EX(op_array), EX_Ts() TSRMLS_CC);
 
-       if (EX(op_array)->has_finally_block) {
-               EX(leaving_dest) = el->brk;
-               return zend_finally_handler_leaving_SPEC(ZEND_BRK, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
        }
-       ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
+       EX(leaving_dest) = el->brk;
+       return zend_finally_handler_leaving_SPEC(ZEND_BRK, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
 static int ZEND_FASTCALL  
ZEND_CONT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -1546,11 +1548,11 @@ static int ZEND_FASTCALL  
ZEND_CONT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        el = zend_brk_cont(Z_LVAL_P(opline->op2.zv), opline->op1.opline_num,
                           EX(op_array), EX_Ts() TSRMLS_CC);
 
-       if (EG(active_op_array)->has_finally_block) {
-               EX(leaving_dest) = el->cont;
-               return zend_finally_handler_leaving_SPEC(ZEND_CONT, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
        }
-       ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
+       EX(leaving_dest) = el->cont;
+       return zend_finally_handler_leaving_SPEC(ZEND_CONT, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
 static int ZEND_FASTCALL  
ZEND_GOTO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -1577,11 +1579,11 @@ static int ZEND_FASTCALL  
ZEND_GOTO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                        }
                        break;
        }
-       if (EX(op_array)->has_finally_block) {
-               EX(leaving_dest) = opline->op1.jmp_addr - EX(op_array)->opcodes;
-               return zend_finally_handler_leaving_SPEC(ZEND_GOTO, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               ZEND_VM_JMP(opline->op1.jmp_addr);
        }
-       ZEND_VM_JMP(opline->op1.jmp_addr);
+       EX(leaving_dest) = opline->op1.jmp_addr - EX(op_array)->opcodes;
+       return zend_finally_handler_leaving_SPEC(ZEND_GOTO, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
 static int ZEND_FASTCALL  
ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -2432,10 +2434,10 @@ static int ZEND_FASTCALL  
ZEND_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARG
                *EG(return_value_ptr_ptr) = ret;
        }
 
-       if (EX(op_array)->has_finally_block) {
-               return zend_finally_handler_leaving_SPEC(ZEND_RETURN, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               return 
zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
        }
-       return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       return zend_finally_handler_leaving_SPEC(ZEND_RETURN, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
 static int ZEND_FASTCALL  
ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -2506,10 +2508,10 @@ static int ZEND_FASTCALL  
ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER(ZEND_OPCODE_HAND
                }
        } while (0);
 
-       if (EX(op_array)->has_finally_block) {
-               return zend_finally_handler_leaving_SPEC(ZEND_RETURN_BY_REF, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               return 
zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
        }
-       return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       return zend_finally_handler_leaving_SPEC(ZEND_RETURN_BY_REF, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
 static int ZEND_FASTCALL  
ZEND_THROW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -6982,10 +6984,10 @@ static int ZEND_FASTCALL  
ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                *EG(return_value_ptr_ptr) = ret;
        }
 
-       if (EX(op_array)->has_finally_block) {
-               return zend_finally_handler_leaving_SPEC(ZEND_RETURN, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               return 
zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
        }
-       return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       return zend_finally_handler_leaving_SPEC(ZEND_RETURN, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
 static int ZEND_FASTCALL  
ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -7056,10 +7058,10 @@ static int ZEND_FASTCALL  
ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLE
                }
        } while (0);
 
-       if (EX(op_array)->has_finally_block) {
-               return zend_finally_handler_leaving_SPEC(ZEND_RETURN_BY_REF, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               return 
zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
        }
-       return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       return zend_finally_handler_leaving_SPEC(ZEND_RETURN_BY_REF, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
 static int ZEND_FASTCALL  ZEND_THROW_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -11438,10 +11440,10 @@ static int ZEND_FASTCALL  
ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        }
        if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 
-       if (EX(op_array)->has_finally_block) {
-               return zend_finally_handler_leaving_SPEC(ZEND_RETURN, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               return 
zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
        }
-       return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       return zend_finally_handler_leaving_SPEC(ZEND_RETURN, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
 static int ZEND_FASTCALL  
ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -11514,10 +11516,10 @@ static int ZEND_FASTCALL  
ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLE
 
        if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 
-       if (EX(op_array)->has_finally_block) {
-               return zend_finally_handler_leaving_SPEC(ZEND_RETURN_BY_REF, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               return 
zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
        }
-       return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       return zend_finally_handler_leaving_SPEC(ZEND_RETURN_BY_REF, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
 static int ZEND_FASTCALL  ZEND_THROW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -27457,10 +27459,10 @@ static int ZEND_FASTCALL  
ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                *EG(return_value_ptr_ptr) = ret;
        }
 
-       if (EX(op_array)->has_finally_block) {
-               return zend_finally_handler_leaving_SPEC(ZEND_RETURN, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               return 
zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
        }
-       return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       return zend_finally_handler_leaving_SPEC(ZEND_RETURN, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
 static int ZEND_FASTCALL  
ZEND_RETURN_BY_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -27531,10 +27533,10 @@ static int ZEND_FASTCALL  
ZEND_RETURN_BY_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER
                }
        } while (0);
 
-       if (EX(op_array)->has_finally_block) {
-               return zend_finally_handler_leaving_SPEC(ZEND_RETURN_BY_REF, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       if (EXPECTED(!EX(op_array)->has_finally_block)) {
+               return 
zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
        }
-       return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+       return zend_finally_handler_leaving_SPEC(ZEND_RETURN_BY_REF, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
 static int ZEND_FASTCALL  ZEND_THROW_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to