Skip to content

Commit 71b2f46

Browse files
committed
Merge branch 'PHP-8.1'
* PHP-8.1: Fix bug #81652
2 parents bc9d604 + 51ae5c5 commit 71b2f46

File tree

2 files changed

+33
-13
lines changed

2 files changed

+33
-13
lines changed

Zend/Optimizer/dfa_pass.c

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -345,19 +345,17 @@ static bool opline_supports_assign_contraction(
345345
return 1;
346346
}
347347

348-
static bool variable_redefined_in_range(zend_ssa *ssa, int var, int start, int end)
348+
static bool variable_defined_or_used_in_range(zend_ssa *ssa, int var, int start, int end)
349349
{
350350
while (start < end) {
351-
if (ssa->ops[start].op1_def >= 0
352-
&& ssa->vars[ssa->ops[start].op1_def].var == var) {
353-
return 1;
354-
}
355-
if (ssa->ops[start].op2_def >= 0
356-
&& ssa->vars[ssa->ops[start].op2_def].var == var) {
357-
return 1;
358-
}
359-
if (ssa->ops[start].result_def >= 0
360-
&& ssa->vars[ssa->ops[start].result_def].var == var) {
351+
const zend_ssa_op *ssa_op = &ssa->ops[start];
352+
if ((ssa_op->op1_def >= 0 && ssa->vars[ssa_op->op1_def].var == var) ||
353+
(ssa_op->op2_def >= 0 && ssa->vars[ssa_op->op2_def].var == var) ||
354+
(ssa_op->result_def >= 0 && ssa->vars[ssa_op->result_def].var == var) ||
355+
(ssa_op->op1_use >= 0 && ssa->vars[ssa_op->op1_use].var == var) ||
356+
(ssa_op->op2_use >= 0 && ssa->vars[ssa_op->op2_use].var == var) ||
357+
(ssa_op->result_use >= 0 && ssa->vars[ssa_op->result_use].var == var)
358+
) {
361359
return 1;
362360
}
363361
start++;
@@ -1331,7 +1329,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
13311329
&& opline_supports_assign_contraction(
13321330
ssa, &op_array->opcodes[ssa->vars[src_var].definition],
13331331
src_var, opline->result.var)
1334-
&& !variable_redefined_in_range(ssa, EX_VAR_TO_NUM(opline->result.var),
1332+
&& !variable_defined_or_used_in_range(ssa, EX_VAR_TO_NUM(opline->result.var),
13351333
ssa->vars[src_var].definition+1, op_1)
13361334
) {
13371335

@@ -1490,7 +1488,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
14901488
&& opline_supports_assign_contraction(
14911489
ssa, &op_array->opcodes[ssa->vars[src_var].definition],
14921490
src_var, opline->op1.var)
1493-
&& !variable_redefined_in_range(ssa, EX_VAR_TO_NUM(opline->op1.var),
1491+
&& !variable_defined_or_used_in_range(ssa, EX_VAR_TO_NUM(opline->op1.var),
14941492
ssa->vars[src_var].definition+1, op_1)
14951493
) {
14961494

Zend/tests/bug81652.phpt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
Bug #81652: The value of error_reporting() gets overridden
3+
--FILE--
4+
<?php
5+
6+
class Foo {
7+
public $a;
8+
9+
public function bar() {
10+
$this->a = true ? @random_int(0, 100) : false;
11+
}
12+
}
13+
14+
var_dump(error_reporting());
15+
$c = new Foo();
16+
$c->bar();
17+
var_dump(error_reporting());
18+
19+
?>
20+
--EXPECT--
21+
int(32767)
22+
int(32767)

0 commit comments

Comments
 (0)