]> granicus.if.org Git - php/commitdiff
Removed support for continue and break operators with non-constant operands
authorDmitry Stogov <dmitry@php.net>
Thu, 17 Nov 2005 08:27:25 +0000 (08:27 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 17 Nov 2005 08:27:25 +0000 (08:27 +0000)
NEWS
Zend/zend_compile.c
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/NEWS b/NEWS
index 9ee35291bd8bc63948ead217e59f3e648eaabec5..e56893789c0eee529b51e4ae47a06f4f30730de9 100644 (file)
--- 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()
index f1fbbba2dc2fe833debdc8389fc3f4f84ea37d86..030fc2168f85e114bf78b70d12746f4b1b579d99 100644 (file)
@@ -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;
index f7ae230b0ae3b23faab7bccba59aac62b85c1a36..3f26ba2d2d49f0a277971036e5c11d47c5c67c6f 100644 (file)
@@ -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) {
index b259566bd03d5f30b8fafbbb843988807d4ca1a0..30d10c848cbd4a6948a49f1c53437107e72bbb09 100644 (file)
@@ -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);
 }
 
index 79d0e6a54be26170bbddacea13c8dc6eb4f18896..3cd4b3ecc19b83677899920748a6d386942c2123 100644 (file)
@@ -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,