]> granicus.if.org Git - php/commitdiff
Fix partial array handling in FE_RESET edge feasibility
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 21 May 2019 14:59:27 +0000 (16:59 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 21 May 2019 14:59:27 +0000 (16:59 +0200)
ext/opcache/Optimizer/sccp.c
ext/opcache/tests/bug78015.phpt

index 81c629b5b4a66925c3c03907717caecb30855813..22f835527b9f5ce1738ed22ece14b677a9e58f1a 100644 (file)
@@ -1909,7 +1909,10 @@ static void sccp_mark_feasible_successors(
                        break;
                case ZEND_FE_RESET_R:
                case ZEND_FE_RESET_RW:
-                       if (Z_TYPE_P(op1) != IS_ARRAY && !IS_PARTIAL_ARRAY(op1)) {
+                       /* A non-empty partial array is definitely non-empty, but an
+                        * empty partial array may be non-empty at runtime. */
+                       if (Z_TYPE_P(op1) != IS_ARRAY ||
+                                       (IS_PARTIAL_ARRAY(op1) && zend_hash_num_elements(Z_ARR_P(op1)) == 0)) {
                                scdf_mark_edge_feasible(scdf, block_num, block->successors[0]);
                                scdf_mark_edge_feasible(scdf, block_num, block->successors[1]);
                                return;
index e93c9ce9e41859314df824f5baa392f3d6e3c13e..a9feb82fb4c17e42dd019e1881a562bda1e6ebc2 100644 (file)
@@ -48,12 +48,23 @@ function test6() {
     return $d;
 }
 
+function test7() {
+    global $x;
+    $a = ['b' => [$x]];
+    $y = 1;
+    foreach ($a['b'] as $_) {
+        $y = 2;
+    }
+    return $y;
+}
+
 var_dump(test1());
 var_dump(test2());
 var_dump(test3());
 var_dump(test4());
 var_dump(test5());
 var_dump(test6());
+var_dump(test7());
 
 ?>
 --EXPECTF--
@@ -71,3 +82,4 @@ bool(true)
 
 Notice: Array to string conversion in %s on line %d
 string(11) "Arrayfoobar"
+int(2)