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:
@@ -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;
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user