1
0
mirror of https://github.com/php/php-src.git synced 2026-04-05 07:02:33 +02:00

Merge branch 'PHP-8.1'

* PHP-8.1:
  Fix bug #81652
This commit is contained in:
Nikita Popov
2021-11-24 15:20:38 +01:00
2 changed files with 33 additions and 13 deletions

View File

@@ -345,19 +345,17 @@ static bool opline_supports_assign_contraction(
return 1;
}
static bool variable_redefined_in_range(zend_ssa *ssa, int var, int start, int end)
static bool variable_defined_or_used_in_range(zend_ssa *ssa, int var, int start, int end)
{
while (start < end) {
if (ssa->ops[start].op1_def >= 0
&& ssa->vars[ssa->ops[start].op1_def].var == var) {
return 1;
}
if (ssa->ops[start].op2_def >= 0
&& ssa->vars[ssa->ops[start].op2_def].var == var) {
return 1;
}
if (ssa->ops[start].result_def >= 0
&& ssa->vars[ssa->ops[start].result_def].var == var) {
const zend_ssa_op *ssa_op = &ssa->ops[start];
if ((ssa_op->op1_def >= 0 && ssa->vars[ssa_op->op1_def].var == var) ||
(ssa_op->op2_def >= 0 && ssa->vars[ssa_op->op2_def].var == var) ||
(ssa_op->result_def >= 0 && ssa->vars[ssa_op->result_def].var == var) ||
(ssa_op->op1_use >= 0 && ssa->vars[ssa_op->op1_use].var == var) ||
(ssa_op->op2_use >= 0 && ssa->vars[ssa_op->op2_use].var == var) ||
(ssa_op->result_use >= 0 && ssa->vars[ssa_op->result_use].var == var)
) {
return 1;
}
start++;
@@ -1331,7 +1329,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
&& opline_supports_assign_contraction(
ssa, &op_array->opcodes[ssa->vars[src_var].definition],
src_var, opline->result.var)
&& !variable_redefined_in_range(ssa, EX_VAR_TO_NUM(opline->result.var),
&& !variable_defined_or_used_in_range(ssa, EX_VAR_TO_NUM(opline->result.var),
ssa->vars[src_var].definition+1, op_1)
) {
@@ -1490,7 +1488,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
&& opline_supports_assign_contraction(
ssa, &op_array->opcodes[ssa->vars[src_var].definition],
src_var, opline->op1.var)
&& !variable_redefined_in_range(ssa, EX_VAR_TO_NUM(opline->op1.var),
&& !variable_defined_or_used_in_range(ssa, EX_VAR_TO_NUM(opline->op1.var),
ssa->vars[src_var].definition+1, op_1)
) {

22
Zend/tests/bug81652.phpt Normal file
View File

@@ -0,0 +1,22 @@
--TEST--
Bug #81652: The value of error_reporting() gets overridden
--FILE--
<?php
class Foo {
public $a;
public function bar() {
$this->a = true ? @random_int(0, 100) : false;
}
}
var_dump(error_reporting());
$c = new Foo();
$c->bar();
var_dump(error_reporting());
?>
--EXPECT--
int(32767)
int(32767)