]> granicus.if.org Git - php/commitdiff
This commit was manufactured by cvs2svn to create branch 'PHP_5_0'.
authorSVN Migration <svn@php.net>
Sun, 2 Jan 2005 06:51:05 +0000 (06:51 +0000)
committerSVN Migration <svn@php.net>
Sun, 2 Jan 2005 06:51:05 +0000 (06:51 +0000)
ext/standard/tests/array/bug29493.phpt [new file with mode: 0644]
ext/standard/tests/array/bug31213.phpt [new file with mode: 0644]

diff --git a/ext/standard/tests/array/bug29493.phpt b/ext/standard/tests/array/bug29493.phpt
new file mode 100644 (file)
index 0000000..0cfe459
--- /dev/null
@@ -0,0 +1,115 @@
+--TEST--
+Bug #29493 (extract(EXTR_REFS) fails if array has multiple referrals)
+--FILE--
+<?php
+function t1()
+{
+       $a = array('foo' => 'aaa');
+       // refcount($a) = 1
+       // refcount($a['foo']) = 1
+       $b = $a;
+       // refcount($a) = 2
+       // refcount($a['foo']) = 1
+       $b['foo'] = 'bbb';
+       // refcount($a) = 1
+       // refcount($a['foo']) = 1
+
+       var_dump($a, $b);
+
+       extract($a, EXTR_REFS);
+
+       $foo = 'noo';
+
+       var_dump($a, $b);
+}
+
+function t2()
+{
+       $a = array('foo' => 'aaa');
+       // refcount($a) = 1
+       // refcount($a['foo']) = 1
+       $b = &$a;
+       // refcount($a) = 2
+       // is_ref($a) = true
+       // refcount($a['foo']) = 1
+       $b['foo'] = 'bbb';
+       // refcount($a) = 2
+       // refcount($a['foo']) = 1
+
+       var_dump($a, $b);
+
+       extract($a, EXTR_REFS);
+
+       $foo = 'noo';
+
+       var_dump($a, $b);
+}
+
+function t3()
+{
+       $a = array('foo' => 'aaa');
+       // refcount($a) = 1
+       // refcount($a['foo']) = 1
+       $b = &$a;
+       // refcount($a) = 2
+       // is_ref($a) = true
+       // refcount($a['foo']) = 1
+       unset($b);
+       // refcount($a) = 1
+       // is_ref($a) = true
+       // refcount($a['foo']) = 1
+
+       var_dump($a);
+
+       extract($a, EXTR_REFS);
+
+       $foo = 'noo';
+
+       var_dump($a);
+}
+
+t1();
+t2();
+t3();
+?>
+--EXPECT--
+array(1) {
+  ["foo"]=>
+  string(3) "aaa"
+}
+array(1) {
+  ["foo"]=>
+  string(3) "bbb"
+}
+array(1) {
+  ["foo"]=>
+  &string(3) "noo"
+}
+array(1) {
+  ["foo"]=>
+  string(3) "bbb"
+}
+array(1) {
+  ["foo"]=>
+  string(3) "bbb"
+}
+array(1) {
+  ["foo"]=>
+  string(3) "bbb"
+}
+array(1) {
+  ["foo"]=>
+  &string(3) "noo"
+}
+array(1) {
+  ["foo"]=>
+  &string(3) "noo"
+}
+array(1) {
+  ["foo"]=>
+  string(3) "aaa"
+}
+array(1) {
+  ["foo"]=>
+  &string(3) "noo"
+}
diff --git a/ext/standard/tests/array/bug31213.phpt b/ext/standard/tests/array/bug31213.phpt
new file mode 100644 (file)
index 0000000..55ad881
--- /dev/null
@@ -0,0 +1,55 @@
+--TEST--
+Bug #31213 (Sideeffects caused by bug #29493)
+--FILE--
+<?php
+function test($use_extract) {
+       $a = 1;
+       $b = 1;
+
+       $arr = array(
+               '_a' => $a,
+               '_b' => &$b
+       );
+
+       var_dump($a, $b);
+
+       if ($use_extract) {
+               extract($arr, EXTR_REFS);
+       } else {
+               $_a = &$arr['_a'];
+               $_b = &$arr['_b'];
+       }
+
+       $_a++;
+       $_b++;
+
+       var_dump($a, $b, $_a, $_b, $arr);
+}
+
+test(false);
+test(true);
+--EXPECT--
+int(1)
+int(1)
+int(1)
+int(2)
+int(2)
+int(2)
+array(2) {
+  ["_a"]=>
+  &int(2)
+  ["_b"]=>
+  &int(2)
+}
+int(1)
+int(1)
+int(1)
+int(2)
+int(2)
+int(2)
+array(2) {
+  ["_a"]=>
+  &int(2)
+  ["_b"]=>
+  &int(2)
+}