Skip to content

Commit 51ae5c5

Browse files
committed
Merge branch 'PHP-8.0' into PHP-8.1
* PHP-8.0: Fix bug #81652
2 parents ef2fd0e + be271f2 commit 51ae5c5

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
@@ -370,19 +370,17 @@ static bool opline_supports_assign_contraction(
370370
return 1;
371371
}
372372

373-
static bool variable_redefined_in_range(zend_ssa *ssa, int var, int start, int end)
373+
static bool variable_defined_or_used_in_range(zend_ssa *ssa, int var, int start, int end)
374374
{
375375
while (start < end) {
376-
if (ssa->ops[start].op1_def >= 0
377-
&& ssa->vars[ssa->ops[start].op1_def].var == var) {
378-
return 1;
379-
}
380-
if (ssa->ops[start].op2_def >= 0
381-
&& ssa->vars[ssa->ops[start].op2_def].var == var) {
382-
return 1;
383-
}
384-
if (ssa->ops[start].result_def >= 0
385-
&& ssa->vars[ssa->ops[start].result_def].var == var) {
376+
const zend_ssa_op *ssa_op = &ssa->ops[start];
377+
if ((ssa_op->op1_def >= 0 && ssa->vars[ssa_op->op1_def].var == var) ||
378+
(ssa_op->op2_def >= 0 && ssa->vars[ssa_op->op2_def].var == var) ||
379+
(ssa_op->result_def >= 0 && ssa->vars[ssa_op->result_def].var == var) ||
380+
(ssa_op->op1_use >= 0 && ssa->vars[ssa_op->op1_use].var == var) ||
381+
(ssa_op->op2_use >= 0 && ssa->vars[ssa_op->op2_use].var == var) ||
382+
(ssa_op->result_use >= 0 && ssa->vars[ssa_op->result_use].var == var)
383+
) {
386384
return 1;
387385
}
388386
start++;
@@ -1357,7 +1355,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
13571355
&& opline_supports_assign_contraction(
13581356
ssa, &op_array->opcodes[ssa->vars[src_var].definition],
13591357
src_var, opline->result.var)
1360-
&& !variable_redefined_in_range(ssa, EX_VAR_TO_NUM(opline->result.var),
1358+
&& !variable_defined_or_used_in_range(ssa, EX_VAR_TO_NUM(opline->result.var),
13611359
ssa->vars[src_var].definition+1, op_1)
13621360
) {
13631361

@@ -1514,7 +1512,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
15141512
&& opline_supports_assign_contraction(
15151513
ssa, &op_array->opcodes[ssa->vars[src_var].definition],
15161514
src_var, opline->op1.var)
1517-
&& !variable_redefined_in_range(ssa, EX_VAR_TO_NUM(opline->op1.var),
1515+
&& !variable_defined_or_used_in_range(ssa, EX_VAR_TO_NUM(opline->op1.var),
15181516
ssa->vars[src_var].definition+1, op_1)
15191517
) {
15201518

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)