Annotation of embedaddon/php/tests/lang/foreachLoop.010.phpt, revision 1.1.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>