mirror of
https://github.com/php/php-src.git
synced 2025-08-18 23:18:56 +02:00
Merge branch 'PHP-5.5' into PHP-5.6
This commit is contained in:
commit
1c0fa36c61
2 changed files with 75 additions and 10 deletions
|
@ -374,17 +374,41 @@ static void replace_tmp_by_const(zend_op_array *op_array,
|
|||
* usually terminated by ZEND_FREE that finally kills the value.
|
||||
*/
|
||||
if (opline->opcode == ZEND_CASE) {
|
||||
zval old_val;
|
||||
old_val = *val;
|
||||
zval_copy_ctor(val);
|
||||
update_op1_const(op_array, opline, val TSRMLS_CC);
|
||||
*val = old_val;
|
||||
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_TMP_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_FREE) {
|
||||
MAKE_NOP(m);
|
||||
} else {
|
||||
ZEND_ASSERT(0);
|
||||
}
|
||||
}
|
||||
m++;
|
||||
}
|
||||
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);
|
||||
val = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -394,14 +418,10 @@ static void replace_tmp_by_const(zend_op_array *op_array,
|
|||
|
||||
update_op2_const(op_array, opline, val TSRMLS_CC);
|
||||
/* TMP_VAR may be used only once */
|
||||
val = NULL;
|
||||
break;
|
||||
}
|
||||
opline++;
|
||||
}
|
||||
if (val) {
|
||||
zval_dtor(val);
|
||||
}
|
||||
}
|
||||
|
||||
#include "Optimizer/nop_removal.c"
|
||||
|
|
45
ext/opcache/tests/bug69038.phpt
Normal file
45
ext/opcache/tests/bug69038.phpt
Normal file
|
@ -0,0 +1,45 @@
|
|||
--TEST--
|
||||
Bug #69038 (switch(SOMECONSTANT) misbehaves)
|
||||
--INI--
|
||||
opcache.enable=1
|
||||
opcache.enable_cli=1
|
||||
opcache.optimization_level=-1
|
||||
--SKIPIF--
|
||||
<?php require_once('skipif.inc'); ?>
|
||||
--FILE--
|
||||
<?php
|
||||
function a($a = "bad") {
|
||||
|
||||
switch (PHP_OS) {
|
||||
case "LALALALA" : return "LALALAL";
|
||||
case PHP_OS: return "okey";
|
||||
default: break;
|
||||
}
|
||||
|
||||
return $a;
|
||||
}
|
||||
|
||||
var_dump(a());
|
||||
|
||||
|
||||
function b($b = "bad") {
|
||||
switch (PHP_OS) {
|
||||
case "LALALAL": return "bad";
|
||||
case PHP_OS:
|
||||
switch (PHP_OS) {
|
||||
case "FOO": break;
|
||||
case PHP_OS: return "okey";
|
||||
default :
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return $b;
|
||||
}
|
||||
var_dump(b());
|
||||
?>
|
||||
--EXPECT--
|
||||
string(4) "okey"
|
||||
string(4) "okey"
|
Loading…
Add table
Add a link
Reference in a new issue