Annotation of embedaddon/php/tests/lang/foreachLoop.010.phpt, revision 1.1
1.1 ! misho 1: --TEST--
! 2: This test illustrates the impact of invoking destructors when refcount is decremented to 0 on foreach.
! 3: It will pass only if the 'contentious code' in PHPValue.decReferences() is enabled.
! 4: --FILE--
! 5: <?php
! 6:
! 7: $a = array(1,2,3);
! 8: $container = array(&$a);
! 9:
! 10: // From php.net:
! 11: // "Unless the array is referenced, foreach operates on a copy of
! 12: // the specified array and not the array itself."
! 13: // At this point, the array $a is referenced.
! 14:
! 15: // The following line ensures $a is no longer references as a consequence
! 16: // of running the 'destructor' on $container.
! 17: $container = null;
! 18:
! 19: // At this point the array $a is no longer referenced, so foreach should operate on a copy of the array.
! 20: // However, P8 does not invoke 'destructors' when refcount is decremented to 0.
! 21: // Consequently, $a thinks it is still referenced, and foreach will operate on the array itself.
! 22: // This provokes a difference in behaviour when changing the number of elements in the array while
! 23: // iterating over it.
! 24:
! 25: $i=0;
! 26: foreach ($a as $v) {
! 27: array_push($a, 'new');
! 28: var_dump($v);
! 29:
! 30: if (++$i>10) {
! 31: echo "Infinite loop detected\n";
! 32: break;
! 33: }
! 34: }
! 35:
! 36: ?>
! 37: --EXPECTF--
! 38: int(1)
! 39: int(2)
! 40: int(3)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>