From: Dmitry Stogov Date: Thu, 17 Nov 2005 08:27:25 +0000 (+0000) Subject: Removed support for continue and break operators with non-constant operands X-Git-Tag: RELEASE_0_9_3~24 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=97190ee606d7cf695550a840ed2686bc7df25970;p=php Removed support for continue and break operators with non-constant operands --- diff --git a/NEWS b/NEWS index 9ee35291bd..e56893789c 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,8 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 6.0 - Unicode support. (Andrei, Dmitry, et al) +- Removed support for continue and break operators with non-constant operands. + (Dmitry) - Changed __toString() behavior to call it in all necessary places (Marcus, Dmitry) - Changed "instanceof" and "catch" operators, is_a() and is_subclass_of() diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index f1fbbba2dc..030fc2168f 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2636,6 +2636,11 @@ void zend_do_brk_cont(zend_uchar op, znode *expr TSRMLS_DC) opline->op1.u.opline_num = CG(active_op_array)->current_brk_cont; SET_UNUSED(opline->op1); if (expr) { + if (expr->op_type != IS_CONST) { + zend_error(E_COMPILE_ERROR, "'%s' operator with non-constant operand is no longer supported", op == ZEND_BRK ? "break" : "continue"); + } else if (Z_TYPE(expr->u.constant) != IS_LONG || Z_LVAL(expr->u.constant) < 1) { + zend_error(E_COMPILE_ERROR, "'%s' operator accepts only positive numbers", op == ZEND_BRK ? "break" : "continue"); + } opline->op2 = *expr; } else { opline->op2.u.constant.type = IS_LONG; diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index f7ae230b0a..3f26ba2d2d 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1386,20 +1386,11 @@ static void zend_fetch_property_address(temp_variable *result, zval **container_ } } -static inline zend_brk_cont_element* zend_brk_cont(zval *nest_levels_zval, int array_offset, zend_op_array *op_array, temp_variable *Ts TSRMLS_DC) +static inline zend_brk_cont_element* zend_brk_cont(int nest_levels, int array_offset, zend_op_array *op_array, temp_variable *Ts TSRMLS_DC) { - zval tmp; - int nest_levels, original_nest_levels; + int original_nest_levels; zend_brk_cont_element *jmp_to; - if (nest_levels_zval->type != IS_LONG) { - tmp = *nest_levels_zval; - zval_copy_ctor(&tmp); - convert_to_long(&tmp); - nest_levels = tmp.value.lval; - } else { - nest_levels = nest_levels_zval->value.lval; - } original_nest_levels = nest_levels; do { if (array_offset==-1) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b259566bd0..30d10c848c 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2362,27 +2362,23 @@ ZEND_VM_HANDLER(52, ZEND_BOOL, CONST|TMP|VAR|CV, ANY) ZEND_VM_NEXT_OPCODE(); } -ZEND_VM_HANDLER(50, ZEND_BRK, ANY, CONST|TMP|VAR|CV) +ZEND_VM_HANDLER(50, ZEND_BRK, ANY, CONST) { zend_op *opline = EX(opline); - zend_free_op free_op2; zend_brk_cont_element *el; - el = zend_brk_cont(GET_OP2_ZVAL_PTR(BP_VAR_R), opline->op1.u.opline_num, + el = zend_brk_cont(Z_LVAL(opline->op2.u.constant), opline->op1.u.opline_num, EX(op_array), EX(Ts) TSRMLS_CC); - FREE_OP2(); ZEND_VM_JMP(EX(op_array)->opcodes + el->brk); } -ZEND_VM_HANDLER(51, ZEND_CONT, ANY, CONST|TMP|VAR|CV) +ZEND_VM_HANDLER(51, ZEND_CONT, ANY, CONST) { zend_op *opline = EX(opline); - zend_free_op free_op2; zend_brk_cont_element *el; - el = zend_brk_cont(GET_OP2_ZVAL_PTR(BP_VAR_R), opline->op1.u.opline_num, + el = zend_brk_cont(Z_LVAL(opline->op2.u.constant), opline->op1.u.opline_num, EX(op_array), EX(Ts) TSRMLS_CC); - FREE_OP2(); ZEND_VM_JMP(EX(op_array)->opcodes + el->cont); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 79d0e6a54b..3cd4b3ecc1 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -771,24 +771,20 @@ static int ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) static int ZEND_BRK_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); - zend_brk_cont_element *el; - el = zend_brk_cont(&opline->op2.u.constant, opline->op1.u.opline_num, + el = zend_brk_cont(Z_LVAL(opline->op2.u.constant), opline->op1.u.opline_num, EX(op_array), EX(Ts) TSRMLS_CC); - 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; - el = zend_brk_cont(&opline->op2.u.constant, opline->op1.u.opline_num, + el = zend_brk_cont(Z_LVAL(opline->op2.u.constant), opline->op1.u.opline_num, EX(op_array), EX(Ts) TSRMLS_CC); - ZEND_VM_JMP(EX(op_array)->opcodes + el->cont); } @@ -916,30 +912,6 @@ static int ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } -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; - - 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_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; - - 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_JMP(EX(op_array)->opcodes + el->cont); -} - static int ZEND_FETCH_CLASS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); @@ -1064,30 +1036,6 @@ static int ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } -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; - - 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_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; - - 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_JMP(EX(op_array)->opcodes + el->cont); -} - static int ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); @@ -1292,30 +1240,6 @@ static int ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } -static int ZEND_BRK_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - zend_op *opline = EX(opline); - - zend_brk_cont_element *el; - - 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_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; - - 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_JMP(EX(op_array)->opcodes + el->cont); -} - static int ZEND_BW_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zend_op *opline = EX(opline); @@ -28239,55 +28163,55 @@ void zend_init_opcodes_handlers() ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_BRK_SPEC_CONST_HANDLER, - ZEND_BRK_SPEC_TMP_HANDLER, - ZEND_BRK_SPEC_VAR_HANDLER, ZEND_NULL_HANDLER, - ZEND_BRK_SPEC_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_BRK_SPEC_CONST_HANDLER, - ZEND_BRK_SPEC_TMP_HANDLER, - ZEND_BRK_SPEC_VAR_HANDLER, ZEND_NULL_HANDLER, - ZEND_BRK_SPEC_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_BRK_SPEC_CONST_HANDLER, - ZEND_BRK_SPEC_TMP_HANDLER, - ZEND_BRK_SPEC_VAR_HANDLER, ZEND_NULL_HANDLER, - ZEND_BRK_SPEC_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_BRK_SPEC_CONST_HANDLER, - ZEND_BRK_SPEC_TMP_HANDLER, - ZEND_BRK_SPEC_VAR_HANDLER, ZEND_NULL_HANDLER, - ZEND_BRK_SPEC_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_BRK_SPEC_CONST_HANDLER, - ZEND_BRK_SPEC_TMP_HANDLER, - ZEND_BRK_SPEC_VAR_HANDLER, ZEND_NULL_HANDLER, - ZEND_BRK_SPEC_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_CONT_SPEC_CONST_HANDLER, - ZEND_CONT_SPEC_TMP_HANDLER, - ZEND_CONT_SPEC_VAR_HANDLER, ZEND_NULL_HANDLER, - ZEND_CONT_SPEC_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_CONT_SPEC_CONST_HANDLER, - ZEND_CONT_SPEC_TMP_HANDLER, - ZEND_CONT_SPEC_VAR_HANDLER, ZEND_NULL_HANDLER, - ZEND_CONT_SPEC_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_CONT_SPEC_CONST_HANDLER, - ZEND_CONT_SPEC_TMP_HANDLER, - ZEND_CONT_SPEC_VAR_HANDLER, ZEND_NULL_HANDLER, - ZEND_CONT_SPEC_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_CONT_SPEC_CONST_HANDLER, - ZEND_CONT_SPEC_TMP_HANDLER, - ZEND_CONT_SPEC_VAR_HANDLER, ZEND_NULL_HANDLER, - ZEND_CONT_SPEC_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_CONT_SPEC_CONST_HANDLER, - ZEND_CONT_SPEC_TMP_HANDLER, - ZEND_CONT_SPEC_VAR_HANDLER, ZEND_NULL_HANDLER, - ZEND_CONT_SPEC_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_BOOL_SPEC_CONST_HANDLER, ZEND_BOOL_SPEC_CONST_HANDLER, ZEND_BOOL_SPEC_CONST_HANDLER,