]> granicus.if.org Git - php/commitdiff
Fixed bug #77951
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 9 May 2019 10:02:16 +0000 (12:02 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 9 May 2019 10:02:16 +0000 (12:02 +0200)
Treat singleton references as non-references in ReflectionReference
and return null for them.

ext/reflection/php_reflection.c
ext/reflection/tests/ReflectionReference.phpt

index 31c9fcc51b573da4d254c976393a3d09a04d0a32..da459e60be0204cc5f4ce13b529927108c80c5f7 100644 (file)
@@ -6176,7 +6176,8 @@ ZEND_METHOD(reflection_reference, fromArrayElement)
                return;
        }
 
-       if (Z_TYPE_P(item) != IS_REFERENCE) {
+       /* Treat singleton reference as non-reference. */
+       if (Z_TYPE_P(item) != IS_REFERENCE || Z_REFCOUNT_P(item) == 1) {
                RETURN_NULL();
        }
 
index 76d2512123602fbdfd4aa8a4a4cfbdd2e2ce631a..2963c3023284d5edf7b3b08d8de810fb4577b069 100644 (file)
@@ -3,39 +3,42 @@ Basic ReflectionReference functionality
 --FILE--
 <?php
 
-$ary = [0, 1, 2];
+$ary = [0, 1, 2, 3];
 $ref1 =& $ary[1];
 unset($ref1);
 $ref2 =& $ary[2];
+$ref3 =& $ary[3];
 
 echo "fromArrayElement():\n";
 $r0 = ReflectionReference::fromArrayElement($ary, 0);
 var_dump($r0 === null);
 $r1 = ReflectionReference::fromArrayElement($ary, 1);
-var_dump($r1 instanceof ReflectionReference);
+var_dump($r1 === null);
 $r2 = ReflectionReference::fromArrayElement($ary, 2);
 var_dump($r2 instanceof ReflectionReference);
+$r3 = ReflectionReference::fromArrayElement($ary, 3);
+var_dump($r2 instanceof ReflectionReference);
 
 echo "getId() #1:\n";
-var_dump($r1->getId() === $r1->getId());
 var_dump($r2->getId() === $r2->getId());
-var_dump($r1->getId() !== $r2->getId());
+var_dump($r3->getId() === $r3->getId());
+var_dump($r2->getId() !== $r3->getId());
 
 echo "getId() #2:\n";
-$ary2 = [&$ary[1], &$ref2];
-$r1_2 = ReflectionReference::fromArrayElement($ary2, 0);
-$r2_2 = ReflectionReference::fromArrayElement($ary2, 1);
-var_dump($r1->getId() === $r1_2->getId());
+$ary2 = [&$ary[2], &$ref3];
+$r2_2 = ReflectionReference::fromArrayElement($ary2, 0);
+$r3_2 = ReflectionReference::fromArrayElement($ary2, 1);
 var_dump($r2->getId() === $r2_2->getId());
+var_dump($r3->getId() === $r3_2->getId());
 
 echo "getId() #3:\n";
-$r1_id = $r1->getId();
 $r2_id = $r2->getId();
-unset($r0, $r1, $r2, $r1_2, $r2_2);
-$r1 = ReflectionReference::fromArrayElement($ary, 1);
+$r3_id = $r3->getId();
+unset($r0, $r1, $r2, $r3, $r2_2, $r3_2);
 $r2 = ReflectionReference::fromArrayElement($ary, 2);
-var_dump($r1_id === $r1->getId());
+$r3 = ReflectionReference::fromArrayElement($ary, 3);
 var_dump($r2_id === $r2->getId());
+var_dump($r3_id === $r3->getId());
 
 ?>
 --EXPECT--
@@ -43,6 +46,7 @@ fromArrayElement():
 bool(true)
 bool(true)
 bool(true)
+bool(true)
 getId() #1:
 bool(true)
 bool(true)