1
0
mirror of https://github.com/php/php-src.git synced 2026-03-28 10:12:18 +01:00

Merge branch 'PHP-7.0' into PHP-7.1

* PHP-7.0:
  Fixed bug #74019 (Segfault with list)
This commit is contained in:
Xinchen Hui
2017-02-10 14:24:44 +08:00
2 changed files with 44 additions and 4 deletions

View File

@@ -451,12 +451,27 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
break;
/* In most cases IS_TMP_VAR operand may be used only once.
* The operands are usually destroyed by the opcode handler.
* ZEND_CASE is an exception, that keeps operand unchanged,
* and allows its reuse. The number of ZEND_CASE instructions
* ZEND_CASE and ZEND_FETCH_LIST are exceptions, they keeps operand
* unchanged, and allows its reuse. these instructions
* usually terminated by ZEND_FREE that finally kills the value.
*/
case ZEND_FREE:
case ZEND_CASE: {
case ZEND_FETCH_LIST: {
zend_op *m = opline;
do {
if (m->opcode == ZEND_FETCH_LIST &&
ZEND_OP1_TYPE(m) == type &&
ZEND_OP1(m).var == var) {
zend_optimizer_update_op1_const(op_array, m, val);
}
m++;
} while (m->opcode != ZEND_FREE || ZEND_OP1_TYPE(m) != type || ZEND_OP1(m).var != var);
ZEND_ASSERT(m->opcode == ZEND_FREE && ZEND_OP1_TYPE(m) == type && ZEND_OP1(m).var == var);
MAKE_NOP(m);
zend_optimizer_remove_live_range(op_array, var);
return 1;
}
case ZEND_CASE:
case ZEND_FREE: {
zend_op *m, *n;
int brk = op_array->last_live_range;
zend_bool in_switch = 0;

View File

@@ -0,0 +1,25 @@
--TEST--
Bug #74019 (Segfault with list)
--INI--
opcache.enable=1
opcache.enable_cli=1
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
class A {
public function seg() {
list($a, $b) = A::CONSTS;
var_dump($a, $b);
return;
}
const CONSTS = [1, 2];
}
$a = new A;
$a->seg();
?>
--EXPECT--
int(1)
int(2)