From 372d59b6489d6210af597818b0f827d37da71da9 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 31 Oct 2005 19:29:48 +0000 Subject: [PATCH] Fixed bug #35017 (Exception thrown in error handler may cause unexpected behavior) --- Zend/tests/bug35017.phpt | 21 +++++ Zend/zend_execute.c | 8 +- Zend/zend_vm_def.h | 60 +++++-------- Zend/zend_vm_execute.h | 186 +++++++++++++++------------------------ 4 files changed, 118 insertions(+), 157 deletions(-) create mode 100755 Zend/tests/bug35017.phpt diff --git a/Zend/tests/bug35017.phpt b/Zend/tests/bug35017.phpt new file mode 100755 index 0000000000..0a89d23aa1 --- /dev/null +++ b/Zend/tests/bug35017.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #35017 (Exception thrown in error handler may cause unexpected behavior) +--FILE-- + +--EXPECT-- +This Exception should be catched diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 6ac9ccf28c..8b399e0a65 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1473,6 +1473,11 @@ ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, int return_v 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() \ @@ -1490,9 +1495,6 @@ ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, int return_v 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) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index acd6ae2944..b259566bd0 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1457,8 +1457,7 @@ ZEND_VM_HANDLER(43, ZEND_JMPZ, CONST|TMP|VAR|CV, ANY) #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(); @@ -1475,8 +1474,7 @@ ZEND_VM_HANDLER(44, ZEND_JMPNZ, CONST|TMP|VAR|CV, ANY) #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(); @@ -1493,14 +1491,12 @@ ZEND_VM_HANDLER(45, ZEND_JMPZNZ, CONST|TMP|VAR|CV, ANY) #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]); } } @@ -1517,8 +1513,7 @@ ZEND_VM_HANDLER(46, ZEND_JMPZ_EX, CONST|TMP|VAR|CV, ANY) #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(); } @@ -1536,8 +1531,7 @@ ZEND_VM_HANDLER(47, ZEND_JMPNZ_EX, CONST|TMP|VAR|CV, ANY) #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(); } @@ -2372,26 +2366,24 @@ ZEND_VM_HANDLER(50, ZEND_BRK, 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)->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) @@ -2461,8 +2453,7 @@ ZEND_VM_HANDLER(68, ZEND_NEW, ANY, ANY) } 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; @@ -3061,8 +3052,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY) } 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); @@ -3160,8 +3150,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY) 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(); } @@ -3187,8 +3176,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY) 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; @@ -3198,8 +3186,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY) 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); @@ -3223,8 +3210,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY) 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); @@ -3251,8 +3237,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY) 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)) { @@ -3262,8 +3247,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY) } 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) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 76b83dd6dd..79d0e6a54b 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -412,8 +412,7 @@ static int ZEND_NEW_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } 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; @@ -773,26 +772,24 @@ static int ZEND_BRK_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)->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) @@ -923,26 +920,24 @@ static int ZEND_BRK_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)->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) @@ -1073,26 +1068,24 @@ static int ZEND_BRK_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)->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) @@ -1303,26 +1296,24 @@ static int ZEND_BRK_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)->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) @@ -1520,8 +1511,7 @@ static int ZEND_JMPZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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(); @@ -1537,8 +1527,7 @@ static int ZEND_JMPNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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(); @@ -1554,14 +1543,12 @@ static int ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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]); } } @@ -1577,8 +1564,7 @@ static int ZEND_JMPZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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(); } @@ -1595,8 +1581,7 @@ static int ZEND_JMPNZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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(); } @@ -2072,8 +2057,7 @@ static int ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } 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); @@ -2171,8 +2155,7 @@ static int ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } 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(); } @@ -4029,8 +4012,7 @@ static int ZEND_JMPZ_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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(); @@ -4047,8 +4029,7 @@ static int ZEND_JMPNZ_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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(); @@ -4065,14 +4046,12 @@ static int ZEND_JMPZNZ_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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]); } } @@ -4089,8 +4068,7 @@ static int ZEND_JMPZ_EX_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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(); } @@ -4108,8 +4086,7 @@ static int ZEND_JMPNZ_EX_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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(); } @@ -4581,8 +4558,7 @@ static int ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } 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); @@ -4680,8 +4656,7 @@ static int ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } 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(); } @@ -7044,8 +7019,7 @@ static int ZEND_JMPZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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(); @@ -7062,8 +7036,7 @@ static int ZEND_JMPNZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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(); @@ -7080,14 +7053,12 @@ static int ZEND_JMPZNZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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]); } } @@ -7104,8 +7075,7 @@ static int ZEND_JMPZ_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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(); } @@ -7123,8 +7093,7 @@ static int ZEND_JMPNZ_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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(); } @@ -7686,8 +7655,7 @@ static int ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } 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); @@ -7785,8 +7753,7 @@ static int ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) 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(); } @@ -7812,8 +7779,7 @@ static int ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) 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; @@ -7823,8 +7789,7 @@ static int ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) 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); @@ -7848,8 +7813,7 @@ static int ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) 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); @@ -7876,8 +7840,7 @@ static int ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) 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)) { @@ -7887,8 +7850,7 @@ static int ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } 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) { @@ -19753,8 +19715,7 @@ static int ZEND_JMPZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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(); @@ -19770,8 +19731,7 @@ static int ZEND_JMPNZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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(); @@ -19787,14 +19747,12 @@ static int ZEND_JMPZNZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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]); } } @@ -19810,8 +19768,7 @@ static int ZEND_JMPZ_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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(); } @@ -19828,8 +19785,7 @@ static int ZEND_JMPNZ_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) #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(); } @@ -20383,8 +20339,7 @@ static int ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } 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); @@ -20482,8 +20437,7 @@ static int ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } 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(); } -- 2.50.1