mirror of
https://github.com/php/php-src.git
synced 2025-08-19 08:49:28 +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.
|
* usually terminated by ZEND_FREE that finally kills the value.
|
||||||
*/
|
*/
|
||||||
if (opline->opcode == ZEND_CASE) {
|
if (opline->opcode == ZEND_CASE) {
|
||||||
zval old_val;
|
zend_op *m, *n;
|
||||||
old_val = *val;
|
int brk = op_array->last_brk_cont;
|
||||||
zval_copy_ctor(val);
|
while (brk--) {
|
||||||
update_op1_const(op_array, opline, val TSRMLS_CC);
|
if (op_array->brk_cont_array[brk].start <= (opline - op_array->opcodes) &&
|
||||||
*val = old_val;
|
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) {
|
} else if (opline->opcode == ZEND_FREE) {
|
||||||
MAKE_NOP(opline);
|
MAKE_NOP(opline);
|
||||||
|
zval_dtor(val);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
update_op1_const(op_array, opline, val TSRMLS_CC);
|
update_op1_const(op_array, opline, val TSRMLS_CC);
|
||||||
val = NULL;
|
|
||||||
break;
|
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);
|
update_op2_const(op_array, opline, val TSRMLS_CC);
|
||||||
/* TMP_VAR may be used only once */
|
/* TMP_VAR may be used only once */
|
||||||
val = NULL;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
opline++;
|
opline++;
|
||||||
}
|
}
|
||||||
if (val) {
|
|
||||||
zval_dtor(val);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "Optimizer/nop_removal.c"
|
#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