Pierre Joye wrote:
Hi Dmitry,

From a BC point of view, the impact will be minimal. The only project
I found relying on this syntax is XPath  class [1].

I'm wondered why they use it, because their var ($parseBlock) is always 1.


Please add a note the upgrade guide as well in trunk, maybe in a BC
break sections.

done.

Thanks. Dmitry.

[1] http://google.com/codesearch?hl=en&sa=N&q=lang:php+break\s{1,}%28\%24\w%29

Cheers,

On Wed, Nov 24, 2010 at 1:11 PM, Dmitry Stogov <dmi...@zend.com> wrote:
the proposed patch (backport from php6) is attached.
I think this feature is completely useless and it was agreed to remove it
about 5 years ago.

Derick, can I commit the patch today?

Thanks. Dmitry.

Dmitry Stogov wrote:
Hi,

Previously we decided to remove "break/continue $var" syntax.
I even implemented it in PHP6 brunch, however it wasn't backported into
 trunk. Could I do it?

Thanks. Dmitry.

Index: Zend/zend_execute.c
===================================================================
--- Zend/zend_execute.c (revision 305710)
+++ Zend/zend_execute.c (working copy)
@@ -1362,21 +1362,12 @@
       }
 }

-static inline zend_brk_cont_element* zend_brk_cont(zval *nest_levels_zval,
int array_offset, const zend_op_array *op_array, const temp_variable *Ts
TSRMLS_DC)
+static inline zend_brk_cont_element* zend_brk_cont(int nest_levels, int
array_offset, const zend_op_array *op_array, const temp_variable *Ts
TSRMLS_DC)
 {
       zval tmp;
-       int nest_levels, original_nest_levels;
+       int original_nest_levels = 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) {
                       zend_error_noreturn(E_ERROR, "Cannot break/continue
%d level%s", original_nest_levels, (original_nest_levels == 1) ? "" : "s");
Index: Zend/zend_vm_execute.h
===================================================================
--- Zend/zend_vm_execute.h      (revision 305710)
+++ Zend/zend_vm_execute.h      (working copy)
@@ -1304,11 +1304,10 @@
 static int ZEND_FASTCALL
 ZEND_BRK_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
       USE_OPLINE
-
       zend_brk_cont_element *el;

       SAVE_OPLINE();
-       el = zend_brk_cont(opline->op2.zv, opline->op1.opline_num,
+       el = zend_brk_cont(Z_LVAL_P(opline->op2.zv), opline->op1.opline_num,
                          EX(op_array), EX_Ts() TSRMLS_CC);

       ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
@@ -1317,11 +1316,10 @@
 static int ZEND_FASTCALL
 ZEND_CONT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
       USE_OPLINE
-
       zend_brk_cont_element *el;

       SAVE_OPLINE();
-       el = zend_brk_cont(opline->op2.zv, opline->op1.opline_num,
+       el = zend_brk_cont(Z_LVAL_P(opline->op2.zv), opline->op1.opline_num,
                          EX(op_array), EX_Ts() TSRMLS_CC);

       ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
@@ -1334,7 +1332,7 @@
       zend_brk_cont_element *el;

       SAVE_OPLINE();
-       el = zend_brk_cont(opline->op2.zv, opline->extended_value,
+       el = zend_brk_cont(Z_LVAL_P(opline->op2.zv), opline->extended_value,
                          EX(op_array), EX_Ts() TSRMLS_CC);

       brk_opline = EX(op_array)->opcodes + el->brk;
@@ -1477,32 +1475,6 @@
 }


-static int ZEND_FASTCALL
 ZEND_BRK_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
-       USE_OPLINE
-       zend_free_op free_op2;
-       zend_brk_cont_element *el;
-
-       SAVE_OPLINE();
-       el = zend_brk_cont(_get_zval_ptr_tmp(opline->op2.var, EX_Ts(),
&free_op2 TSRMLS_CC), opline->op1.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_FASTCALL
 ZEND_CONT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
-       USE_OPLINE
-       zend_free_op free_op2;
-       zend_brk_cont_element *el;
-
-       SAVE_OPLINE();
-       el = zend_brk_cont(_get_zval_ptr_tmp(opline->op2.var, EX_Ts(),
&free_op2 TSRMLS_CC), opline->op1.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_FASTCALL
 ZEND_FETCH_CLASS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
       USE_OPLINE
@@ -1599,32 +1571,6 @@
 }


-static int ZEND_FASTCALL
 ZEND_BRK_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
-       USE_OPLINE
-       zend_free_op free_op2;
-       zend_brk_cont_element *el;
-
-       SAVE_OPLINE();
-       el = zend_brk_cont(_get_zval_ptr_var(opline->op2.var, EX_Ts(),
&free_op2 TSRMLS_CC), opline->op1.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_FASTCALL
 ZEND_CONT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
-       USE_OPLINE
-       zend_free_op free_op2;
-       zend_brk_cont_element *el;
-
-       SAVE_OPLINE();
-       el = zend_brk_cont(_get_zval_ptr_var(opline->op2.var, EX_Ts(),
&free_op2 TSRMLS_CC), opline->op1.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_FASTCALL
 ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
       USE_OPLINE
@@ -1754,32 +1700,6 @@
 }


-static int ZEND_FASTCALL
 ZEND_BRK_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
-       USE_OPLINE
-
-       zend_brk_cont_element *el;
-
-       SAVE_OPLINE();
-       el = zend_brk_cont(_get_zval_ptr_cv_BP_VAR_R(EX_CVs(),
opline->op2.var TSRMLS_CC), opline->op1.opline_num,
-                          EX(op_array), EX_Ts() TSRMLS_CC);
-
-       ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
-}
-
-static int ZEND_FASTCALL
 ZEND_CONT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
-       USE_OPLINE
-
-       zend_brk_cont_element *el;
-
-       SAVE_OPLINE();
-       el = zend_brk_cont(_get_zval_ptr_cv_BP_VAR_R(EX_CVs(),
opline->op2.var TSRMLS_CC), opline->op1.opline_num,
-                          EX(op_array), EX_Ts() TSRMLS_CC);
-
-       ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
-}
-
 static int ZEND_FASTCALL
 ZEND_BW_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
       USE_OPLINE
@@ -36791,55 +36711,55 @@
       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,
Index: Zend/zend_compile.c
===================================================================
--- Zend/zend_compile.c (revision 305711)
+++ Zend/zend_compile.c (working copy)
@@ -4302,6 +4302,11 @@
       opline->op1.opline_num = CG(context).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");
+               }
               SET_NODE(opline->op2, expr);
       } else {
               LITERAL_LONG(opline->op2, 1);
Index: Zend/zend_vm_def.h
===================================================================
--- Zend/zend_vm_def.h  (revision 305710)
+++ Zend/zend_vm_def.h  (working copy)
@@ -3171,27 +3171,25 @@
       ZEND_VM_NEXT_OPCODE();
 }

-ZEND_VM_HANDLER(50, ZEND_BRK, ANY, CONST|TMP|VAR|CV)
+ZEND_VM_HANDLER(50, ZEND_BRK, ANY, CONST)
 {
       USE_OPLINE
-       zend_free_op free_op2;
       zend_brk_cont_element *el;

       SAVE_OPLINE();
-       el = zend_brk_cont(GET_OP2_ZVAL_PTR(BP_VAR_R),
opline->op1.opline_num,
+       el = zend_brk_cont(Z_LVAL_P(opline->op2.zv), opline->op1.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)
 {
       USE_OPLINE
-       zend_free_op free_op2;
       zend_brk_cont_element *el;

       SAVE_OPLINE();
-       el = zend_brk_cont(GET_OP2_ZVAL_PTR(BP_VAR_R),
opline->op1.opline_num,
+       el = zend_brk_cont(Z_LVAL_P(opline->op2.zv), opline->op1.opline_num,
                          EX(op_array), EX_Ts() TSRMLS_CC);
       FREE_OP2();
       ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
@@ -3204,7 +3202,7 @@
       zend_brk_cont_element *el;

       SAVE_OPLINE();
-       el = zend_brk_cont(opline->op2.zv, opline->extended_value,
+       el = zend_brk_cont(Z_LVAL_P(opline->op2.zv), opline->extended_value,
                          EX(op_array), EX_Ts() TSRMLS_CC);

       brk_opline = EX(op_array)->opcodes + el->brk;


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php




--
Pierre

@pierrejoye | http://blog.thepimp.net | http://www.libgd.org

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to