mirror of
https://github.com/php/php-src.git
synced 2026-04-05 07:02:33 +02:00
@@ -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
22
Zend/tests/bug81652.phpt
Normal 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)
|
||||
Reference in New Issue
Block a user