diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2018-04-27 22:24:36 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2018-04-27 22:24:36 +0200 |
commit | aeb734910ae396d87989005edcc956e8fcb4253c (patch) | |
tree | 5edb973304258674954184f21ab62ff5dfc629e4 | |
parent | 1c887eaf0d07297952b77fd1bd65e80b4b16d7aa (diff) | |
parent | 4c083e7a66525ef662f1ae211cafb09752832342 (diff) | |
download | php-git-aeb734910ae396d87989005edcc956e8fcb4253c.tar.gz |
Merge branch 'PHP-7.2'
-rw-r--r-- | ext/opcache/Optimizer/dfa_pass.c | 7 | ||||
-rw-r--r-- | ext/opcache/tests/bug76281.phpt | 28 |
2 files changed, 32 insertions, 3 deletions
diff --git a/ext/opcache/Optimizer/dfa_pass.c b/ext/opcache/Optimizer/dfa_pass.c index 1f62b9ec93..07cff986df 100644 --- a/ext/opcache/Optimizer/dfa_pass.c +++ b/ext/opcache/Optimizer/dfa_pass.c @@ -174,12 +174,13 @@ static void zend_ssa_remove_nops(zend_op_array *op_array, zend_ssa *ssa, zend_op while (i < end) { shiftlist[i] = i - target; if (EXPECTED(op_array->opcodes[i].opcode != ZEND_NOP) || - /*keep NOP to support ZEND_VM_SMART_BRANCH */ - (i > 0 && + /* Keep NOP to support ZEND_VM_SMART_BRANCH. Using "target-1" instead of + * "i-1" here to check the last non-NOP instruction. */ + (target > 0 && i + 1 < op_array->last && (op_array->opcodes[i+1].opcode == ZEND_JMPZ || op_array->opcodes[i+1].opcode == ZEND_JMPNZ) && - zend_is_smart_branch(op_array->opcodes + i - 1))) { + zend_is_smart_branch(op_array->opcodes + target - 1))) { if (i != target) { op_array->opcodes[target] = op_array->opcodes[i]; ssa->ops[target] = ssa->ops[i]; diff --git a/ext/opcache/tests/bug76281.phpt b/ext/opcache/tests/bug76281.phpt new file mode 100644 index 0000000000..83c42f3a28 --- /dev/null +++ b/ext/opcache/tests/bug76281.phpt @@ -0,0 +1,28 @@ +--TEST-- +Bug #76281: Opcache causes incorrect "undefined variable" errors +--FILE-- +<?php + +function test($r, $action) { + $user_sub_resource = in_array($action, array('get_securityquestions', 'get_status', 'get_groupstats')); + + $user_id = null; + if ($user_sub_resource && isset($r['user_id'])) { + $user_id = $r['user_id']; + } + else if (isset($r['id'])) { + $user_id = $r['id']; + } + + if ($user_sub_resource) { + return 'foo'; + } + + return 'bar'; +} + +var_dump(test(['user_id' => 1, 'id' => 2], 'foo')); + +?> +--EXPECT-- +string(3) "bar" |