1
0
mirror of https://github.com/php/php-src.git synced 2026-03-26 09:12:14 +01:00

Improve fix for #69038

This commit is contained in:
Xinchen Hui
2015-02-25 20:07:02 +08:00
parent ffdc5728c8
commit d508ff9640
2 changed files with 20 additions and 5 deletions

View 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;

View 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"