]> granicus.if.org Git - php/commitdiff
Improve fix for #69038
authorXinchen Hui <laruence@php.net>
Wed, 25 Feb 2015 12:07:02 +0000 (20:07 +0800)
committerXinchen Hui <laruence@php.net>
Wed, 25 Feb 2015 12:07:02 +0000 (20:07 +0800)
ext/opcache/Optimizer/zend_optimizer.c
ext/opcache/tests/bug69038.phpt

index 7829ee7c95b770eef5e2620324020295ebaf8df6..6da3370ffe8f1cd8f92abddf2dda1a174ef59342 100644 (file)
@@ -290,15 +290,24 @@ static void replace_tmp_by_const(zend_op_array *op_array,
                         * and allows its reuse. The number of ZEND_CASE instructions
                         * usually terminated by ZEND_FREE that finally kills the value.
                         */
-                       if (opline->opcode == ZEND_CASE) {
+                       if (opline->opcode == ZEND_CASE || opline->opcode == ZEND_FREE) {
                                zend_op *m, *n;
                                int brk = op_array->last_brk_cont;
+                               zend_bool in_case = 0;
                                while (brk--) {
                                        if (op_array->brk_cont_array[brk].start <= (opline - op_array->opcodes) &&
                                                        op_array->brk_cont_array[brk].brk > (opline - op_array->opcodes)) {
+                                               in_case = 1;
                                                break;
                                        }
                                }
+
+                               if (!in_case) {
+                                       MAKE_NOP(opline);
+                                       zval_dtor(val);
+                                       break;
+                               }
+
                                m = opline;
                                n = op_array->opcodes + op_array->brk_cont_array[brk].brk + 1;
                                while (m < n) {
@@ -320,10 +329,6 @@ static void replace_tmp_by_const(zend_op_array *op_array,
                                }
                                zval_dtor(val);
                                break;
-                       } else if (opline->opcode == ZEND_FREE) {
-                               MAKE_NOP(opline);
-                               zval_dtor(val);
-                               break;
                        } else {                                
                                update_op1_const(op_array, opline, val TSRMLS_CC);
                                break;
index 9aeecfeeceb6c1c2332e83f4682b911275fa7159..bba3c33cb66ffd4d895f60e2c1e22da763cd52c3 100644 (file)
@@ -39,7 +39,17 @@ function b($b = "bad") {
        return $b;
 }
 var_dump(b());
+
+function c() {
+       switch (PHP_OS) {
+               default: return "bad";
+               case PHP_OS: return "okey";
+       }
+}
+
+var_dump(c());
 ?>
 --EXPECT--
 string(4) "okey"
 string(4) "okey"
+string(4) "okey"