From: Xinchen Hui Date: Wed, 25 Feb 2015 12:07:02 +0000 (+0800) Subject: Improve fix for #69038 X-Git-Tag: php-5.5.23RC1~22 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d508ff9640469bf451b975d83fd2879710db0b46;p=php Improve fix for #69038 --- diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 7829ee7c95..6da3370ffe 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -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; diff --git a/ext/opcache/tests/bug69038.phpt b/ext/opcache/tests/bug69038.phpt index 9aeecfeece..bba3c33cb6 100644 --- a/ext/opcache/tests/bug69038.phpt +++ b/ext/opcache/tests/bug69038.phpt @@ -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"