cvs: ZendEngine2(PHP_5_1) / zend_execute.c zend_vm_def.h zend_vm_execute.h /tests bug35017.phpt php-src NEWS
| From: | Dmitry Stogov | Date: | Mon, 31 Oct 2005 19:25:16 +0000 |
| Subject: | cvs: ZendEngine2(PHP_5_1) / zend_execute.c zend_vm_def.h zend_vm_execute.h /tests bug35017.phpt php-src NEWS | ||
| Groups: | php.zend-engine.cvs | ||
| Request: | Send a blank email to php-zend-engine-cvs+get-4297@lists.php.net to get a copy of this message | ||
dmitry Mon Oct 31 14:25:16 2005 EDT
Added files: (Branch: PHP_5_1)
/ZendEngine2/tests bug35017.phpt
Modified files:
/php-src NEWS
/ZendEngine2 zend_execute.c zend_vm_def.h zend_vm_execute.h
Log:
Fixed bug #35017 (Exception thrown in error handler may cause unexpected behavior)
http://cvs.php.net/diff.php/php-src/NEWS?r1=1.2027.2.171&r2=1.2027.2.172&ty=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.171 php-src/NEWS:1.2027.2.172 --- php-src/NEWS:1.2027.2.171 Sun Oct 30 19:11:42 2005 +++ php-src/NEWS Mon Oct 31 14:25:00 2005 @@ -3,6 +3,8 @@ ?? Nov 2005, PHP 5.1 - Fixed bugs #35022, #35019 (Regression in the behavior of key() and current() functions). (Ilia) +- Fixed bug #35017 (Exception thrown in error handler may cause unexpected + behavior). (Dmitry) - Fixed bug #35014 (array_product() always returns 0). (Ilia) 28 Oct 2005, PHP 5.1 Release Candidate 4 http://cvs.php.net/diff.php/ZendEngine2/zend_execute.c?r1=1.716.2.4&r2=1.716.2.5&ty=u Index: ZendEngine2/zend_execute.c diff -u ZendEngine2/zend_execute.c:1.716.2.4 ZendEngine2/zend_execute.c:1.716.2.5 --- ZendEngine2/zend_execute.c:1.716.2.4 Thu Sep 15 09:10:31 2005 +++ ZendEngine2/zend_execute.c Mon Oct 31 14:25:03 2005 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute.c,v 1.716.2.4 2005/09/15 13:10:31 sniper Exp $ */ +/* $Id: zend_execute.c,v 1.716.2.5 2005/10/31 19:25:03 dmitry Exp $ */ #define ZEND_INTENSIVE_DEBUGGING 0 @@ -1371,6 +1371,11 @@ CHECK_SYMBOL_TABLES() \ EX(opline) = new_op +#define ZEND_VM_JMP(new_op) \ + CHECK_SYMBOL_TABLES() \ + EX(opline) = EG(exception)?EX(opline)+1:new_op; \ + ZEND_VM_CONTINUE() + #define ZEND_VM_INC_OPCODE() \ if (!EG(exception)) { \ CHECK_SYMBOL_TABLES() \ @@ -1388,9 +1393,6 @@ EG(current_execute_data) = EX(prev_execute_data); \ ZEND_VM_RETURN() -#define ZEND_VM_CONTINUE_JMP() \ - ZEND_VM_CONTINUE() - #include "zend_vm_execute.h" ZEND_API int zend_set_user_opcode_handler(zend_uchar opcode, opcode_handler_t handler) http://cvs.php.net/diff.php/ZendEngine2/zend_vm_def.h?r1=1.59.2.18&r2=1.59.2.19&ty=u Index: ZendEngine2/zend_vm_def.h diff -u ZendEngine2/zend_vm_def.h:1.59.2.18 ZendEngine2/zend_vm_def.h:1.59.2.19 --- ZendEngine2/zend_vm_def.h:1.59.2.18 Fri Oct 28 02:05:54 2005 +++ ZendEngine2/zend_vm_def.h Mon Oct 31 14:25:10 2005 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_vm_def.h,v 1.59.2.18 2005/10/28 06:05:54 dmitry Exp $ */ +/* $Id: zend_vm_def.h,v 1.59.2.19 2005/10/31 19:25:10 dmitry Exp $ */ /* If you change this file, please regenerate the zend_vm_execute.h and * zend_vm_opcodes.h files by running: @@ -1438,8 +1438,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -1456,8 +1455,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -1474,14 +1472,12 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp on true to %d\n", opline->extended_value); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->extended_value]); } else { #if DEBUG_ZEND>=2 printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.u.opline_num]); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->op2.u.opline_num]); } } @@ -1498,8 +1494,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -1517,8 +1512,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -2339,26 +2333,24 @@ { zend_op *opline = EX(opline); zend_free_op free_op2; + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(GET_OP2_ZVAL_PTR(BP_VAR_R), - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->brk); + el = zend_brk_cont(GET_OP2_ZVAL_PTR(BP_VAR_R), opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); FREE_OP2(); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->brk); } ZEND_VM_HANDLER(51, ZEND_CONT, ANY, CONST|TMP|VAR|CV) { zend_op *opline = EX(opline); zend_free_op free_op2; + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(GET_OP2_ZVAL_PTR(BP_VAR_R), - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->cont); + el = zend_brk_cont(GET_OP2_ZVAL_PTR(BP_VAR_R), opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); FREE_OP2(); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->cont); } ZEND_VM_HANDLER(48, ZEND_CASE, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV) @@ -2428,8 +2420,7 @@ } else { zval_ptr_dtor(&object_zval); } - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes + opline->op2.u.opline_num); } else { SELECTIVE_PZVAL_LOCK(object_zval, &opline->result); EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; @@ -2976,8 +2967,7 @@ } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) { if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) { zend_error(E_WARNING, "foreach() can not iterate over objects without PHP class"); - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } ce = Z_OBJCE_PP(array_ptr_ptr); @@ -3072,8 +3062,7 @@ FREE_OP1_IF_VAR(); } if (is_empty) { - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } else { ZEND_VM_NEXT_OPCODE(); } @@ -3099,8 +3088,7 @@ default: case ZEND_ITER_INVALID: zend_error(E_WARNING, "Invalid argument supplied for foreach()"); - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); case ZEND_ITER_PLAIN_OBJECT: { char *class_name, *prop_name; @@ -3110,8 +3098,7 @@ do { if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) { /* reached end of iteration */ - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL); @@ -3130,8 +3117,7 @@ fe_ht = HASH_OF(array); if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) { /* reached end of iteration */ - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } if (use_key) { key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 1, NULL); @@ -3158,8 +3144,7 @@ zval_ptr_dtor(&array); ZEND_VM_NEXT_OPCODE(); } - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } iter->funcs->get_current_data(iter, &value TSRMLS_CC); if (EG(exception)) { @@ -3169,8 +3154,7 @@ } if (!value) { /* failure in get_current_data */ - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } if (use_key) { if (iter->funcs->get_current_key) { http://cvs.php.net/diff.php/ZendEngine2/zend_vm_execute.h?r1=1.62.2.18&r2=1.62.2.19&ty=u Index: ZendEngine2/zend_vm_execute.h diff -u ZendEngine2/zend_vm_execute.h:1.62.2.18 ZendEngine2/zend_vm_execute.h:1.62.2.19 --- ZendEngine2/zend_vm_execute.h:1.62.2.18 Fri Oct 28 02:05:54 2005 +++ ZendEngine2/zend_vm_execute.h Mon Oct 31 14:25:11 2005 @@ -403,8 +403,7 @@ } else { zval_ptr_dtor(&object_zval); } - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes + opline->op2.u.opline_num); } else { SELECTIVE_PZVAL_LOCK(object_zval, &opline->result); EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; @@ -765,26 +764,24 @@ { zend_op *opline = EX(opline); + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(&opline->op2.u.constant, - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->brk); + el = zend_brk_cont(&opline->op2.u.constant, opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->brk); } static int ZEND_CONT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(&opline->op2.u.constant, - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->cont); + el = zend_brk_cont(&opline->op2.u.constant, opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->cont); } static int ZEND_FETCH_CLASS_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -916,26 +913,24 @@ { zend_op *opline = EX(opline); zend_free_op free_op2; + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->brk); + el = zend_brk_cont(_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); zval_dtor(free_op2.var); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->brk); } static int ZEND_CONT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); zend_free_op free_op2; + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->cont); + el = zend_brk_cont(_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); zval_dtor(free_op2.var); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->cont); } static int ZEND_FETCH_CLASS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1067,26 +1062,24 @@ { zend_op *opline = EX(opline); zend_free_op free_op2; + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->brk); + el = zend_brk_cont(_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->brk); } static int ZEND_CONT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); zend_free_op free_op2; + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->cont); + el = zend_brk_cont(_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->cont); } static int ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1298,26 +1291,24 @@ { zend_op *opline = EX(opline); + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC), - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->brk); + el = zend_brk_cont(_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC), opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->brk); } static int ZEND_CONT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC), - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->cont); + el = zend_brk_cont(_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC), opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->cont); } static int ZEND_BW_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1496,8 +1487,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -1513,8 +1503,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -1530,14 +1519,12 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp on true to %d\n", opline->extended_value); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->extended_value]); } else { #if DEBUG_ZEND>=2 printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.u.opline_num]); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->op2.u.opline_num]); } } @@ -1553,8 +1540,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -1571,8 +1557,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -2026,8 +2011,7 @@ } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) { if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) { zend_error(E_WARNING, "foreach() can not iterate over objects without PHP class"); - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } ce = Z_OBJCE_PP(array_ptr_ptr); @@ -2122,8 +2106,7 @@ } if (is_empty) { - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } else { ZEND_VM_NEXT_OPCODE(); } @@ -3914,8 +3897,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -3932,8 +3914,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -3950,14 +3931,12 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp on true to %d\n", opline->extended_value); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->extended_value]); } else { #if DEBUG_ZEND>=2 printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.u.opline_num]); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->op2.u.opline_num]); } } @@ -3974,8 +3953,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -3993,8 +3971,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -4445,8 +4422,7 @@ } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) { if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) { zend_error(E_WARNING, "foreach() can not iterate over objects without PHP class"); - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } ce = Z_OBJCE_PP(array_ptr_ptr); @@ -4541,8 +4517,7 @@ } if (is_empty) { - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } else { ZEND_VM_NEXT_OPCODE(); } @@ -6824,8 +6799,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -6842,8 +6816,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -6860,14 +6833,12 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp on true to %d\n", opline->extended_value); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->extended_value]); } else { #if DEBUG_ZEND>=2 printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.u.opline_num]); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->op2.u.opline_num]); } } @@ -6884,8 +6855,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -6903,8 +6873,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -7445,8 +7414,7 @@ } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) { if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) { zend_error(E_WARNING, "foreach() can not iterate over objects without PHP class"); - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } ce = Z_OBJCE_PP(array_ptr_ptr); @@ -7541,8 +7509,7 @@ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; } if (is_empty) { - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } else { ZEND_VM_NEXT_OPCODE(); } @@ -7568,8 +7535,7 @@ default: case ZEND_ITER_INVALID: zend_error(E_WARNING, "Invalid argument supplied for foreach()"); - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); case ZEND_ITER_PLAIN_OBJECT: { char *class_name, *prop_name; @@ -7579,8 +7545,7 @@ do { if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) { /* reached end of iteration */ - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL); @@ -7599,8 +7564,7 @@ fe_ht = HASH_OF(array); if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) { /* reached end of iteration */ - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } if (use_key) { key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 1, NULL); @@ -7627,8 +7591,7 @@ zval_ptr_dtor(&array); ZEND_VM_NEXT_OPCODE(); } - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } iter->funcs->get_current_data(iter, &value TSRMLS_CC); if (EG(exception)) { @@ -7638,8 +7601,7 @@ } if (!value) { /* failure in get_current_data */ - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } if (use_key) { if (iter->funcs->get_current_key) { @@ -18938,8 +18900,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -18955,8 +18916,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -18972,14 +18932,12 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp on true to %d\n", opline->extended_value); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->extended_value]); } else { #if DEBUG_ZEND>=2 printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.u.opline_num]); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->op2.u.opline_num]); } } @@ -18995,8 +18953,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -19013,8 +18970,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -19547,8 +19503,7 @@ } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) { if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) { zend_error(E_WARNING, "foreach() can not iterate over objects without PHP class"); - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } ce = Z_OBJCE_PP(array_ptr_ptr); @@ -19643,8 +19598,7 @@ } if (is_empty) { - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } else { ZEND_VM_NEXT_OPCODE(); } http://cvs.php.net/co.php/ZendEngine2/tests/bug35017.phpt?r=1.1&p=1 Index: ZendEngine2/tests/bug35017.phpt +++ ZendEngine2/tests/bug35017.phpt
http://cvs.php.net/diff.php/php-src/NEWS?r1=1.2027.2.171&r2=1.2027.2.172&ty=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.171 php-src/NEWS:1.2027.2.172 --- php-src/NEWS:1.2027.2.171 Sun Oct 30 19:11:42 2005 +++ php-src/NEWS Mon Oct 31 14:25:00 2005 @@ -3,6 +3,8 @@ ?? Nov 2005, PHP 5.1 - Fixed bugs #35022, #35019 (Regression in the behavior of key() and current() functions). (Ilia) +- Fixed bug #35017 (Exception thrown in error handler may cause unexpected + behavior). (Dmitry) - Fixed bug #35014 (array_product() always returns 0). (Ilia) 28 Oct 2005, PHP 5.1 Release Candidate 4 http://cvs.php.net/diff.php/ZendEngine2/zend_execute.c?r1=1.716.2.4&r2=1.716.2.5&ty=u Index: ZendEngine2/zend_execute.c diff -u ZendEngine2/zend_execute.c:1.716.2.4 ZendEngine2/zend_execute.c:1.716.2.5 --- ZendEngine2/zend_execute.c:1.716.2.4 Thu Sep 15 09:10:31 2005 +++ ZendEngine2/zend_execute.c Mon Oct 31 14:25:03 2005 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute.c,v 1.716.2.4 2005/09/15 13:10:31 sniper Exp $ */ +/* $Id: zend_execute.c,v 1.716.2.5 2005/10/31 19:25:03 dmitry Exp $ */ #define ZEND_INTENSIVE_DEBUGGING 0 @@ -1371,6 +1371,11 @@ CHECK_SYMBOL_TABLES() \ EX(opline) = new_op +#define ZEND_VM_JMP(new_op) \ + CHECK_SYMBOL_TABLES() \ + EX(opline) = EG(exception)?EX(opline)+1:new_op; \ + ZEND_VM_CONTINUE() + #define ZEND_VM_INC_OPCODE() \ if (!EG(exception)) { \ CHECK_SYMBOL_TABLES() \ @@ -1388,9 +1393,6 @@ EG(current_execute_data) = EX(prev_execute_data); \ ZEND_VM_RETURN() -#define ZEND_VM_CONTINUE_JMP() \ - ZEND_VM_CONTINUE() - #include "zend_vm_execute.h" ZEND_API int zend_set_user_opcode_handler(zend_uchar opcode, opcode_handler_t handler) http://cvs.php.net/diff.php/ZendEngine2/zend_vm_def.h?r1=1.59.2.18&r2=1.59.2.19&ty=u Index: ZendEngine2/zend_vm_def.h diff -u ZendEngine2/zend_vm_def.h:1.59.2.18 ZendEngine2/zend_vm_def.h:1.59.2.19 --- ZendEngine2/zend_vm_def.h:1.59.2.18 Fri Oct 28 02:05:54 2005 +++ ZendEngine2/zend_vm_def.h Mon Oct 31 14:25:10 2005 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_vm_def.h,v 1.59.2.18 2005/10/28 06:05:54 dmitry Exp $ */ +/* $Id: zend_vm_def.h,v 1.59.2.19 2005/10/31 19:25:10 dmitry Exp $ */ /* If you change this file, please regenerate the zend_vm_execute.h and * zend_vm_opcodes.h files by running: @@ -1438,8 +1438,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -1456,8 +1455,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -1474,14 +1472,12 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp on true to %d\n", opline->extended_value); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->extended_value]); } else { #if DEBUG_ZEND>=2 printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.u.opline_num]); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->op2.u.opline_num]); } } @@ -1498,8 +1494,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -1517,8 +1512,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -2339,26 +2333,24 @@ { zend_op *opline = EX(opline); zend_free_op free_op2; + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(GET_OP2_ZVAL_PTR(BP_VAR_R), - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->brk); + el = zend_brk_cont(GET_OP2_ZVAL_PTR(BP_VAR_R), opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); FREE_OP2(); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->brk); } ZEND_VM_HANDLER(51, ZEND_CONT, ANY, CONST|TMP|VAR|CV) { zend_op *opline = EX(opline); zend_free_op free_op2; + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(GET_OP2_ZVAL_PTR(BP_VAR_R), - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->cont); + el = zend_brk_cont(GET_OP2_ZVAL_PTR(BP_VAR_R), opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); FREE_OP2(); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->cont); } ZEND_VM_HANDLER(48, ZEND_CASE, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV) @@ -2428,8 +2420,7 @@ } else { zval_ptr_dtor(&object_zval); } - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes + opline->op2.u.opline_num); } else { SELECTIVE_PZVAL_LOCK(object_zval, &opline->result); EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; @@ -2976,8 +2967,7 @@ } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) { if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) { zend_error(E_WARNING, "foreach() can not iterate over objects without PHP class"); - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } ce = Z_OBJCE_PP(array_ptr_ptr); @@ -3072,8 +3062,7 @@ FREE_OP1_IF_VAR(); } if (is_empty) { - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } else { ZEND_VM_NEXT_OPCODE(); } @@ -3099,8 +3088,7 @@ default: case ZEND_ITER_INVALID: zend_error(E_WARNING, "Invalid argument supplied for foreach()"); - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); case ZEND_ITER_PLAIN_OBJECT: { char *class_name, *prop_name; @@ -3110,8 +3098,7 @@ do { if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) { /* reached end of iteration */ - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL); @@ -3130,8 +3117,7 @@ fe_ht = HASH_OF(array); if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) { /* reached end of iteration */ - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } if (use_key) { key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 1, NULL); @@ -3158,8 +3144,7 @@ zval_ptr_dtor(&array); ZEND_VM_NEXT_OPCODE(); } - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } iter->funcs->get_current_data(iter, &value TSRMLS_CC); if (EG(exception)) { @@ -3169,8 +3154,7 @@ } if (!value) { /* failure in get_current_data */ - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } if (use_key) { if (iter->funcs->get_current_key) { http://cvs.php.net/diff.php/ZendEngine2/zend_vm_execute.h?r1=1.62.2.18&r2=1.62.2.19&ty=u Index: ZendEngine2/zend_vm_execute.h diff -u ZendEngine2/zend_vm_execute.h:1.62.2.18 ZendEngine2/zend_vm_execute.h:1.62.2.19 --- ZendEngine2/zend_vm_execute.h:1.62.2.18 Fri Oct 28 02:05:54 2005 +++ ZendEngine2/zend_vm_execute.h Mon Oct 31 14:25:11 2005 @@ -403,8 +403,7 @@ } else { zval_ptr_dtor(&object_zval); } - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes + opline->op2.u.opline_num); } else { SELECTIVE_PZVAL_LOCK(object_zval, &opline->result); EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; @@ -765,26 +764,24 @@ { zend_op *opline = EX(opline); + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(&opline->op2.u.constant, - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->brk); + el = zend_brk_cont(&opline->op2.u.constant, opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->brk); } static int ZEND_CONT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(&opline->op2.u.constant, - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->cont); + el = zend_brk_cont(&opline->op2.u.constant, opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->cont); } static int ZEND_FETCH_CLASS_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -916,26 +913,24 @@ { zend_op *opline = EX(opline); zend_free_op free_op2; + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->brk); + el = zend_brk_cont(_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); zval_dtor(free_op2.var); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->brk); } static int ZEND_CONT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); zend_free_op free_op2; + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->cont); + el = zend_brk_cont(_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); zval_dtor(free_op2.var); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->cont); } static int ZEND_FETCH_CLASS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1067,26 +1062,24 @@ { zend_op *opline = EX(opline); zend_free_op free_op2; + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->brk); + el = zend_brk_cont(_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->brk); } static int ZEND_CONT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); zend_free_op free_op2; + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->cont); + el = zend_brk_cont(_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->cont); } static int ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1298,26 +1291,24 @@ { zend_op *opline = EX(opline); + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC), - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->brk); + el = zend_brk_cont(_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC), opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->brk); } static int ZEND_CONT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); + zend_brk_cont_element *el; - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes + - zend_brk_cont(_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC), - opline->op1.u.opline_num, - EX(op_array), EX(Ts) TSRMLS_CC)->cont); + el = zend_brk_cont(_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC), opline->op1.u.opline_num, + EX(op_array), EX(Ts) TSRMLS_CC); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(EX(op_array)->opcodes + el->cont); } static int ZEND_BW_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -1496,8 +1487,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -1513,8 +1503,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -1530,14 +1519,12 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp on true to %d\n", opline->extended_value); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->extended_value]); } else { #if DEBUG_ZEND>=2 printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.u.opline_num]); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->op2.u.opline_num]); } } @@ -1553,8 +1540,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -1571,8 +1557,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -2026,8 +2011,7 @@ } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) { if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) { zend_error(E_WARNING, "foreach() can not iterate over objects without PHP class"); - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } ce = Z_OBJCE_PP(array_ptr_ptr); @@ -2122,8 +2106,7 @@ } if (is_empty) { - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } else { ZEND_VM_NEXT_OPCODE(); } @@ -3914,8 +3897,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -3932,8 +3914,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -3950,14 +3931,12 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp on true to %d\n", opline->extended_value); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->extended_value]); } else { #if DEBUG_ZEND>=2 printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.u.opline_num]); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->op2.u.opline_num]); } } @@ -3974,8 +3953,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -3993,8 +3971,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -4445,8 +4422,7 @@ } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) { if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) { zend_error(E_WARNING, "foreach() can not iterate over objects without PHP class"); - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } ce = Z_OBJCE_PP(array_ptr_ptr); @@ -4541,8 +4517,7 @@ } if (is_empty) { - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } else { ZEND_VM_NEXT_OPCODE(); } @@ -6824,8 +6799,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -6842,8 +6816,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -6860,14 +6833,12 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp on true to %d\n", opline->extended_value); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->extended_value]); } else { #if DEBUG_ZEND>=2 printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.u.opline_num]); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->op2.u.opline_num]); } } @@ -6884,8 +6855,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -6903,8 +6873,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -7445,8 +7414,7 @@ } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) { if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) { zend_error(E_WARNING, "foreach() can not iterate over objects without PHP class"); - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } ce = Z_OBJCE_PP(array_ptr_ptr); @@ -7541,8 +7509,7 @@ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; } if (is_empty) { - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } else { ZEND_VM_NEXT_OPCODE(); } @@ -7568,8 +7535,7 @@ default: case ZEND_ITER_INVALID: zend_error(E_WARNING, "Invalid argument supplied for foreach()"); - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); case ZEND_ITER_PLAIN_OBJECT: { char *class_name, *prop_name; @@ -7579,8 +7545,7 @@ do { if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) { /* reached end of iteration */ - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL); @@ -7599,8 +7564,7 @@ fe_ht = HASH_OF(array); if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) { /* reached end of iteration */ - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } if (use_key) { key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 1, NULL); @@ -7627,8 +7591,7 @@ zval_ptr_dtor(&array); ZEND_VM_NEXT_OPCODE(); } - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } iter->funcs->get_current_data(iter, &value TSRMLS_CC); if (EG(exception)) { @@ -7638,8 +7601,7 @@ } if (!value) { /* failure in get_current_data */ - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } if (use_key) { if (iter->funcs->get_current_key) { @@ -18938,8 +18900,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -18955,8 +18916,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); @@ -18972,14 +18932,12 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp on true to %d\n", opline->extended_value); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]); - ZEND_VM_CONTINUE(); /* CHECK_ME */ + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->extended_value]); } else { #if DEBUG_ZEND>=2 printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.u.opline_num]); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(&EX(op_array)->opcodes[opline->op2.u.opline_num]); } } @@ -18995,8 +18953,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -19013,8 +18970,7 @@ #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", opline->op2.u.opline_num); #endif - ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(opline->op2.u.jmp_addr); } ZEND_VM_NEXT_OPCODE(); } @@ -19547,8 +19503,7 @@ } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) { if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) { zend_error(E_WARNING, "foreach() can not iterate over objects without PHP class"); - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } ce = Z_OBJCE_PP(array_ptr_ptr); @@ -19643,8 +19598,7 @@ } if (is_empty) { - ZEND_VM_SET_OPCODE(EX(op_array)->opcodes+opline->op2.u.opline_num); - ZEND_VM_CONTINUE_JMP(); + ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num); } else { ZEND_VM_NEXT_OPCODE(); } http://cvs.php.net/co.php/ZendEngine2/tests/bug35017.phpt?r=1.1&p=1 Index: ZendEngine2/tests/bug35017.phpt +++ ZendEngine2/tests/bug35017.phpt