Replace var is introduced
authorXinchen Hui <laruence@php.net>
Tue, 17 Feb 2015 13:16:37 +0000 (21:16 +0800)
committerXinchen Hui <laruence@php.net>
Tue, 17 Feb 2015 13:16:37 +0000 (21:16 +0800)
ext/opcache/Optimizer/zend_optimizer.c
ext/opcache/tests/bug69038.phpt

index bd1bf44006edd8ac1b75908ad21666b251109f47..588aab97c5c5cb3304b096bc0443926f53d0198b 100644 (file)
@@ -331,6 +331,41 @@ static int replace_var_by_const(zend_op_array *op_array,
                                        }
                                        opline->opcode = ZEND_SEND_VAL;
                                        break;
+                               case ZEND_CASE: {
+                                       zend_op *m, *n;
+                                       int brk = op_array->last_brk_cont;
+                                       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)) {
+                                                       break;
+                                               }
+                                       }
+                                       m = opline;
+                                       n = op_array->opcodes + op_array->brk_cont_array[brk].brk + 1;
+                                       while (m < n) {
+                                               if (ZEND_OP1_TYPE(m) == IS_VAR &&
+                                                               ZEND_OP1(m).var == var) {
+                                                       if (m->opcode == ZEND_CASE) {
+                                                               zval old_val;
+                                                               old_val = *val;
+                                                               zval_copy_ctor(val);
+                                                               update_op1_const(op_array, m, val TSRMLS_CC);
+                                                               *val = old_val;
+                                                       } else if (m->opcode == ZEND_SWITCH_FREE) {
+                                                               MAKE_NOP(m);
+                                                       } else {
+                                                               ZEND_ASSERT(0);
+                                                       }
+                                               }
+                                               m++;
+                                       }
+                                       zval_dtor(val);
+                                       return 1;
+                               }
+                               case ZEND_SWITCH_FREE:
+                                       MAKE_NOP(opline);
+                                       zval_dtor(val);
+                                       return 1;
                                default:
                                        break;
                        } 
index 9aeecfeeceb6c1c2332e83f4682b911275fa7159..f0c54913c528d2f4e69aeba3f7eb9bbc14801580 100644 (file)
@@ -39,7 +39,18 @@ function b($b = "bad") {
        return $b;
 }
 var_dump(b());
+
+function c($b = "bad") {
+       switch (extension_loaded("standard")) {
+       case 0 : return "LALALAL";
+       case 1 : return "okey";
+       default : return "bad";
+       }
+}
+var_dump(c());
+
 ?>
 --EXPECT--
 string(4) "okey"
 string(4) "okey"
+string(4) "okey"